Как приблизиться к портированию игрового механизма на другую платформу?

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

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

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

В целом: как я должен приблизиться к портирующему существующему исходному коду?

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

5
задан LearnCocos2D 4 June 2010 в 17:53
поделиться

1 ответ

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

Допустим, у вас есть:

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 и попросить вашу библиотеку взаимодействовать с модулем, который, в свою очередь, знает особенности вашей платформы. Просто разработайте разные модули (например, виртуальные машины) для каждой платформы, и вы разработаете свою библиотеку только один раз.

3
ответ дан 15 December 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: