Движок
Движок, двигатель (англ. engine) - обособленный компонент приложения, реализующий некоторую часть его функциональности. Ключевая особенность движка - абстракция, независимость от приложения: в движок выносится наиболее общая и универсальная функциональность с целью повторного использования (code reuse) в других проектах. Вынос функциональности в движок является частным случаем модульности.
Разновидности движков
- Игровой - реализует игровую логику, связывает воедино графический, физический, звуковой и др. движки
- Физический - отвечает за динамику поведения игровых объектов (динамику твердых и мягких тел, жидкостей, транспортных средств и т.д.), а также, иногда, кинематику (например, движение вдоль сплайна, инверсная кинематика, контроллер персонажа и т.д.)
- Движок столкновений - реализует алгоритмы обнаружения пересечений геометрических тел, а также пересечения тел с лучом, отрезком, плоскостью и т.д. Зачастую является частью физического движка, но иногда выносится в отдельный модуль
- Звуковой - реализует интерфейс ввода/вывода звука. Обычно является абстракцией поверх системных звуковых API и не имеет собственного микшера, хотя бывают исключения - например, OpenAL
- Сетевой - реализует обмен данными по сети (например, клиент-серверную модель) на основе низкоуровневых сетевых интерфейсов. Является основой многопользовательского режима в играх
- Скриптовый - реализует возможность расширения приложения путем написания программ-сценариев (скриптов)
- Движок рендеринга - в программах 3D-моделирования - модуль построения графического изображения на основе данных о трехмерной сцене. В отличие от графического движка, работает не в реальном времени (оффлайн-рендеринг), хотя может использовать GPU для ускорения. В основе обычно лежит трассировка лучей или гибридный пайплайн (растеризация + трассировка).
Архитектура
Движок может представлять собой библиотеку исходного кода, статическую или динамическую библиотеку. Последний вариант наиболее универсален, поскольку позволяет использовать движок с различными языками программирования. Архитектурно движок часто делится на фронтенд и бэкенд. Фронтенд в данном случае - пользовательский программный интерфейс (структуры данных и функции, либо, в ООП-языках, классы). Бэкенд - реализация интерфейса, с которой пользователь напрямую не взаимодействует. Она обычно делается заменяемой. Например, графический движок может иметь переключаемые бэкенды на основе Direct3D и OpenGL, тогда как фронтенд является абстрактным и независимым от конкретной низлежащей технологии.