Как подойти к переносу игрового движка на другую платформу? - PullRequest
5 голосов
/ 04 июня 2010

Я сталкивался с этой проблемой несколько раз раньше и хотел услышать, каков опыт и советы других. Предположим, у вас есть работающий и стабильный, но относительно небольшой игровой движок, работающий только на одной платформе, и вы хотите перенести его на другую платформу.

Первый шаг очевиден: вы берете код, связываете его с библиотеками платформ вместо старых, вносите необходимые изменения в настройки проекта или целевой сборки и затем нажимаете кнопку build. Появляется от пяти до двадцати тысяч ошибок. Конечно, есть много дубликатов, но сразу возникает вопрос, какими должны быть следующие шаги?

Как вы подходите к переносу игрового движка на другую платформу или к любому специфическому для платформы коду, который нельзя просто скомпилировать на другой платформе из-за внутренних изменений в дизайне системы и API? Как вы преодолеваете все эти ошибки? Как определить части, к которым следует обратиться в первую очередь?

В целом: как мне подойти к переносу существующего исходного кода?

Я ищу общие советы о том, как подходить к порту исходного кода. Предположим, что язык программирования и компилятор одинаковы на обеих платформах, поэтому в основном это изменения API.

1 Ответ

3 голосов
/ 04 июня 2010

Ответ из учебника (возможно) может заключать в себе все вызовы, относящиеся к вашей платформе, и использовать эти функции-обертки по всему коду, а не для конкретной платформы. Таким образом, если вы можете сопоставить методы, которые вы используете один-к-одному на обеих платформах (возможно, легче сказать, чем сделать), то вы можете переключить, какая функция для конкретной платформы вызывается вашими функциями-обертками, и не изменять остальные логика в вашем коде.

Скажем, у вас есть:

void RenderBadGuy(int badGuyID)
{
    // Windows-specific bad-guy rendering code here
}

На данный момент вы можете просто написать ("G_" для общего)

void G_RenderBadGuy(int badGuyID)
{
    RenderBadGuy(badGuyID);
}

Это добавляет небольшую нагрузку на ваш движок, но это не должно ломать вещи, если они у вас есть (просто дополнительный вызов функции).

Теперь, в любом месте, где вы используете RenderBadGuy, просто используйте G_RenderBadGuy. Промойте и повторите все ваши методы, и теперь позже вы можете переключить свой код на что-то вроде

void G_RenderBadGuy(int badGuyID)
{
    // now we're rendering on a Mac
    RenderBadGuy_Mac(badGuyID);
}

и тогда ваш главный двигатель не изменится.

Вы, вероятно, можете сделать это намного лучше и обобщенно (указатели на функции, я не знаю), но это идея.

Или вы можете сделать что-то похожее на Java и поговорить с вашей библиотекой с модулем, который, в свою очередь, знает специфику вашей платформы. Просто разработайте разные модули (например, виртуальные машины) для каждой платформы, и вы создадите свою библиотеку только один раз.

...