Я сталкивался с этой проблемой несколько раз прежде и хотел услышать, каковы опыт других и совет. Предположите, что у Вас есть работа и стабильный но относительно маленький игровой механизм, который работает над только одной платформой, и Вы хотите портировать его на другую платформу.
Первый шаг очевиден: Вы берете код, связываете его с библиотеками платформ вместо старых, вносите необходимые изменения в или целевые настройки сборки проекта и затем поражаете сборку. Появляются приблизительно пять - двадцать тысяч ошибок. Конечно, существует много дубликатов, но это сразу поднимает вопрос, каковы следующие шаги должны быть?
Как Вы приближаетесь к портированию игрового механизма на другую платформу или какого-либо определенного для платформы кода, который не может только быть скомпилирован на другой платформе из-за свойственных изменений в дизайне API и системе? Как Вы пробираетесь через все они ошибка? Как Вы определяете части, к которым нужно приблизиться сначала?
В целом: как я должен приблизиться к портирующему существующему исходному коду?
Я ищу общие рекомендации по тому, как приблизиться к порту исходного кода. Предположите, что язык программирования и компилятор являются тем же на обеих платформах, таким образом, это - главным образом изменения API.
Ответ из учебника (возможно) мог бы заключаться в обертке всех ваших вызовов, специфичных для вашей платформы, и использовании этих функций-оболочек во всем вашем коде вместо специфичных для платформы. Таким образом, если вы можете сопоставить методы, которые вы используете, один к одному на обеих платформах (возможно, проще сказать, чем сделать), тогда вы можете отключить, какая функция для конкретной платформы вызывается с вашими функциями-оболочками, и не изменять остальную часть логика в вашем коде.
Допустим, у вас есть:
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 и попросить вашу библиотеку взаимодействовать с модулем, который, в свою очередь, знает особенности вашей платформы. Просто разработайте разные модули (например, виртуальные машины) для каждой платформы, и вы разработаете свою библиотеку только один раз.