Секреты программирования игр


         

Оптимизация изображаемой линии - часть 2


H_Line_Fast(int xl,int x2,int у,unsigned int color)

{

unsigned int first_word, middle_word, last_word,line_offset,

index

;

// тестируем 1 бит начальной х-координаты

if ( (x1 & 0х0001))

{

first_word = (color << 8);

}

else

{

// заменить цвет в обоих байтах

first_word = ( (color<<8) | color) ;

}

// тестируем первый бит в х2

if( (х2 & 0х0001) )

{

last_word = ((color<<8) | color);

)

else

{

// поместить цвет только в старший байт

last_word = color;

}

// теперь мы можем рисовать горизонтальную линию,

// выводя сразу по два пикселя

line_offset = ( (у<<7) + (у<<5) ); // у*160, поскольку в линии 160 слов

// вычислить цвет в середине

middle_word = ((color<<8) | color);

// левая граница

video_buffer_w[line_offset + (x1>>1)]= first_word;

// середина линии

for (index=(x1>>1)+l, index<(x2>>l); index++)

video_buffer_w[line_offset+index] = middle_word;

// правая граница video_buffer_w[line_offset+(х2>>1)] = last_word;

}

В начале работы функция проверяет, находятся ли конечные точки на границе байта (BYTE)? Основываясь на результатах проверки, функция создает два слова (WORD): одно будет началом линии, а другое ~ концом. В зависимости от результатов начального теста эти два слова содержат либо один, либо два байта, представляющих цвет. Затем функция изображает линию. Это выполняется следующим образом:

·       Пишется первый WORD, соответствующий левой границе;

·       Создается цикл FOR, который предназначен для записи в WORD середины линии;

·       Пишется WORD, соответствующий правой границе линии.

Хотя эта функция почти в два раза длиннее, чем первоначальная Н_Line, она почти в два раза быстрее.

(Существуют, правда, небольшие накладные расходы при вычислении границы). Чтобы сделать ее еще быстрее, я мог бы переписать часть, которая изображает середину на встроенном ассемблере, но я думаю, что вы и сами сделаете это в качестве легкого упражнения.




Содержание  Назад  Вперед