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


ТЕХНИКА ОПТИМИЗАЦИИ - часть 20


(

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

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

// 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. Следовательно, вопрос в следующем - отнимет ли операция присваивания глобальных переменных меньше времени, чем передача параметров, создание и удаление фрейма стека вместе со ссылками на параметры? Может да, а может и нет. Все зависит от ситуации. Но цель заслуживает того, чтобы попробовать испытать и этот метод.

Теперь перепишем процедуру на ассемблере. Результат показан в Листинге 18.5

Листинг 18.5. Версия функции рисования пикселя на ассемблере.




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



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