クロスプラットフォームゲームを作成するためのヒントはありますか?[閉まっている]


回答:


44

プラットフォーム固有のものを抽象化レイヤーの背後に隠します

これは、レンダリング、オーディオ、ユーザー入力、ファイルIOなどを意味します。実行時のパフォーマンスの低下を招くことなく抽象化するための1つの一般的なトリックは、プラットフォーム固有の実装ファイルを備えたプラットフォームに依存しないヘッダーです。

// FileSystem.h
class FileSystem {
public:
    FileHandle OpenFile(const char * path);
    // other stuff...
}

// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
    // call windows API...
}

次に、各プラットフォームのビルドを構成して、適切な.cppファイルに対してビルドします。

コンテンツパイプラインをプラットフォームに依存しないアセットで読み取り、プラットフォームごとにプラットフォーム固有のコンテンツを出力する

たとえば、テクスチャを.tgaまたは単に.psdとして作成し、それらを必要なさまざまなプラットフォーム固有の形式に自動的に変換できるパイプラインを用意します。

データに特定のメモリレイアウトやエンディアンを想定しないでください

プラットフォームは、バイト順、パディング、アライメント、およびワードサイズが異なる場合があります。それを気にするコードはすべてのプラットフォームで徹底的にテストする必要があります。

すべてのプラットフォームで常にテストする

あなたはしますプラットフォーム固有のバグに刺さます。今すぐ噛まれますか、それともゲームをドアから出そうとしているときにぴったりですか?


2
#ifdef PLATFORM_WINftwの欠如
-tenpn

あなたはそれを決して逃さないでしょう。あなたはそれを最小化することを望むことができます。
明白な

8
それを行う良い方法は、すべてのプラットフォーム固有のコードを同じインターフェースを持つセット共有ライブラリに移動し、#ifdefをプラットフォームの正しいライブラリをブートストラップするように制限することです。
ニール

1
+1、すばらしいコメント。STLでさえプラットフォームに依存していることを覚えておいてください(そして、はい、いくつかの関数は異なるコンパイラーで異なることをします)。
サイモン

確かに追加の関数を呼び出すとパフォーマンスが低下しますか?CPUは、レジスタまたはさらに悪いことにメモリからデータをロードまたは移動する必要がありますが、メモリはまだ低速です。システムコールで十分ではないでしょうか?
TheBlueCat

10
  • プラットフォーム間を移動するときに最小限の手間をかけるopengl / sdlなどのAPIを使用します。

  • どのプラットフォームをサポートしたいかを確認してください。将来マルチプラットフォームをサポートしたいと思うからといって、openglを使用しないでください。続けるつもりで始めてください。

  • サポートする各プラットフォームのハードウェア制限を把握してください。


2番目のポイントに十分なストレスをかけることはできません。ゲームの目的を知っていることを確認してください(つまり、カジュアルゲームの場合は、少なくともOSXとWindowsで使用したいので、OpenGLが最適な選択肢です)。3番目の点については、これがエンジンの出番です。Unrealのような機能が豊富でリソースを大量に消費するエンジンを使用してDSゲームを作成するのは非論理的です。この点は、2番目の点に関して私が言ったことにも関係しています。ゲームの対象者を確立することです。カジュアルゲームに行く場合、ほとんどの人のコンピューターは、たとえばパーティクルを処理しません。

7

#if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endifコード全体に散らばらないようにしてください。

簡単な方法のように見えることもありますが、長期的には問題が発生します。すべてのプラットフォーム実装が自己完結型であるように、それらを独自のファイルに制限するようにしてください。

プラットフォームの追加は、主に新しい実装ファイルを追加することであり、必要な既存のファイルを変更するだけです。


4

それ自体がクロスプラットフォームであるライブラリがたくさんあります。どこでも実行するためにOpenGLで直接記述する必要はありません。OGREは、名前を付けたい任意のプラットフォームで動作するレンダリングエンジンの優れた例です。

私の経験では、最大の懸念はビルドシステムです。WindowsでVisual Studioを使用して開発する場合、コードはLinuxでコンパイルされる可能性がありますが、簡単にビルドするのは困難です。同じビルド手順を使用してプラットフォーム固有のプロジェクトファイル(Linuxのメイクファイル、WindowsのVSプロジェクト、MacのXCodeプロジェクトなど)を生成できるCMakeのようなビルドシステムを見てください。


4

ファイルを保存およびロードするための関数を作成するとき、またはネットワークを介して通信するときは、エンディアンネスを忘れないでください。

fread / fwriteまたはそのような低レベルの1回の呼び出しで大きな構造を読み取る代わりに、ReadByte / WriteByteおよびReadFloat / WriteFloatを作成します。後で別のプラットフォームをターゲットにする場合、変更する場所が少なくなります。


+1 *9000。これは、実際に現代/使用アーキテクチャ(RISC)の観点から携帯電話にのみ適用されると思います。それでも重要です。
ジョナサンディキンソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.