C ++が王様のように見えますが、私が言ったことから、Cはゲーム、特にコンソールでまだ広く使われています。しかし、Cでゲームエンジン全体を記述することは、今日では不合理でしょうか?CがC ++よりも優れている点はありますか?なぜ誰かがC ++を介してCを使用したいのでしょうか?
C ++が王様のように見えますが、私が言ったことから、Cはゲーム、特にコンソールでまだ広く使われています。しかし、Cでゲームエンジン全体を記述することは、今日では不合理でしょうか?CがC ++よりも優れている点はありますか?なぜ誰かがC ++を介してCを使用したいのでしょうか?
回答:
しかし、Cでゲームエンジン全体を記述することは、今日では不合理でしょうか?
それは合理的ですが、質問はそれがあなたを何を買うのですか?Cが提供する極端な移植性を必要としない可能性が高く、哲学的に本当に設定されていない限り、C ++が提供するすべての機能を放棄するのは残念です。
CがC ++よりも優れている点はありますか?
コンパイル時間は改善されましたか?
なぜ誰かがC ++を介してCを使用したいのでしょうか?
それは主に美的な選択だと思います。多くの人がCが好きなのは、それがシンプルで最小限であり、すっきりしているからです。C ++には多くの優れた機能があります(名前空間だけで使用する価値があります)が、それは大きくて面倒です。
#define malloc(x) my_malloc(x)
#define free(x) my_free(x)
とあなたは今メモリをデバッグしています。C ++では、あなたはメモリを割り当てるために非常に多くの方法(新しい、malloc関数、クラスのコンストラクタなど)があるのでとき、配分されるかを知ることはありません
私は、いくつかの製品を出荷したpure-Cゲームエンジンと広範囲に協力してきました。CとC ++の両方のエンジンでの私の個人的な経験は次のとおりです。
これらの利点はすべて、シリアル化されたオブジェクトでテンプレートと継承の使用を控える抑制されたc ++コードを使用して簡単に達成できますが、C ++のより混乱する要素がなければ単純さを強制する方が簡単だというCTOの決定でした利用できます。
個人的には、forループで変数を正しく宣言する機能と継承の完全に正当な多くの使用法を本当に見逃したため、これは少し極端だったと思います。しかし、最終的にはすべてのことを考慮して、生産性を犠牲にすることはありませんでした
C ++とLuaで書かれた2DゲームエンジンをCとLuaに書き換えています。これまでの経験は非常に良好です。明らかに、ベクトル演算と行列演算を行うことはCで見栄えがよくありません。しかし、それとは別に、C ++開発者として10年以上費やした後の経験は非常に新鮮であることがわかりました。
Cには、C ++よりも多くの利点があります。
それとは別に、Cの考え方に入るには多くの利点があります。C ++では、物事を少し一般化しすぎて抽象的にすることがよくあります。CIでは通常、get-setメソッドなどを削除し、多くの場合、動的配列を使用するのではなく、固定サイズの配列を事前に割り当てます。多くの場合、Cでより短く、より簡単にデバッグできるコードになります。通常、データ構造はよりフラットで、デバッガーで簡単に表示できます。
公平を期すために、Cだけでアプリを作成することは決してありません。それが機能する理由は、Cを非常にうまく補完できるLuaのような高レベル言語と組み合わせるためです。
IdソフトウェアはCIでのエンジンのほとんどを書いていると信じています。Cで書かれたヴォルフェンシュタイン城への帰還を見ることができます。
私は上の私の経験のいくつかについて書いたC対Cのスケーラビリティ++とSTLのベクトルの欠点は、単なる配列と比較します。
最近、だれもがCを独占的に使用しているとは思いません。通常、Cはより高いレベルの言語と混ざり合っています。
Cでのプログラミングには、たとえばC ++でのプログラミングに比べていくつかの利点があります。C ++ は、ユーザーには見えない多くのことを内部で実行できます。注意しないと、パフォーマンスが低下する可能性があります。キャッシュの使用に関しては、C ++ がひどくなり、パフォーマンスが低下する可能性があります。
したがって、ゲームのパフォーマンスに重要な部分を、従来のC ++の方法ではなく、Cのような方法で記述することには、いくつかの利点があります。しかし、最近、Cでゲーム全体を実際に書いている人を聞いたことはありません。
iPhoneなどの一部のプラットフォームでは、C ++を使用すると、特定のキロバイト単位で実行可能ファイルのサイズを増やすことができます(どれだけ忘れたのか、すみません)。これが、一部のiPhone開発者がCとObjectiveを組み合わせてコードを記述する理由です-C。
今日、C ++の代わりにCでゲームエンジンを作成するのが不合理である理由を、STLとBOOSTで説明します。
私はそれが執筆さらに別の価値があるだろうか想像することはできませんlist
あなたが箱から出して動作するコードに頼ることができたときに実装(とあなたが書く必要はありませんので!)
もちろん合理的です。私は個人的にそれをしないだろうし、私が知っているほとんどのCファンは実際には.cppファイルにCのようなコードを書くだけだ。しかし、言語はそれが本当に重要でない場所に十分に似ています。
誰かがこれを行うことを選択する理由については、主に反C ++の哲学によるものだと思います。個人的には、これが「CスタイルC ++」よりもCを選択する良い理由だとはまだ思いません。typedef struct crazinessは、Cを回避するのに十分な理由であり、他にも多数あります。
残念なことに、CとC ++はどちらもかなりひどい言語です。これが、近年人々がスクリプトで多くのコードを実行しようとしている理由の1つです。
Cで働いている人々の例を探しているなら、idを無視できます。私は彼らがずっと前にCを放棄したことを読んだことを思い出します。ただし、Cryptic Studios(Star Trek Online)はすべてのエンジン開発をCで行います。私の知る限り、そうです、それは具体的な利点よりも哲学のせいです。
可能な良い答えは「両方を使用する」かもしれませんか?
panda3dプロジェクトは最適化され、cythonを使用するかそれらの部分を再コーディングすることでボトルネックを解消できると聞きました。
ほとんどの場合、最適化が必要な部分は多くの反復とネスト、または多くの数値計算を伴う部分であるため、私の(野生の)推測は、Cを使用して両方の言語を使用することです低レベルのプログラミングが多く含まれるパーツの場合、スピードが必要なパーツにはC ++言語を、ゲームの残りの部分にはC ++を誤用することはできません。
理想的には、高レベルを念頭に置いてエンジンの高速部分を実行し、ネスト/ループをはるかに少なく使用するスクリプト言語またはC ++を使用します。
もちろん、エンジンを特別な種類のゲーム専用にする場合を除き、開発者が行う必要があるすべてのゲームに適合するエンジンを作成することはできません...
しかし、私は経験豊富なゲーム開発者でも経験豊富な開発者でもないので、アドバイスを当然受けないでください。Cは、ゲームと同じくらい大きなプロジェクトのために、高速で良いC ++コードを書くことを強制していると思います別のものです...
CはJohn Carmackで働いていたので、Cを使用することで多くの利点を得ることができますが、Cを利用して利益を得るまでには時間がかかります。
ここでは、一部がCで記述されたゲームエンジンのリストを見つけることができます。ソースコードを調べることで、Cゲームエンジンの実行方法に関する洞察を得ることができます。
Cコードは通常、有効なC ++コードです。
C ++の主な問題はそれを間違って使用していることです(Linus Torvaldsはこの理由でそれを嫌っています、彼はライブラリの移植性などの他の問題も持っていたので、彼はオペレーティングシステムレベルで働いており、あらゆるランダムで物事を実行する必要がありますそこにチップ)。
たとえば、c ++ std :: vector <>(または同様のコンテナ)に対してcstyle array []を使用する利点はほとんどありません。
ベクトルはタイプセーフであり、境界チェックできます(get()または[]のいずれかを使用して要素にアクセスできます。配列チェックメソッドを使用しない場合でも、ポインターでサイズを移動するのではなく、サイズを照会できます)。
ただし、たとえば、コンストラクターでデフォルトサイズを宣言しない場合、ベクトルは遅くなる可能性があります。また、ベクターに物事を追加すると、サイズを変更する必要がある場合に速度が低下する可能性があります。C ++ 11には、均一な初期化(同じ構文を使用してベクトルを宣言および初期化できる)などの多くの利点も追加され、コピーを回避できる移動コンストラクターがあります。独自のカスタム初期化子を作成することもできます(何らかの理由でmallocを使用する以外のことをしたい場合)。
またはもちろん、サイズを変更する必要がある場合、ベクターを使用する方が簡単です。mallocをいじったり、手動でコピーしたりする必要はありません。
C ++はオブジェクト指向のコードを提供します。コンパイルすると、実際にコードを操作する人間の抽象化に過ぎないため、同じくらい効率的になります。コンストラクターのようなものはオブジェクトの作成を遅くすることができますが。ただし、デフォルト値を設定するにはコンストラクターが必要です。そうでない場合は、コンストラクターを使用せずに(()を省略することで)オブジェクトを初期化できます。
しかし、オブジェクト指向により、ゲームのプログラミングがはるかに簡単になります。ゲームはしばしばオブジェクトを扱います。