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


         

Оптимизация рисования пикселей


Первое, что мы должны сделать, это насколько возможно оптимизировать по быстродействию функцию рисования пикселей. Ведь на ней базируются, все остальные графические построения! Давайте возьмем функцию Plot_Pixel() из Листинга 5.4 (вы найдете ее в пятой главе «Секреты VGA-карт») и поглядим можем ли мы оптимизировать ее дальше. Листинг 18.3 содержит новую функцию.

Листинг 18.3. Функция для быстрого рисования пикселей.

void Plot_Pixel_Fast(int x,int y,unsigned char color)

(

// Функция рисует на экране точку несколько быстрее

// за счет использования сдвига вместо умножения:

// 320 * у = 256 * у + 64 * у = у << 8 + у << 6

video_buffer[((у<<8}+(у<<6) )+х]=соlоr;

}

Все. С точки зрения Си эта функция уже оптимизирована настолько, насколько возможно. Я могу вам предложить только следующее:

· Перепишите программу на встроенном ассемблере;

·       Не передавайте параметры;

·       Возможно, создайте справочную таблицу из 64000 элементов, каждый из которых содержит адрес видеобуфера, соответствующий координатам Х и Y.

Правда, я думаю, что использование справочной таблицы на самом деле только замедлит выполнение программы. Ведь операция индексирования таблицы может отнять больше времени, чем два сдвига и сложение, необходимые для вычисления адреса. Но вот первые два пункта заслуживают внимания. Начнем с использования глобальных переменных, заменяющих передачу параметров. Например, определим такие глобальные переменные:

int plot_x, plot_у, plot_color;

Тогда нашу функцию можно переписать, как показано в Листинге 18.4

Листинг 18.4. Другая версия функции построения пикселя.

void Plot_Pixel_Global(void)

{

video_buffer[((plot_y<<8) + (plot_y<<6))+plot_x]=plot_color;

}

Это уже будет работать значительно быстрее, но нам все равно перед вызовом нужно выполнить операцию присваивания для переменных plot_x, plot_у и plot_color. Следовательно, вопрос в следующем - отнимет ли операция присваивания глобальных переменных меньше времени, чем передача параметров, создание и удаление фрейма стека вместе со ссылками на параметры? Может да, а может и нет.


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