Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.238.40] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
По поводу переключения банков: лучше переключать их, делая FAR CALL, а не через INT 10h. Шустрее будет....
|
Сообщ.
#17
,
|
|
|
Особенно медленно прерывания (в т.ч. и INT 10h) работают в 32-битных приложениях защищенного режима, т.к. thunking (переключение режима 32bit->16bit->32bit) очень сильно тормозит приложение. Таким образом, прямой вызов 32-битной процедуры переключения банков, которая доступна в VESA 2.0 и выше (функция 0Ah - Return VBE Protected Mode Interface), действительно очень ускоряет работу с графикой в banked SVGA режимах.
|
Сообщ.
#18
,
|
|
|
7in
Первый пример VESA который я в дальнейшем разобрал как раз использавал этот FAR CALL. (см. ниже) |
Сообщ.
#19
,
|
|
|
vb
По поводу примера: Далее приведён почти рабочий пример программы с использованием моей процедуры закраски экрана (VFAP) в Real mode. Следует отметить что она ращитана на работу с разными разрешениями и колличеством цветов, так же предусмотрен просчёт для переключения видео страниц. Но т.к. тут всё фиксировано то все числа подставлены в ручную. Надеюсь что я подставил верные параметры для работы проги но если она не заработает то прошу меня проинформировать). На моём 333 Cel эта процедура даёт около 47 кадров за секунду. Может есть замечания, предложения по оптимизации, или критика то пишите. Var wAddPixel:Word; {Заполняется процедурой переключения видео страниц} wAddChunk:Word; {-//-//-} wEndChunk:Word; {-//-//-} wEndPixel:Word; {-//-//-} BytesPerPixel:Byte;{Заполняется при инициализации} pWindowingFunction:Pointer;{-//-//-} wDeltaChunk:Word;{-//-//-} wWriteSegment:Word;{-//-//-} wReadWriteChunk:Word;{Нужно для хранения активного банка. Позволяет избавляться от лишнего переключения банка. Активно используется процедурой прорисовки точки.} Buf:Array[0..63]of LongInt; Function VESAModeSupport(GrMode:Word):Boolean; {Нужна для получения информации} Assembler; Asm mov ax,Seg(Buf) mov es,ax mov di,Offset(Buf) mov ax,$4F01 mov cx,GrMode int $10 End; Procedure VFAP(wColor:word);{Вот так она у меня выглядит} Assembler; Asm mov ax,wAddPixel mov bl,BytesPerPixel xor bh,bh mul bx add dx,wAddChunk mov di,ax mov bx,0 pusha; cli; call pWindowingFunction; sti; popa mov cx,wDeltaChunk add cx,wEndChunk mov ax,wWriteSegment mov es,ax mov ax,wColor db 66h shl ax,16 add ax,wColor {Далее сама закраска} @1: db 66h;stosw cmp di,1 jnc @1 inc dx pusha; cli; call pWindowingFunction; sti; popa sub cx,1 jnz @1 @2: db 66h stosw cmp di,wEndPixel jnz @2 mov dx,wReadWriteChunk pusha; cli; call pWindowingFunction; sti; popa End; Begin VesaModeSupport($101); {Нужна для получения адреса процедуры переключения строниц} pWindowingFunction:=Pointer(Buf[3]);{Сам адрес} wWriteSegment:=$A000; {По умолчанию} BytesPerPixel:=2; wDeltaChunk:=640*480 div $8000; wEndPixel:=24576; Asm mov ax,$4f02;mov bx,$111; int 10h; end; {Грубоя инициализация режима 640x480x16 на самом деле всё делается не так} VFAP($ffff);{Обычно я закрашиваю чёрным цветом} ReadLn; Asm mov ax,3; int 10h; End; End. |
Сообщ.
#20
,
|
|
|
А для чего ты вызываешь pWindowingFunction в конце процедуры (непосредственно перед “End;”)? IMHO кроме дополнительного торможения программы, это ничего не дает... Кроме того, “rep stosd” будет выполняться быстрее, чем последовательность “@2: stosd; cmp di, wEndPixel; jnz @2”. Еще, вместо pusha/popa можно сохранять только те регистры, которые используются в твоей процедуре (es, ax, di, cx и dx) – так быстрее. Ну и разумеется, если переписать все это дело под 32-bit protected mode, то можно будет избавиться от префикса 66h, что даст дополнительный прирост производительности.
|
Сообщ.
#21
,
|
|
|
vb
Спасибо за советы, учту. Было бы интересно посмотреть твои 32-ух битные разработки(если они у тебя есть), может скинеш что нибудь? |
Сообщ.
#22
,
|
|
|
Честно говоря, мне и скинуть то нечего... Давать тебе обобщенные процедуры нет смысла, т.к. они все равно будут достаточно медленными. Писать что-то конкретное для твоего примера тоже не интересно, т.к. ты это прекрасно сделаешь и без меня. Если же надо дать пару-тройку советов по оптимизации конкретного примера - всегда пожалуйста!
|
Сообщ.
#23
,
|
|
|
Не врубаюсь, зачем нужна 2-ух байтная переменная wWindowGranulity?
(5-ий байт буффера передавймый при вызове VESAModeSupport (AX=4F01)) |