6

私は以前にこの問題に何度か遭遇したことがあり、他の人の経験やアドバイスを聞きたいと思っていました. 1 つのプラットフォームでのみ動作する安定した比較的小さなゲーム エンジンがあり、それを別のプラットフォームに移植したいとします。

最初のステップは明らかです。コードを取得し、それを古いライブラリではなくプラットフォーム ライブラリにリンクし、プロジェクトまたはターゲットのビルド設定に必要な変更を加えてから、ビルドを押します。約 5 ~ 2 万のエラーが表示されます。もちろん、多くの重複がありますが、次のステップはどうあるべきかという疑問がすぐに生じます。

ゲーム エンジンを別のプラットフォームに移植する場合、またはシステムや API の設計に固有の変更が原因で他のプラットフォームでコンパイルできないプラットフォーム固有のコードを移植する場合、どのようにアプローチしますか? これらすべてのエラーをどのように解決しますか? 最初にアプローチする必要がある部分をどのように特定しますか?

一般に、既存のソース コードの移植にはどのようにアプローチすればよいですか?

ソース コードの移植方法に関する一般的なアドバイスを探しています。プログラミング言語とコンパイラが両方のプラットフォームで同じであると仮定すると、ほとんどが API の変更になります。

4

1 に答える 1

3

教科書的な答え (おそらく) は、プラットフォーム固有の呼び出しをすべてラップし、プラットフォーム固有ではなくコード全体でこれらのラッパー関数を使用することです。このようにして、両方のプラットフォームで使用するメソッドを 1 対 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 のようなことを行い、プラットフォームの詳細を認識しているモジュールとライブラリを対話させることもできます。プラットフォームごとに異なるモジュール (VM など) を開発するだけで、ライブラリを 1 回だけ開発できます。

于 2010-06-04T16:22:44.410 に答える