カスタムエンジンを使用して複数のプラットフォームで実行するにはどうすればよいですか?


13

UnityやUnrealなどのゲームエンジンは、複数のプラットフォームで実行できます。私は彼らがこれをどのように行っているのだろうかと思っています。

私はしばらくの間C ++とOpenGLを使用していましたが、私が探しているのは、書き直さずに異なるプラットフォームで実行できるようなものを統合するためのリソースです。ベースAPIを使用してコードを記述し、APIがそれをHTML、Android、iOSなどに変換するLibGDXのようなもの。私は自分で書く代わりに別のエンジンを使用できることを知っていますが、学習体験に興味があります。

回答:


26

エンジンを各プラットフォームに移植します。それについて特別なことは何もありません。Windows専用のコードがある場合は、ファイルに#ifdefロジックを追加するか、他のOSでその機能を実装する2番目のファイルを追加します(そのためFooWindows.cppFooLinux.cpp必要なものは何でも)。 。

Unity自体がエンドユーザーによって変更されることはないため、Unityのようなエンジンが持つワンクリックパブリッシュは許可されます。スクリプトとデータを記述しているだけなので、エンジンにはすべてのプラットフォーム用のビルド済みのバイナリがあり、公開ボタンはそれらのバイナリをデータと一緒にバンドルするだけです。

他のエンジンは、ビルドシステムとクロスコンパイラに依存して、必要なときにコンパイルされたゲームを作成します。これは、ゲーム以外のクロスプラットフォームアプリケーションで行うのと同じです。

HTML5などには、JavaScriptで実行するC ++アプリケーションをコンパイルできるemscriptenなどのツールがあります。基本的にemscripten用にエンジンの別のポートを作成する必要があります(任意のC ++ライブラリ/機能を使用できないため)。

ゲーム全体を書き直す必要はありませんが、サポートする新しいプラットフォームごとに多くの開発、コーディング、移植作業を行う必要があります。


14
クロスプラットフォームソフトウェア(最大のプロジェクトはHotSpot)を扱った私の経験では、コードを通してifdefがスローされるのを避けたいと本当に思っています。share/os/<linux>(またはshare/cpu/x86)のようなものを用意し、そこにすべてのプラットフォーム固有のコードを入れてから、条件付きインクルードを行うのは間違いなく良いです。これは、少なくともgcc、HotSpot、Linuxカーネルが行うことです(確かに難しい規則ではありません)。はい、プラットフォームに依存する単一の機能のみで開始し、それが過剰であると考えるかもしれませんが、それはそのようにとどまることはなく、そうでなければすぐに混乱になります。
VOO

14

ここには魔法の弾丸はありません。ゲームを複数のプラットフォームで実行したい場合は、複数のプラットフォーム用のコードを作成する必要があります(または、既にこれを行っているサードパーティのライブラリを活用します)。

あなたが求めているものは整合していません:あなたは言います(強調鉱山)

私が探しているのは、書き換えることなく異なるプラットフォームで実行できるようにするものを統合するためのリソースです

しかし、それも(再び強調する)

自分で書く代わりに別のエンジンを使うことができることを知っていますが 、学習経験に興味があります

どちらか一方を行う必要があります:クロスプラットフォームサポートを提供するサードパーティのライブラリ、エンジン、および/またはツールチェーンを使用するか、クロスプラットフォームコードを記述して独自のライブラリを作成するか(利用可能なプラットフォーム上で独自の抽象化を行い、各プラットフォームにその抽象化を実装します)。

サポートは、これはどちらか彼らは、プラットフォーム固有のドライバの実行可能ファイルからロードされ、適切なプラットフォームの抽象化に対するあなたのコードを再コンパイル、またはその内部APIに対してライブラリやDLLを構築するためにあなたを必要とすることを非現実的またはユニティのようなゲームエンジン、彼らが適切なのためにコンパイルしていますプラットホーム。


2

他の2つの答え(C ++固有のものです)に反して、別の方法があります。頭に浮かぶいくつかのアーキテクチャ:

  • エンジンの移植:複数のプラットフォームで動作するようにコードを変更または作成します。これは上記の回答で対処されています。
  • クロスプラットフォームライブラリの上に何かを記述します。これは、Java上で実行されるlibGDXの例です。Javaは、デスクトップ、Android、およびiOS(RoboVM経由)で実行されます。Javaのようなものを使用することで、基盤となるライブラリ/ツールがサポートしている場合、無料の追加プラットフォームの利点を得ることができます。この場合、RoboVMが登場したとき、libGDXは(ほぼ)iOSで「動作する」だけです。
  • コードジェネレーターを記述する:これは、Haxeおよびその他のツールのアプローチです。コア言語(Haxe / AS3など)があり、他の言語の出力を生成するコンバーターを作成します。例えば。Haxeは、C ++ for Desktop、Java(私は思う)for Androidなどに変換します。

個人的には、libGDXのアプローチが最も簡単であることがわかります。ニーズを満たす言語またはプラットフォームを見つけて、その上に書きます。コード生成とポータブルエンジンは複雑で、うまく書くのは難しいです。

libGDXは、主要な携帯電話、デスクトップ、およびWeb(アプレットまたはGoogleのWebコンパイラを介して)の両方にヒットするため、実際には素晴らしい選択肢です。


JavaまたはC#を使用しても、クロスプラットフォームコードを魔法のように取得することはありません。プラットフォームに依存する可能性のあるサードパーティのライブラリを認識する必要があります(たとえば、SlimDXまたはSharpDXは、クロスプラットフォームのC#プロジェクトには適していません)。

@JoshPetrieを使用すると、独自のC ++エンジンをローリングしてプラットフォーム間で移植するのに比べて、確かに「無料」で多くを得ることができます。
ashes999 14

@ ashes999答えてくれてありがとう、libGDXは素晴らしいです、私はそれを使用しますが、クロスプラットフォームで動作するように書いてCMakeを使用します。既存のライブラリまたはエンジンを使用するよりも挑戦のために
ダニエルコリアー14

2

現在、クロスプラットフォームのゲームエンジンを構築しています。痛みを和らげるために、グラフィックアプリケーションを構築するための優れた(そして適切な低レベルの)クロスプラットフォームライブラリであるSDLを使用しています。

ただし、これを超えると、プラットフォームごとに多くの「カスタムコード」があります。これはあなたが通過しなければなりません。これまでのところ、開発時間のごくわずかな時間であり、ほとんどがネイティブLinuxほど馴染みのないシステムのドキュメントの検索に費やされています。

使用しないでください #ifdefコード全体でどこでもください。代わりに、主要なプリミティブの周りに抽象化を構築します(そのようなプリミティブの例はTCPソケットかもしれません)。

環境ごとに異なるソリューションを必要とする新しい問題が発生した場合は、「既に構築したクロスプラットフォームプリミティブのみを使用してこの問題を解決できますか?」答えが「はい」の場合、できればシンプルなクロスプラットフォームコードです。それ以外の場合は、不足しているプリミティブを把握して実装します。


0

学習体験としてこれを「ゼロから」行う場合は、Win32 APIを使用する必要があります。Win32APIでは、MSDNおよびOpenGL wiki(http:// www .opengl.org / wiki / Creating_an_OpenGL_Context_(WGL))。Linuxについては、O'Reilly XlibプログラミングマニュアルXlibリファレンスマニュアルのコピーを入手し、GLX(X Window SystemのOpenGL拡張)を参照してください。http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)参照してください

次に、同じこと(ウィンドウを開くなど)を行う関数を使用して、アプリケーションに同じAPIを提供するだけで、プラットフォームごとに異なる実装が必要になります。さまざまなプラットフォーム用にエンジンの一部を書き換えます。次に、エンジンを使用して作成するゲームは、一度書くだけで済みますが、異なるプラットフォームで動作します。


答えてくれてありがとう。でも、ウィンドウ処理にはSDL2を使い、そのクロスプラットフォームで、とても使いやすいです。どれだけLibGDXはウインドウのためにLWJGLを使用しています
DanielCollier
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.