Реклама:

Зачем нужен трехмерный движок

Товарищи новички, сосредоточьтесь! Возможно, то, что я сейчас скажу, с первого раза будет не очень понятно. Обязательно перечитайте и вникните: это один из основных принципов программирования вообще и разработки сложных систем (а игра — это сложная система) в частности. Представьте себе какую-нибудь простенькую игру, пинг-понг, к примеру. Программист написал ее на чистом OpenGL, исходники уместились строк эдак в 200. Что там будет движком, а что основным кодом игры? Так прямо сразу и не скажешь... А если подумать, такое разделение на движок и основной код вообще не нужно.

Теперь представьте, что мы хотим сделать более или менее серьезный 3D-action (десятки тысяч строк кода). И будем мы программировать таким же способом, как если бы мы делали тот самый пинг-понг. И скоро запутаемся! Да, этот код будет быстрым, там не будет ничего лишнего, но... не всякий программист сможет дописать его до конца. А ошибки в таком плотном коде искать — сущий ад. Значит, его надо как-то упорядочить. Проще всего это сделать с помощью выделения уровней абстракции.

Уровень абстракции — это одно из важнейших понятий модульного программирования. Представьте, что вы строитель, и вам нужно построить дом. Вы оперируете кирпичами: берете кирпич, кладете его на строящуюся стену, намазываете раствором, берете следующий кирпич... Кирпичи — ваш уровень абстракции. Теперь представьте, что вы застройщик. И вам нужно построить микрорайон. Вы говорите строителю, где строить дома, какие дома сносить. Дом — это ваш уровень абстракции. Было бы странно, если бы вы указывали строителю, какой кирпич куда класть. Вы сказали: вот здесь будет дом. Все остальные заботы берет на себя строитель. Ну а теперь представьте, что вы мэр города. И вам необходимо дать задание толпе застройщиков к такому-то году дать городу столько-то нового жилья. Вряд ли вы будете лично планировать, где какой дом должен стоять. Это работа застройщика. Уровень абстракции мэра— объем жилого фонда, который можно увеличивать, можно уменьшать, а как это будет выполняться — дело десятое. По большому счету на этом уровне абстракции все равно, из чего строятся дома: хоть из кирпичей, хоть из бивней мамонта. И у мэра в списке команд просто не может быть "положить кирпич", хотя любая его команда через несколько уровней абстракции к этому и приведет.

В более или менее сложной компьютерной программе или игре — то же самое. Каждый уровень абстракции отвечает за свою часть работы, опираясь на возможности более низкого уровня. Каждый уровень абстракции обеспечивает более высокому уровню удобный интерфейс для работы с объектами. В компьютерной игре нижний уровень абстракции — это язык программирования (хотя на самом деле можно копнуть еще глубже — до железа). Далее идут команды OpenGL API (если мы именно с его помощью программируем). На этом уровне мы можем отдать команду вроде "нарисовать полигон" и "поменять местами видимую и теневую части видеобуфера". Потом — команды GLScene. На этом уровне мы можем дать команды вроде "построить куб", "загрузить модель в формате 3DS" и "наложить на модель такую-то текстуру". А вот дальше — игровой движок. И наконец, игровой код, который может давать игровому движку команды вроде "загрузить уровень", "выстрелить таким-то персонажем из такого-то оружия" и "показать заставочный ролик". В идеальном случае каждый уровень абстракции пользуется командами только предыдущего уровня. Не всегда это возможно. Но к этому надо стремиться, так как в таком случае код будет быстрым, удобным и легкочитаемым.


⇐ Предыдущая страница| |Следующая страница ⇒