Программирование игр для Windows. Советы профессионала


Оптимизированные версии OpaqueBlt() и TransparentBlt()


Листинг 17.4 содержит оптимизированные ассемблерные версии подпрограмм OpaqueBlt() и TransparentBlt(), которые имеются и на дискете (BLIT.ASM). Эти подпрограммы можно использовать вместо соответствующих функций на Си, что увеличит быстродействие программы примерно на 30 процентов.

Демонстрационная программа PARAL использует ассемблерные версии этих подпрограмм. Они были написаны с тем расчетом, чтобы могли работать с процессором 286. Поскольку они заполняют буфер системной памяти, их можно оптимизировать и дальше, применив 32-битовые команды перемещения банных.

Листинг 17.4. Оптимизированная подпрограмма (BLIT.ASM).

ideal

model compact,с

p286

dataseg

VIEW_WIDTH equ 320

VIEW_HEIGHT equ 100

TRANSPARENT equ 0

global MemBuf:dword

.codeseg

public OpaqueBIt public TransparentBIt

;

;Эта процедура копирует битовую карту в MemBuf. Кроме этого, она

; может скроллировать левую и правую части битового образа

; в зависимости от значения ScrollSplit ;

proc OpaqueBlt

ARG Bitmap:dword,StartY:word,Height:word,ScrollSplit:word

USES si,di

les   di,[MemBuf]      ; получить указатель на буфер памяти

mov   ax,[StartY]      ;получить начальную Y-координату

mov   bx,ax            ;скопировать

sal   ax,6             ; умножить на 64

sal   bx,8             ; умножить на 256

add   ax,bx            ; результат равен умножению на 320

add   di,ax            ; вычислить смещение внутри MemBuf

mov   bx,[Height]      ; получить высоту битовой карты

mov   dx,[ScrollSplit] ; получить длину правой половины

push ds                ; сохранить сегмент данных

lds   si,[Bitmap]     ; получить полный указатель на битовую карту

mov   ax,VIEW_WIDTH    ; получить ширину экрана

sub   ax,dx            ; вычислить длину левой половины

cld        ; обрабатывать данные от младших адресов к старшим

@@lоор01: add   di,dx            ; вычислить начальную позицию

mov   сх,ах            ; получить длину левой половины

shr   cx,1 ; разделить на 2 (поскольку выводим по 2 байта)   :




Начало  Назад  Вперед



Книжный магазин