Я цього не робив для графіки, але створив міжплатформенний аудіоінструмент (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 або файли конфігурації дозволяють користувачеві вказувати параметри, що стосуються платформи. Ми намагалися уникнути виштовхування коду для платформи на рівень гри, зберігаючи його у файлах конфігурації: Конфігураційний файл однієї платформи може вказати "ефект: SuperDuperParticleGenerator", а інший каже "ефект: SoftGlow"
Однозначно розробляти платформи паралельно. Переконайтесь, що конкретні інтерфейси платформи чітко визначені та перевірені самостійно. Це перешкоджає великій кількості "це рівень платформи чи API?" проблеми при налагодженні.