Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> putpixel() тормоз 
:(
    Опции темы
dima_mak
Дата 10.7.2004, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист любитель
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.5.2004

Репутация: нет
Всего: нет



Может кто то знает как написать функцию типа путпиксил, только побыстрее?

Паскальшикам на помощь:
Код

const
       SeqP = $3c4;    { Базовый номер порта }
                                       { контроллера синхронизации }
       SegA000=$a000;  { Сегмент видеопамяти }
       SegB000=$b000;  { Сегмент видеопамяти }

{Рисуем точку на экране с оптимизацией (2-й вариант)}
procedure PutPixel2(X, Y : word; Color : byte);assembler;
asm
mov dx,SeqP
mov cx,X
and cx,3
cmp cl,b
jz @l1
mov b,cl
mov ax,$100
shl ax,cl
add ax,2
out dx,ax  {устанавливаем маску}
@l1: mov ax,200
mul Y
mov bx,X
shr bx,2   {ax = X div 2}
add bx,ax  {bx - 16 младших битов смещения}
adc dx,dx  {если dx не равен 0, то используем сегмент SegB000}
mov ax,SegA000
jz @l2
mov ax,SegB000
@l2: mov es,ax
mov al,Color1
mov es:[bx],al
end;

Если можете переведите это в С.
PM MAIL   Вверх
Дрон
Дата 10.7.2004, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Так это ж всё на ассемблере hehe.gif

Цитата
const unsigned short SeqP = 0x3c4;
const unsigned short SegA000 = 0xa000;
const unsigned short SegB000 = 0xb000;

void PutPixel2(unsigned short x, unsigned short y, char byte)
{
   asm
   {
// всё тоже самое
   }
}

Код не проверял, так что может быть в чём-то и не прав.

Это сообщение отредактировал(а) Дрон - 10.7.2004, 19:42


--------------------
Да. Именно так.
PM   Вверх
dima_mak
Дата 10.7.2004, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист любитель
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.5.2004

Репутация: нет
Всего: нет



Я так и пробовал, но он говорит, что не знает что такое "b",$100 и ещё что то.
PM MAIL   Вверх
Дрон
Дата 10.7.2004, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Что такое "b" и я не знаю sad.gif
А вот $100 надо заменить на 0x100. Это шестнадцатеричные числа.


--------------------
Да. Именно так.
PM   Вверх
_hunter
Дата 11.7.2004, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



есть два варианта:
1. b -- bx / bl / bh
2. b -- внешняя переменная
( я склоняюсь к первому варианту ( скорее всего bl ) )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
cardinal
Дата 11.7.2004, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Цитата
Может кто то знает как написать функцию типа путпиксил, только побыстрее?

Ты неправильно к делу подходишь. Если тебе надо быстро обработать картинку, то делай это за раз! Смотри обсуждения этого тут:
http://forum.vingrad.ru/index.php?showtopi...341&hl=putpixel
и тут:
http://forum.vingrad.ru/index.php?showtopi...472&hl=putpixel


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
dima_mak
Дата 11.7.2004, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист любитель
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.5.2004

Репутация: нет
Всего: нет



Цитата

есть два варианта:
1. b -- bx / bl / bh
2. b -- внешняя переменная
( я склоняюсь к первому варианту ( скорее всего bl ) )


b это номер плоскости, к которой было последнее обращение:
Код

const b:byte = 255; {номер плоскости, к которой было последнее обращение}


исправил проблему с b, теперь он говорит, что не определён @lp1 и @lp2, не знаешь как это можно исправить?

Цитата

Ты неправильно к делу подходишь. Если тебе надо быстро обработать картинку, то делай это за раз! Смотри обсуждения этого тут:
http://forum.vingrad.ru/index.php?showtopi...341&hl=putpixel
и тут:
http://forum.vingrad.ru/index.php?showtopi...472&hl=putpixel


Пробовал вывести картинку с помощью putimage, но ничего не вышло. Ты не знаешь в каком порядке должны быть байты в получаемой картинке(putimage'ом)
PM MAIL   Вверх
cardinal
Дата 11.7.2004, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Цитата
теперь он говорит, что не определён @lp1 и @lp2, не знаешь как это можно исправить?

Где ты нашел @lp1? Там написано @l1 - это метка на которую ты будешь jump. Напиши вместо нее просто l1 (без @ то есть) и ошибки быть не должно.

Цитата
Пробовал вывести картинку с помощью putimage, но ничего не вышло. Ты не знаешь в каком порядке должны быть байты в получаемой картинке(putimage'ом)

Я говорил не про putimage, а про то, что картинку надо обрабатывать за раз, то есть не с putpixel'ем прыгая по строкам (тут быз mul не обойтись!*), а увеличивая значение указателя передвигаясь таким образом с одного pixel на след.

Ты с каким форматом файлов работаешь?

* потому что ты говоришь x и y координату pixel'я, соответственно на нее попадаешь сделав: ширина картинки * y + x. Так вот тебе надо от умножения (mul) избавиться, тогда будет быстрее.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
dima_mak
Дата 11.7.2004, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист любитель
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.5.2004

Репутация: нет
Всего: нет



Цитата(cardinal @ 11.7.2004, 14:54)
Цитата
теперь он говорит, что не определён @lp1 и @lp2, не знаешь как это можно исправить?

Где ты нашел @lp1? Там написано @l1 - это метка на которую ты будешь jump. Напиши вместо нее просто l1 (без @ то есть) и ошибки быть не должно.

Цитата
Пробовал вывести картинку с помощью putimage, но ничего не вышло. Ты не знаешь в каком порядке должны быть байты в получаемой картинке(putimage'ом)

Я говорил не про putimage, а про то, что картинку надо обрабатывать за раз, то есть не с putpixel'ем прыгая по строкам (тут быз mul не обойтись!*), а увеличивая значение указателя передвигаясь таким образом с одного pixel на след.

Ты с каким форматом файлов работаешь?

* потому что ты говоришь x и y координату pixel'я, соответственно на нее попадаешь сделав: ширина картинки * y + x. Так вот тебе надо от умножения (mul) избавиться, тогда будет быстрее.

пробовал и без "собачки", но он говорит тоже самое.


Я работаю с БМП форматом.
Я понятия не имею как прыгать по пикселям и я не совсем понял, что делать дальше. ты не мог бы дать пример?
Добавлено @ 16:22
Кстати в догонку....
Я нарисовал картинку и сделал, что бы при нажатии на стрелочки влево и вправо, картинка двигалась влево и вправо(зарисовываю старую картинку и рисую её на пару пикселей правее или левее) и при этом движении видно как картинка переривовывается(идет белая полоска снизу верх).
Может я был неправ и дело не в putpixel? Если так, то в чем и как это исправить?
PM MAIL   Вверх
cardinal
Дата 11.7.2004, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



Цитата
Если так, то в чем и как это исправить?

А ты картинку сначала обработай, а когда она уже готова говори "высветить на экран". Тогда перерисовки должно не видно быть
Цитата
Я понятия не имею как прыгать по пикселям и я не совсем понял, что делать дальше. ты не мог бы дать пример?

Про работу с форматом bmp посмотри вот тут:
http://forum.vingrad.ru/index.php?showtopic=17367
Как это в Си делать я уже тоже писал smile.gif. Вот тут:
http://forum.vingrad.ru/index.php?showtopi...726&hl=bmp&st=0


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
dima_mak
Дата 11.7.2004, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист любитель
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.5.2004

Репутация: нет
Всего: нет



Цитата(cardinal @ 11.7.2004, 17:50)
Цитата
Если так, то в чем и как это исправить?

А ты картинку сначала обработай, а когда она уже готова говори "высветить на экран". Тогда перерисовки должно не видно быть
Цитата
Я понятия не имею как прыгать по пикселям и я не совсем понял, что делать дальше. ты не мог бы дать пример?

Про работу с форматом bmp посмотри вот тут:
http://forum.vingrad.ru/index.php?showtopic=17367
Как это в Си делать я уже тоже писал smile.gif. Вот тут:
http://forum.vingrad.ru/index.php?showtopi...726&hl=bmp&st=0

У меня картинка итак обработаная хранится в массиве и я просто циклом её вывожу
PM MAIL   Вверх
dima_mak
Дата 11.7.2004, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист любитель
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.5.2004

Репутация: нет
Всего: нет



Цитата

Как это в Си делать я уже тоже писал . Вот тут:
http://forum.vingrad.ru/index.php?showtopi...726&hl=bmp&st=0

Там ничего путёвого я не нашел.
вот что я делаю:
Код

void load_bmp(char *file,BITMAP *b)
{
 FILE *fp;
 long index;
 word num_colors;
 long x;

 /* open the file */
 if ((fp = fopen(file,"rb")) == NULL)
 {
   printf("Error opening file %s.\n",file);
   exit(1);
 }

 /* check to see if it is a valid bitmap file */
 if (fgetc(fp)!='B' || fgetc(fp)!='M')
 {
   fclose(fp);
   printf("%s is not a bitmap file.\n",file);
   exit(1);
 }

 /* read in the width and height of the image, and the
    number of colors used; ignore the rest */
 fskip(fp,16);
 fread(&b->width, sizeof(word), 1, fp);
 fskip(fp,2);
 fread(&b->height,sizeof(word), 1, fp);
 fskip(fp,22);
 fread(&num_colors,sizeof(word), 1, fp);
 fskip(fp,6);
 b->rwidth=b->width;
 if(b->width%4!=0)
  b->width+=4-b->width%4;
 /* assume we are working with an 8-bit file */
 if (num_colors==0) num_colors=256;


 /* try to allocate memory */
 if ((b->data = (byte *) malloc((word)(b->width*b->height))) == NULL)
 {
   fclose(fp);
   printf("Error allocating memory for file %s.\n",file);
   exit(1);
 }

 /* Ignore the palette information for now.*/

 fskip(fp,num_colors*4);

 /* read the bitmap */
  for(x=(b->height*b->width);x>0;x--)
   b->data[x]=(byte)fgetc(fp);
 fclose(fp);
}

void draw_bitmap(BITMAP *bmp)
{
int i,j;
word bitmap_offset = 0;
for(j=bmp->starty;j<(bmp->height+bmp->starty);j++)
 {
   for(i=(bmp->width+bmp->startx);i>bmp->startx;i--,bitmap_offset++)
     putpixel(i,j,(bmp->data[bitmap_offset]));
 }
//putimage(bmp->startx,bmp->starty,bmp->data,0);
bmp->endx=bmp->startx+bmp->width;
bmp->endy=bmp->starty+bmp->height;

}

А в мэйне у меня вот так:
Код

 load_bmp("E:\\arkanoid\\Rocket.bmp",&bita);  
 while (button!=13)
  {
   if(button==77)
   {
    delete_bitmap(bita);
    bita.startx+=8;
    draw_bitmap(&bita);
   }

   if(button==75)
   {
    delete_bitmap(bita);
    bita.startx-=8;
    draw_bitmap(&bita);
   }
   button=getch();
  }


Это сообщение отредактировал(а) dima_mak - 11.7.2004, 23:49
PM MAIL   Вверх
cardinal
Дата 12.7.2004, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



перепиши вот это на ассемблер:
Код
for(j=bmp->starty;j<(bmp->height+bmp->starty);j++)
{
  for(i=(bmp->width+bmp->startx);i>bmp->startx;i--,bitmap_offset++)
    putpixel(i,j,(bmp->data[bitmap_offset]));
}



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
dima_mak
Дата 12.7.2004, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист любитель
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 25.5.2004

Репутация: нет
Всего: нет



Я не знаю как написать путпиксель на асемблере. Если можешь помоги.
Добавлено @ 10:48
тоесть куда в память мне нужно вставлять пиксель, что бы он показывался на экране
PM MAIL   Вверх
cardinal
Дата 12.7.2004, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



v prinzipe vot tut chto-to estj
http://www.programmersheaven.com/zone10/cat458/15447.htm
no eto vse golovnaja bolj, luchshe posmotri eshe raz na putimage
http://www.vyomworld.com/source/code.asp?i...me%20in%20C/C++
dumaju aeto budet prosche


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1047 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.