Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #64, МАРТ 2006 г.

графоманские улучшения

ФЛЕНОВ МИХАИЛ AKA HORRIFIC

Спецвыпуск: Хакер, номер #064, стр. 064-024-5


Если экран программы каждый раз формируется полностью, то и не стоит каждый раз перед формированием сцены очищать его. Все равно каждый пиксель будет закрашен, и от нашей заливки ничего не останется. Другое дело, когда рисуется движение звезд на черном небе. Тут действительно удобнее закрасить экран черным, а потом поверх неба нарисовать звезды. Но если на экране присутствует поверхность земли (например, из 600 пикселей в высоту: нижние 200 — это земля, а верхние 400 — черное небо), то нужно закрашивать только ту часть, где есть небо. Нет смысла очищать весь экран!

алгоритм

Самое главное, что определяет скорость работы игры, — это алгоритм. Хороший алгоритм не требует дополнительной оптимизации. Не могу предложить однозначное решение, но некоторые рекомендации по оптимизации есть.

Игровые сцены чаще всего характеризуются значительным множеством объектов. Давай вспомним знаменитую игру Command&Conquer (или, проще, C&C). На поле боя одновременно может находиться тысяча объектов. Одних только солдатиков можно наделать пару тысяч, плюс здания, деревья, мосты и т.д. Теперь представим, что произойдет, если цикл отображения сцены будет выглядеть следующим образом:

for (int i=0; i<OBJECT_COUNT; i++)

{

if (объект видим)

Отобразить объект

}

Если значение OBJECT_COUNT равно 2 000, то для отображения сцены придется выполнить 2 000 шагов цикла и на каждом из них произвести проверку видимости, которая может состоять из четырех операций if. Сумасшедшие расходы! Не по силам даже современному компьютеру, если не оптимизировать код. Что же можно сделать здесь? Как сократить количество циклов?

Карта игры C&C большая, и в определенный момент времени видно не более 10% ее. Можно разбить карту на 10-20 квадратов и привязывать объекты именно к определенному квадрату на карте. В результате цикл отображения будет таким:

for (int i=0; i<QUAD_COUNT; i++)

{

if (квадрат видим)

{

Запустить цикл проверки видимости и

отображения объектов данного квадрата на карте.

}

}

Теперь будут проверяться не все объекты, а только те, которые находятся на квадрате, видимом в данный момент. Единственное, что нужно сделать дополнительно, — после перемещения объекта проверить, вышел ли он за пределы своего квадрата, и если вышел, то присоединить объект к новому квадрату, на плоскость которого попал объект. Такие объекты, как деревья и здания, не перемещаются, поэтому для них проводить проверку не нужно.

сортировка

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

Назад на стр. 064-024-4  Содержание  Вперед на стр. 064-024-6