C++は、自分のメモリを細かく管理し、入力しすぎて(hello std::vector<Thingy>::const_iterator it = lotsOfThingys.begin()
)、コンパイル時間が長くて退屈になるため、時間がかかりすぎます。本格的なリアルタイムグラフィックプログラミングの唯一の最良の選択肢は何ですか?ガベージコレクションは必須であり(必要に応じて使用を回避する機能も同様)、速度はC++と競合する必要があります。 Cライブラリにアクセスするための合理的な話も必須です。
(完全な開示:これに対する私自身の答えがありますが、リアルタイムグラフィックス作業のためのC++の優れた代替手段として他の人が見つけたものに興味があります。)
編集:思いやりのある返信をありがとうございました。この質問に対する「正しい」答えが実際にはないことを考えると、私は特定の答えを選択しません。それに加えて、C++の代替として、たまたま好きな言語を選ぶだけで、それは実際には公平ではありません。
私はC++を捨てません。実際、C++ライブラリにBoostを追加することを検討します。これにより、言語がはるかに使いやすくなります。あなたの例は次のようになります:
BOOST_FOREACH( Thingy& t, lostOfThingys ) {
// do something with 't'
}
Boostには、C++をより良い言語にするのに役立つツールがたくさんあります。
C#は、要件に合った優れた言語であり、Visual StudioやXNAなどの優れたツールやライブラリを提供するMicrosoftの努力のおかげで、グラフィックスに間違いなく適しています。
私はあなたの前提に同意しません。注意深く適切に使用すると、C++は、特に速度が重要なリアルタイムグラフィックスのようなドメインに最適な言語です。
システムを適切に設計し、stlコンテナとスマートポインタを使用すると、メモリ管理が容易になります。
std::vector::const_iterator it = lotsOfThingys.begin())
を使用すると、はるかに短くなります
using namespace std;
typedef vector::const_iterator ThingyConstIter;
また、システムを合理的に自己完結型のモジュールに分割するか、プリコンパイル済みヘッダーを使用するか、PIMPLイディオムを使用することで、コンパイル時間を大幅に短縮できます。
リアルタイム+ガベージコレクションがあまり一致しないのではないかと思います。
ガベージコレクターがいつでも起動して未定義の処理量を費やす可能性がある場合、リアルタイムの応答を保証するのは少し難しいです...
新しい「自動」の使用について言及することを忘れないでください。
auto it = lotsOfThingys.begin(); // Let the compiler figure it out.
auto it2 = lotsOfFoos.begin();
if (it==it2) // It's still strongly typed; a Thingy iter is not a Foo iter.
おそらくハイブリッドアプローチ。 PythonとC++は適切な組み合わせになります(たとえば、PyGameを参照)。
マシンコードにコンパイルするLISPのいくつかのバリエーションは、この種のプログラミングではC++とほぼ同じくらい高速である可能性があります。 Naughty Dog チームは、 Game Oriented Assembly LISP と呼ばれるLISPのバージョンを作成しました。これは、JakおよびDaxterシリーズを含むいくつかのAAAタイトルを作成するために使用されました。ゲーム業界におけるLISPアプローチの2つの主な障害は、C/C++開発の定着した性質(ツールと人的資産の両方がC/C++に多額の投資を行っている)と、スターである才能のあるエンジニアを見つけることの難しさです。ゲームプログラミングドメインとLISP言語の両方。
業界の多くのプログラミングチームは、リアルタイムコード、特にグラフィックスと物理コードがCまたはC++で記述されるハイブリッドアプローチに移行していますが、ゲームロジックは、アクセス可能な高レベルのスクリプト言語で実行されます。プログラマーと非プログラマーの両方が編集できます。 Lua と Python は、どちらも高レベルのスクリプトで人気があります。
3D VRアプリケーションの開発者/研究者/教授として約20年間、代替手段はないことをお勧めします(おそらくCを除く)。レイテンシーを削減し、リアルタイムの対話を可能にする唯一の方法は、OpenGLなどの高速で信頼性の高い3Dグラフィックライブラリにアクセスできる最適化されたコンパイル言語(CやC++など)です。すべてをコーディングしなければならないのはイライラすることですが、これはパフォーマンスと最適化にも不可欠です。
時々、殴られた道の外を見ると、本物の宝石を見つけることができます。あなたは考慮したいかもしれません PureBasic (名前があなたを誤解させないでください)。詳細は次のとおりです。
PureBasicの機能
PureBasic( http://www.purebasic.fr/english/index.php )またはメインサイトのより良いアイデアを得るためにオンラインフォーラムにアクセスしてください: www.purebasic.com
グラフィックプログラミング用のC#についての言及に完全に同意します。マネージド言語であるというわずかな欠点があり、ガベージコレクターがアプリケーションを自由に支配できるようにすることは、しばらくするとフレームレートの自殺になりますが、プログラムの初期段階で比較的インテリジェントなプール割り当てを行うことで、実際の問題を回避できます。
何人かの人々がすでにXNAについて言及していますが、これは非常に友好的で十分に文書化されており、私もその推奨事項を繰り返したいと思います。私は個人的に趣味のゲームプロジェクトにそれを使用しています、そしてそれは私をとてもよく扱いました。
ただし、XNAだけが代替手段ではありません。また、Managed DirectX(XNAを支持してMicrosoftによって廃止されたと私は信じています)と同様の方法でDirectXの無駄のないラッパーを提供する手段として絶えず開発されているSlimDXもあります。どちらも調査する価値があります: http://code.google.com/p/slimdx/
特にコンソールでは、大きなAAAタイトルの真の代替手段はありません。小さいタイトルの場合は、C#で行う必要があります。
Dプログラミング言語は良い選択肢だと思います。 Cオブジェクトファイルにリンクし、Cライブラリを介してC++コードとインターフェイスできます。 Dにはガベージコレクション、インラインアセンブリがあり、ゲーム開発者はSDLおよびOpenGLライブラリへのバインディングを作成しており、新しいゲーム開発APIにも積極的に取り組んでいます。私はDが大好きです。残念ながら私の仕事はそれを使うことを要求していません。 :(
C#はここでの良い答えです-それは公正なガベージコレクションを持っています(あなたはそれをかなりプロファイリングする必要がありますが-メモリ処理全体があなたの手に負えなくなった今あなたが物事を処理する方法を変えるために)、それは簡単です使用し、多くの例があり、十分に文書化されています。 3D部門では、シェーダーとエフェクトを完全にサポートしているので、それが私の選択です。
それでも、C#はC++ほど効率的ではなく、オーバーヘッドのために遅いので、好きな本のトリックを使用する速度と柔軟性がある場合(手を汚したい場合はポインターとアセンブリを使用)-に固執するC++と価格は、あなたが述べたようにはるかに多くのコードを書くことになりますが、メモリ管理を含むすべてを完全に制御できます。
私はc ++ 0xに投票します。部分的なサポートは、-std = c ++ 0xフラグを使用してgcc-4.3 +ですでに利用可能です。
Windowsをターゲットにしている場合、特にC++エクスペリエンスを活用したい場合は、C++/CLI(Microsoftの.NETの「マネージド」ダイアレクトであるC++)が興味深い可能性です。ネイティブコード(Cスタイルライブラリへの呼び出しなど)を.NETマネージコードと非常にシームレスに組み合わせることができ、.NETGCとライブラリを利用できます。
GCが「リアルタイム」のパフォーマンスに影響を与えることについての懸念に関しては、それらは誇張される傾向があると思います。多世代の.NETGCは、ある種の重大なメモリ不足の状況にない限り、収集に多くの時間をかけることはありません。私は電子デリバティブ取引所と相互作用する.NETコードを作成します。ここでは、時間遅延==多くの$$$があり、GC関連の問題は発生していません。数ミリ秒はGCにとって長く長い時間ですが、「リアルタイム」ゲームでさえ、ソフトウェアの一部と対話する人間にとってはそうではありません。真の「リアルタイム」パフォーマンス(医療機器、プロセス制御など)が本当に必要な場合は、とにかくWindowsを使用できません。これはリアルタイムOSではありません。
たくさんのゲームエンジンがあなたのニーズに合うと思います。たとえば、移植性が必要な場合は、SDLまたはCairoを使用します。多くのスクリプト言語(一般に簡単な構文とガベージコレクションが付属しています)は、これらのキャンバスにバインドされています。
フラッシュは別の選択肢かもしれません。
Processing は、画像、アニメーション、インタラクションをプログラミングしたい人のためのオープンソースプログラミング言語と環境です。
実際には、これはJavaの薄いラッパーであり、スクリプト言語のように見えます。数行のコードを入力してRunを押すことができれば、(プリミティブ)IDEファイルを保存します。実際には、コードをクラスにラップしてmain()呼び出しを追加し、コンパイルしてウィンドウで実行します。
多くの人がリアルタイムの展示会(VJなど)に使用しています。 Javaの能力と制限がありますが、Java2D、OpenGL、SVGなどへのアクセスを簡素化するために、すぐに使用できる多数のNiceラッパー(ライブラリ)が追加されています。
どういうわけか、それは単純なグラフィック言語のモデルになりました。Ruby、Scala、Pythonなどの他の言語でProcessingを模倣しようとするアプリケーションがいくつかあります。最も印象的なものの1つはJavaScriptの実装です。 Firefox、Safari、Operaなどに実装されているcanvas
コンポーネントを使用します。
ジェームス(ホプキン)のように、私にとっては、ハイブリッドアプローチが最良の解決策です。 PythonおよびC++は良い選択ですが、C#/ C++のような他のスタイルも機能します。すべてグラフィカルコンテキストによって異なります。ゲームの場合、XNAは優れたプラットフォーム(win32に限定)です。この場合C#/ C++が最適なソリューションです。科学的な視覚化には、Python/C++が受け入れられます(Pythonでのvtkのバインディングなど)。モバイルゲームの場合、Java/C++は機能します...
「C」はあまりにも明白な答えでしょうか?
私はエンジンにC++を非常にうまく使用しており、アプリケーションはLuaで書かれています。 JavaScriptも非常に実用的であり、現在、最新世代のJITベースのJSエンジン(tracemonkey、V8など)が出回っています。
C++はまだしばらくの間私たちと一緒にいると思います。 Tim Sweeneyでさえ実際には Haskellに切り替えられました (pdf)まだ、AFAIK :-)
JavaとLWJGL(OpenGLラッパー)は私にとってうまく機能しました。 Orgeのようなシーングラフタイプライブラリをもっと探している場合は、Google Earthタイプのアプリケーションを作成するために使用したjMonkeyEngineをご覧ください(www.skapeworld.comを参照)。オブジェクトの作成に精通している場合、ガベージコレクションは問題ではありません。
Adaを見ることができます。ガベージコレクターはありませんが、この言語は、高い信頼性を必要とするリアルタイムシステムでよく使用されます。つまり、3Dアプリケーションのデバッグ時間が短縮されます。
また、Haskellも参照できます。関数型パラダイムがわからない場合、この言語は奇妙に見えますが、少し時間をかける価値があります。 Tim Sweeney(EPIC Inc)は、この言語をC++の代替言語と見なしています。
良い質問。 「入力しすぎ」については、C++ 0xは、次のようにそのほとんどに対処しているようです。
auto it = lotsOfThingys.begin())// ... * MLのように、型を推測しますVS2010betaはすでにこれを実装しています。
メモリ管理に関しては、効率のために、ガベージコレクションの有無にかかわらず(つまり、メモリプールを作成し、割り当てられたオブジェクトを再利用する場合があります)、メモリ割り当てを適切に追跡する必要があります。これにより、最終的に環境がガベージかどうかがわかります。収集されたかどうかは、それほど重要ではありません。メモリが断片化しないように、gc()も明示的に呼び出す必要があります。メモリを管理する一貫した方法を持つことはどこでも重要です。 RAII-C++のキラー機能です-もう1つ-メモリは1つのリソースにすぎないため、GCを使用して他のリソースを追跡する必要があるため、RIAAです。
とにかく、C#は多くの点で優れた代替手段であり、特に関数型コードを記述できる機能(かわいいラムダ->構文、マップ/選択 'LINQ'構文など)は非常に優れていると思います。並列コードを書く可能性;それはまだ「標準の中括弧」ですが、あなた(またはあなたの同僚)がそれを必要とするとき。
プロジェクトに最適な環境は、可能な限り最速の方法でタスクを実行できる環境です。これ(特に3Dグラフィックスの場合)にはライブラリが含まれます。
タスクによっては、いくつかのマイナーなDirectXハッキングで逃げることができます。次に、.NETと slimdx を使用できます。管理された言語は、プログラミングが速く、デバッグが容易になる傾向があります。
おそらくあなたは本当に良い3Dエンジンが必要ですか? Ogre3D または Irrlicht を試してください。商用グレードの品質が必要です(Ogre3Dがそれを提供していると主張する人もいるかもしれません)-CryengineまたはUnrealを選択してください。 Ogre3DとIrrlichtでは、.NETも使用できますが、ポートは常に最新であるとは限らず、プラグインはC++バージョンほど簡単には含まれていません。 Cryengine/Unrealengineの場合、私が推測する本当の選択肢はありません。
もっとポータブルが必要ですか? OpenGL 救助のために-ラッパーが必要になる場合があります(例: [〜#〜] sdl [〜#〜] )。
GUIも必要ですか? wxWidgets 、 [〜#〜] qt [〜#〜] 可能性があります。
あなたはすでにツールチェーンを持っていますか?ライブラリはファイル形式を処理できる必要があります。
あなたは図書館を書きたいですか?世界のほとんどがC/C++ライブラリを使用できるため、C/C++が解決策になる可能性があります。おそらくCOMを使用して?
私が言及しなかったプロジェクト/ライブラリはまだたくさんあり(XNA、Boostなど)、3Dグラフィックスを表示するだけでなく、他のニーズもあるかもしれません(入力、サウンド)。 、ネットワーク、AI、データベース、GUI、...)
要約すると、プログラミング言語は目標を達成するためのツールです。それは、目前のタスクのコンテキストで見る必要があります。タスクには独自のニーズがあり、これらのニーズによって言語が選択される場合があります(たとえば、プログラミングに時間がかかる機能を取得するには特定のライブラリが必要であり、言語Xでのみライブラリにアクセスできます)。
1つでほぼすべてが必要な場合:C++/CLIを試してください(構文を簡単にするために、おそらくC#と組み合わせて)。
Delphi/Pascalオブジェクトといくつかの例をご覧ください: http://www.delphigamer.com または http://glscene.cjb.net/
ターゲットがPCの場合は、C#を試すか、C++アプリにLuaを埋め込んで、「高レベル」のもののスクリプトを実行できると思います。ただし、ターゲットがコンソールの場合は、必須自分のメモリを管理する必要があります。
あなたの探求において独立した言語を見落とさないでください。 Ionic WindSoftwareのEmergenceBASICには、DirectX 9エンジンが組み込まれており、OOPをサポートし、Cライブラリと簡単にインターフェイスできます。
ジェームズ。
ガベージコレクションは必須です(必要に応じてその使用を回避する機能も同様です)
ガベージコレクタを一時的に無効にすることはできません。その場合、決定論的なガベージコレクターが必要になります。しかし、そのような獣はパフォーマンスヒットも伴います。 BEA JRockitはそのような獣だと思うので、Javaに固執する必要があります。
あなたの例についてコメントするだけです。 typedefはあなたの友達です...
typedef std::vector<Thingy> Thingys;
Thingys::const_iterator it = lotsOfThingys.begin()
Objective-Cは、動的すぎてSmalltalkに似ていますが、要件によく一致しているように見えます(オプションのGCを備えた最新バージョン)。
XNAが最善の策だと思います。 .NET Frameworkでサポートされているため、GameStudioの設定を変更するだけでWindowsまたはXbox360プラットフォーム用に構築できます。しかも、すべてのツールは無料です。
XNAを使用することにした場合は、クイックスタートガイドを使用して簡単に開始できます XNAクイックスタートガイド
これまでのところ、やりがいのある楽しい経験であり、C++のメモリ管理からの素晴らしいブレークです。