Вы делаете 3d движок. Вы хотите лучшее из мультиплатформенных миров. Внезапно вы понимаете, что если вы хотите использовать Direct3D на машинах Windows и OpenGL на OSX / Linux, вам придется пожертвовать поддерживаемыми функциями как наименьшего общего знаменателя.
Некоторые могут использовать OpenGL в трех ОС, поскольку он сам по себе является наименее распространенным знаменателем. Все хорошо. Затем вам нужно перенести бэкэнд вашего графического API на Nintendo GX, вам также нужно создать путь для PS3 и Xbox360.
Чем ты занимаешься? Вы разрабатываете свой собственный API, который сам по себе является наименьшим общим знаменателем, и пишете реализации для него для каждой платформы, или вы пишете для каждой платформы свою ветвь?
Если вы решили создать свой собственный API, вы используете шаблон моста или свой собственный вуду? Где прекращается безумие, когда вы понимаете, что все, и подход к мойке должен прекратиться, и у вас есть отдельный движок для каждой платформы как ответвления. Или вы придерживаетесь всего и кухонной раковины и сохраняете специфику платформы в спецификациях бэкэнд-модуля для каждой платформы.
Все, что я могу сказать, это взглянуть на Ogre3D . Он написан на C ++, с открытым исходным кодом (сейчас MIT License) и работает на любой основной платформе из коробки. Он абстрагирует API рендеринга и может переключаться с использования DirectX на OpenGL с помощью всего лишь нескольких настроек. Однако я не знаю достаточно о различиях между наборами функций DirectX и OpenGL, чтобы сказать, что он поддерживает или не поддерживает определенную функцию.
Torchlight от Runic Games был написан с использованием Ogre, и я играл на Mac и PC, и он отлично работает на обоих.
источник
Я не сделал этого для графики, но я создал кроссплатформенный аудио инструментарий (PC / XBOX / PS2). Мы пошли по пути создания нашего собственного API с возможностью наименьшего общего знаменателя, а также дополнительными возможностями для конкретной платформы. Вот некоторые извлеченные уроки:
Ключевым моментом является определение пути обработки, который включает в себя основные возможности каждой платформы и обеспечивает рост. Чтобы сделать это, вам нужно по-настоящему понять API низкого уровня каждой платформы, чтобы вы могли определить правильные абстракции. Убедитесь, что цепочка работает для наименее способной платформы, обеспечивая при этом доступ к расширенным функциям наиболее способной формы. Сделайте работу, чтобы сделать это правильно, и вы сэкономите много усилий позже.
Для аудио цепочка была чем-то вроде
SoundSources -> [Decoders] -> Buffers -> [3D Positioner] ->[Effects] -> Players
.Для графики это может быть
Model -> Shapes -> Positioner -> Texturer -> [Lighting] -> [Particle Effects] -> Renderer
. (Это, вероятно, совершенно неправильный набор, я не графический парень).Напишите интерфейсный API, который обрабатывает ваши основные объекты, и специфичный для платформы сервер, который отображает API на низкоуровневые возможности. Приложите максимум усилий для каждой возможности. Например, на ПК и XBOX позиционирование 3D-звука осуществлялось с использованием возможностей звуковых чипов HRTF, в то время как PS2 использовала простое панорамирование и фейдеры. Графический движок может сделать что-то похожее с освещением.
Реализуйте как можно больше внешнего интерфейса с помощью нейтрального кода платформы. Код для привязки объекта реверберации к звуковому объекту или актива текстуры к объекту формы должен быть совершенно обычным, как и код для итерации и обработки активных объектов. С другой стороны, объекты низкого уровня могут полностью зависеть от платформы, за исключением общего интерфейса.
Убедитесь, что API или файлы конфигурации позволяют пользователю указывать специфичные для платформы параметры. Мы старались не выдвигать специфичный для платформы код на игровой уровень, сохраняя его в файлах конфигурации: в одном файле конфигурации платформы можно указать «effect: SuperDuperParticleGenerator», а в другой - «effect: SoftGlow»
Определенно развивайте платформы параллельно. Убедитесь, что специфичные для платформы интерфейсы хорошо определены и тестируемы сами по себе. Это предотвращает много "это уровень платформы или уровень API?" проблемы при отладке.
источник
Я пишу игровой движок с открытым исходным кодом под названием YoghurtGum для мобильных платформ (Windows Mobile, Android). Это была одна из моих больших больших проблем. Сначала я решил это так:
Вы заметили
void*
? Это потому, чтоRenderMethodDirectDraw
возвращает поверхность DirectDraw, в то время какRenderMethodDirect3D
возвращает пул вершин. Все остальное тоже раскололось. У меня былSprite
класс, который имел либоSpriteDirectDraw
указатель, либоSpriteDirect3D
указатель. Это вроде отстой.Так что в последнее время я много переписывал вещи. То, что у меня есть сейчас - это
RenderMethodDirectDraw.dll
иRenderMethodDirect3D.dll
. На самом деле вы можете попробовать использовать Direct3D, потерпеть неудачу и вместо этого использовать DirectDraw. Это потому, что API остается прежним.Если вы хотите создать спрайт, вы делаете это не напрямую, а через фабрику. Затем фабрика вызывает правильную функцию в DLL и преобразует ее в родительский.
Итак, это в
RenderMethod
API:И это определение в
RenderMethodDirectDraw
:Я надеюсь в этом есть смысл. :)
PS Я бы хотел использовать STL для этого, но на Android нет поддержки. :(
В принципе:
РЕДАКТИРОВАТЬ: Да, имеет смысл иметь виртуальные интерфейсы, как это. Если ваша первая попытка не удалась, вы можете попробовать другой метод рендеринга. Таким образом, вы можете сохранить весь свой метод визуализации кода независимым.
источник
Мне нравится использовать SDL для этого. Он имеет бэкенды рендеринга для D3D, OpenGl, OpenGL ES и нескольких других специфичных для платформы бэкэндов, и он доступен для всех видов различных платформ, и в настоящее время находится в стадии активной разработки, с привязками ко многим различным языкам.
Он абстрагирует различные концепции рендеринга и делает создание видео (а также обработку звука и ввода и некоторые другие вещи) доступными в простом кроссплатформенном API. И он был разработан Сэмом Лантинга, одним из ведущих разработчиков Blizzard, специально для упрощения портирования игр и создания кроссплатформенных игр, чтобы вы знали, что имеете дело с высококачественной библиотекой.
источник