マイクロ最適化-BAD対ゲーム開発


12

ゲーム開発では、ビジネスアプリケーションC#に多くのC / C ++があります。C / C ++開発者は、1行のコードがアセンブリにどのように変換されるかについて懸念を表明するのを見てきました。.NETでは、まれにILに入る人もいます。

C#では、「マイクロ最適化」は眉をひそめ、まれであり、通常は時間の無駄です。これは、ゲーム開発では当てはまらないようです。

この矛盾を具体的に引き起こすのは何ですか?ゲームは常にハードウェアの限界を押し上げていますか?はいの場合、ハードウェアが向上するにつれて、より高いレベルの言語がゲーム業界を引き継ぐことを期待する必要がありますか?

ゲーム開発言語としてのC#の実現可能性に関する議論を探しているのではありません。私はそれがある程度行われたことを知っています。マイクロ最適化に焦点を当てます。具体的には、ゲーム開発とアプリケーション開発の違い。


ゲームによる更新私は、近代的で大規模な開発を意味します。EG MMORPG、Xbox、PS3、Wii ...


3
私はゲーム開発者とアプリケーション開発者として働いてきましたが、違いはほとんどありません。プロファイリングを伴わないマイクロ最適化は、両方で嫌われています。多くのゲームには非常に強力な要件がなく、最適化を必要としません。一部のビジネスアプリケーションでは、平均的な60Hzゲームよりもはるかに厳しい要件(稼働時間やリアルタイムの保証など)が必要です。
デイブヒリアー

1
余分な要因の1つは、ビジネスアプリケーションでは、通常、ハードウェアを(理由の範囲内で)選択できることです。さらに処理能力が必要な場合は、別のサーバーを購入するか、AWSでより多くの時間を支払うことができます。ゲームでは、最新のハードウェアが必要なため、60ドルのゲームが1,060ドルのゲームとビデオカードになります。コンソール用に開発している場合、ハードウェアのアップグレードは、次世代を待つために何年も遅れることを意味する場合があります。より良いハードウェアが手に入らないときは、それをもっとうまく利用しなければなりません。
アンドリュー

回答:


17

ビジネスアプリケーションでは、CPUが常にボトルネックとは限りません。ビジネスアプリケーションは、ほとんどの時間を待機します。例えば:

  1. データベースクエリからの結果を待つ
  2. Webリクエストの終了を待っています
  3. ユーザーがUIアクションを行うのを待っています

それが、処理パフォーマンスを最適化するコードがあまり価値をもたらさない理由です。

主な考慮事項は次のとおりです。

  1. 市場投入までの時間
  2. シンプルさ、他の誰かがコードを理解して維持できるか

6
データベースクエリを最適化するコードは、ビジネスアプリケーションの使いやすさを大幅に改善できることを指摘します。
HLGEM

4
+1。データベースとネットワークの最適化は、通常、ビジネスアプリケーションでの支出に見合うだけの価値をもたらします。たとえば、JSONとXMLの選択、DBインデックスのチューニング
Shamit Verma

2
+1ただし、方程式の反対側を追加する必要があります。ゲームの流動性が依存する魔女のゲームの「メインループ」とレンダリングは、品質が知覚できるため、1マイクロ秒ごとに価値を失います。目や他の感覚に。
クライム

1
よく言った。そして実際、ビジネスアプリとゲーム開発を行った後、ゲームの内部ループを熟読するのと同じように、より多くのパフォーマンスを引き出すために複雑なSQLクエリを熟読することに時間を費やしました。
Carson63000

早すぎる最適化がすべての悪の根源であることに戻ります。プロファイリングにより、平均的なビジネスアプリケーションに費やされる時間のほとんどがネットワーク+データベースIOであることが明らかになります。
アレックスReinking

13

ビジネスアプリケーションでは、マイクロ秒が重要になることは非常にまれです。ゲームでは、それは人生の事実です。

ゲームを1秒あたり60フレームで実行したい場合、そのフレームに必要なすべてのこと(入力、物理、ゲームプレイロジック、オーディオ、ネットワーク、AI、レンダリングなど)を行うには、約16.67ミリ秒が必要です。運が良ければ、30 fpsで実行し、33.3ミリ秒という豪華な時間を過ごします。フレームは時間がかかりすぎる場合は、あなたのレビューは、あなたのプレイヤーが胆汁とインターネットフォーラムを記入します、苦しむことになると、あなたは(あなたの専門誇りに打撃を言及していない)可能性があるとして、あなたは同じくらい売れないだろうと、あなたはなら本当にあなたの不運チームがビジネスアプリケーションをコーディングして生計を立てます。

もちろん、ゲーム開発者はすべての行について心配する必要はありません。経験と適切なプロファイラを使用すると、心配する必要のある行を知ることができます。一方、これらの心配は、ビジネスの世界ではおそらくマイクロ最適化ではなくナノ最適化と見なされるものに触れることがあります。

同等の、予測可能なパフォーマンスを提供するまで、C ++を高レベル言語が追い出すことを期待しないでください。


8
高周波取引アプリケーションでは、マイクロ秒が重要です!
quant_dev

2
@quant:ロボット工学、電力網、ロケット、医療技術など、ほとんどのストリーム処理アプリケーションと同様に、大量のバックログを蓄積し、追いつくまでには遅すぎるかもしれません。
アーロンノート

@quant_dev:高頻度取引アプリケーション非常にまれです。
molbdnilo

もう違います。会計アプリケーションよりもまれですが、たとえば飛行機の設計ソフトウェアよりも一般的です。
quant_dev

ビジネスアプリでもマイクロ秒が重要であり、ボトルネックは通常、他の場所(ネットワーク全体、データベースまたはファイルシステム)にあります。
ラバーダック

9

さて、CとC ++の開発者が個々の行に夢中になっているのを見たことがあるでしょう。私は、彼らがすべての行に夢中になっていないに違いない。

最大のパフォーマンスが必要な場合があり、これには多くのゲームが含まれます。ゲームは、同じハードウェアでの競争よりも見栄えを良くするために、常にパフォーマンスの限界を押し広げようとしました。これは、通常の最適化手法をすべて適用することを意味します。アルゴリズムとデータ構造から始めて、そこから進んでください。プロファイラーを使用することにより、どこで最も時間がかかっているか、そして数行を微最適化することで大きな利益を得ることができる場所を見つけることができます。

これは、言語が人々を強制するからではなく、人々がやりたいことに基づいて言語を選択するからです。プログラムのパフォーマンスの最後の部分を絞りたい場合は、C#を記述してCLRにコンパイルせず、JITコンパイラー(または何でも)が良い仕事をすることを望みます。出力。CまたはC ++(およびおそらくC ++の制限されたサブセット)を使用して、アセンブリ言語の出力とプロファイラーの結果を調べます。

CとC ++を使用し、十分に高速であると思われる限り、翻訳の詳細についてあまり心配しない人がたくさんいます。


7

ゲームは常にハードウェアの限界を押し上げていますか?

はい、彼らはやる。

はいの場合、ハードウェアが向上するにつれて、より高いレベルの言語がゲーム業界を引き継ぐことを期待する必要がありますか?

そうではありません-ハードウェアが改善されると、消費者もゲームの改善を期待するからです。開発者がより高いレベルの言語を使用したため、同じ品質のゲームがより効率的に開発されることを期待していません。彼らは、新しいプラットフォームごとに靴下が吹き飛ばされることを期待しています。

もちろん、何らかの動きがあります。私が若い頃、ゲーム開発に最初に興味を持っていたとき、それは手書きのアセンブリでした。これはコモドール64時代でした。今日では、もちろん、C ++はほとんどのゲーム開発の共通語です。実際、エンジンコードにC ++を使用し、ゲームロジックコードに高レベルのスクリプト言語を使用する動きさえ見ました。たとえば、LUA、またはUnrealエンジンには独自のUnrealScript言語があります。


1
最近のゲーム開発者のかなりの部分に+1を作成し、他の誰かが作成したハイパー最適化エンジンレイヤーを使用してから、Pythonなどの細心の注意を払わないC ++を使用してまとめます。
モーガンハーロッカー

アンリアルは、スクリプトを「後方」にUnrealScriptからC ++に移動したことに注意してください。最新のC ++の素晴らしい点は、マイクロ最適化された低遅延コードと簡潔で高レベルのロジックの両方を作成できることです。他のほとんどの言語は、レイテンシーと多くの場合パフォーマンスも犠牲にすることによってのみ高レベルを達成します。
16年

7

C#では、「マイクロ最適化」は眉をひそめ、まれであり、通常は時間の無駄です。これは、ゲーム開発では当てはまらないようです。

高レベルのコードとライブラリコードを使用してアプリケーションを組み立てるだけであれば、時間の無駄です。その場合、必要に応じてインタープリター言語で記述してください。それほど違いはありません。CryEngine 3のように動的なシーンコンテンツをリアルタイムでリアルタイムにボクセル化する最先端のグローバルイルミネーションエンジンを実装しようとしている場合、当然ながら微最適化の必要性から逃れることはできません。


0

「ゲーム」は非常に包括的な用語です。たとえば、MMORPGがある場合、より小さな最適化は多くのプレイヤーに影響を与えます。

ゲーマーは、リアルタイムで一度に発生する比較的大量のことに慣れています。承知しました; かつては、応答性の高いパックマンまたはテトリスを持つことが目標でした。しかし、彼らはまだ応答する必要がありました。昨日、パケットドロップネットワーク接続を介した3DMMORPG。

最適化したいということは確かに理解しています。


0

ゲームは常に大量のバックグラウンド処理を行います。ビジネスアプリにはありません。


4
多くのビジネスアプリを実行しないでください。
ちょうど私の正しい意見

2
ビジネスアプリは、ステータスを毎秒60回更新する必要がないことを十分に理解しています。さらに、私は具体的に「絶えず」と言いました。
user16764

2
リアルタイム取引を聞いたことがありますか?
ちょうど私の正しい意見

0

私はいつも「マイクロ最適化」という用語をかなり曖昧に見つけました。メモリレイアウトとアクセスパターンに対する命令レベルの変更が、アルゴリズムの複雑さを軽減することなく、ホットスポットを測定する規律ある専門家から80倍速くなった場合、それは「マイクロ最適化」ですか?私にとって、それは実世界のユースケースで80倍高速化する「メガ最適化」です。このような最適化が顕微鏡効果をもたらすように、人々はこれらのことについて話す傾向があります。

私はもうgamedevで働いていませんが、VFXでパストレースなどの分野で働いており、複雑なシーンで毎秒約50万レイを処理するBVHとKDツリーの実装をたくさん見ました(そしてこれはマルチスレッド評価)。大まかに言えば、マルチスレッド評価でも、レイトレーシングコンテキストでBVHを100万光線/秒未満で簡単に実装する傾向があります。Embreeを除き、同じハードウェアで同じシーンで1億本以上の光線を処理できるBVHがあります。

これは、完全にEmbreeが200倍高速な「マイクロ最適化」によるものです(同じアルゴリズムとデータ構造)が、もちろん、それが非常に高速である理由は、その背後のIntelの開発者がプロ​​ファイラーと測定に頼る専門家であるためです本当に重要な領域を調整しました。彼らは、コードを意のままに変更し、保守性を著しく低下させる代わりに0.000000001%の改善を行った変更をコミットしていませんでした。これらは賢明な手で適用された非常に正確な最適化でした-それらは焦点の点では微視的でしたが、効果の面では巨視的だったかもしれません。

当然、ゲームのリアルタイムフレームレート要件では、ゲームエンジンでの作業のレベルに応じて(UE 4で作成されたゲームでさえ、少なくとも部分的に高レベルスクリプトで実装されることがよくありますが、しかし、たとえば、物理エンジンの最も重要な部分ではありません)、特定の分野ではマイクロ最適化が実用的な要件になります。

毎日私たちを取り巻く別の非常に基本的な領域は、リアルタイムで高解像度画像をぼかしたり、おそらくどこかで見たトランジションの一部としてそれらに他のエフェクトを実行したり、OSエフェクトなどの画像処理です。画像のすべてのピクセルを最初からループして、そのような画像操作を必ずしも実装できず、フレームレートが一致するようなリアルタイムの結果を期待できるわけではありません。CPUの場合、通常はSIMDといくつかのマイクロチューニングを検討しています。または、効果的に書き込むためにマイクロレベルの考え方を必要とする傾向があるGPUシェーダーを検討しています。

はいの場合、ハードウェアが向上するにつれて、より高いレベルの言語がゲーム業界を引き継ぐことを期待する必要がありますか?

むしろ、ハードウェアの進歩だけでそれができるとは思いません。ハードウェアが進歩するにつれて、命令とテクノロジー(GPUの物理学など)、テクニック、そして彼らが見たいものや競争に対する顧客の期待もそうなるからです。 WebGLで低レベルのGLSLシェーダーを作成しているWeb開発者の場合でさえ、開発者が再び低レベルになることが多い方法(この種のWeb開発は、おそらく10年または2年前よりもさらに低レベルです。 GLSLは非常に低レベルのCライクな言語であり、10年または2年前には、一部のWeb開発者がこのような低レベルGPUシェーダーの作成を受け入れるとは思いもしませんでした)。

パフォーマンスが重要な領域を高レベルの言語に移行する方法がある場合、利用可能なソフトウェア、コンパイラ、およびツールからより多くのものを取得する必要があります。近い将来、私にとっての問題は、ハードウェアが十分に強力ではないということです。それは、独自の言語に再び戻ることなく、変化し進歩するたびに最も効果的に話す方法を見つけることができない方法にもっと関係しています。実際、ハードウェアの変化が速いペースであるため、高レベルのプログラミングはこれらの分野で見かけているように見えにくくなります。仮に私たちのハードウェアが次の数十年間で突然前進しなくなった場合、

おもしろいことに、私が真のパフォーマンスクリティカルな領域で作業しているとき、私は(ボーランドターボC DOS時代に始まったとしても)始めたよりも低レベルであると思う必要があります。当時、CPUキャッシュはほとんど存在していなかったためです。それは主にDRAMとレジスタだけでした。つまり、パフォーマンスにあまり影響を与えることなく、アルゴリズムの複雑さにもっと焦点を当て、ツリーのようなリンクされた構造を非常に簡単な方法で書くことができました。最近では、CPUキャッシュの低レベルの詳細が、アルゴリズム自体と同じくらい私の考えを支配しています。同様に、マルチスレッドとアトミック、ミューテックス、スレッドの安全性、同時データ構造などについて考えさせなければならないマルチコアマシンがあります。で、私が始めたときよりも人間的に直感的ではありません)。

奇妙なことに、今では私にはとても真実に思えます。ノスタルジアメガネを脱ぐために全力を尽くすよりも、30年前よりも、今日のハードウェアの根本的な低レベルの複雑さと詳細に影響を受けていると思います。もちろん、ここで少し話し合ったのかもしれませんが、XMS / EMSなどの厄介な詳細を処理する必要がありました。しかし、ほとんどの場合、パフォーマンスが重要な領域で作業している今日よりも、複雑さやハードウェアとコンパイラの認識が以前よりも少なくて済むと思います。そして、私たちが執筆のように脇に置いておくと、それは業界全体にほとんど当てはまるようですif/else 人間が読みやすい方法でステートメントを作成し、最近の一般的な人々がハードウェアの下位レベルの詳細(複数のコアからGPU、SIMD、CPUキャッシュ、およびコンパイラ/インタープリター/ライブラリが動作するなど)。

高レベル!=効率が低い

この質問に戻って:

はいの場合、ハードウェアが向上するにつれて、より高いレベルの言語がゲーム業界を引き継ぐことを期待する必要がありますか?

私にとっては、ハードウェアの問題ではありません。オプティマイザーとツールについてです。私が始めたとき、人々は実際にすべてのコンソールゲームをアセンブリで書いていましたが、6502を生成する高品質のコンパイラが不足していることを考えると、真のパフォーマンス上の利点がありました。

最適化Cコンパイラの最適化がより賢くなると、Cで記述された高レベルのコードが競合するポイントに到達し始め、多くの分野で最高のアセンブリエキスパートによって記述されたコードよりも優れている場合があります(常にではありません)。そのため、少なくともゲームのコーディングの大部分でCを採用するのは簡単でした。そして、C ++のある時点で、同様の変化が徐々に起こりました。アセンブリからCへの移行による生産性の向上は、CからC ++への移行とは対照的に、ASMで完全に非自明なゲームを作成するgamedevsからの満場一致の合意に達する可能性があるため、C ++の採用は遅かったです。

しかし、これらのシフトは、これらの言語のオプティマイザが大幅に低レベルにレンダリングするほどハードウェアが強力になることによるものではありません(常にではありませんが、いくつかのあいまいなケースがあります)。

マルチスレッドやGPU、キャッシュミス、またはそのような(特定のデータ構造でさえない)ことを心配せずに、想像できる最高レベルのコードでコードを書くことができる仮想シナリオを想像でき、オプティマイザーは人工知能のようなものでしたデータを再配置および圧縮する最も効率的なメモリレイアウトを見つけ出し、あちこちでGPUを使用し、コードをあちこちで並列化し、SIMDを使用し、自分自身のプロファイルを作成し、人間としてIRをさらに最適化していくプロファイラーのホットスポットに対応し、世界最高の専門家に勝る方法でそれを行いました。それにより、最もパフォーマンスが重要な分野で働いている人でもそれを採用するのは簡単です...そしてそれは進歩です高速なハードウェアではなく、途方もなくスマートなオプティマイザーから来ています。


0

C#では、「マイクロ最適化」は眉をひそめ、まれであり、通常は時間の無駄です。これは、ゲーム開発では当てはまらないようです。

ここで用語の問題があります。あなたは言葉を正しく使用していますが、ゲーム開発者とビジネスマンは、2つの非常に異なる方法で同じ用語を使用しています。

ビジネスにとって「マイクロ最適化」とは、ソフトウェアによって実装されるビジネスプロセス全体の非常に小さなステップを高速化することを意味します。それが眉をひそめている理由は、通常、次のいずれかです。

  1. 同じビジネス価値を提供するのに余分なお金が費やされ、数秒の速度で。速度の改善で節約されるお金は、異なるお金のプール(ユーザーの時間)から得られるため、通常、ビジネスはそれを費やす努力の恩恵を受けず、クライアントはビジネスを犠牲にします。
  2. 通常、ビジネスプログラマはビジネスプロセス全体の可視性が低いため、1つのステップを最適化してもプロセス全体に良い利益がもたらされない可能性があります。たとえば、プロセスの3%を10倍高速化すると、プロセス全体の速度が2.7%向上します。
  3. 通常、ビジネスにはビジネス価値のある残りの作業の大きなリストがあり、同じ値を(おそらく)短い時間で配信するのではなく、その値を追加することを優先します。

ゲーム開発は別の獣です。「マイクロ最適化」は、関数またはルーチンの時間を少し節約します。

  1. ゲームシステムは、レンダリングサイクルに拘束される傾向があります。現在、ゴールデンスタンダードは1秒あたり60フレームであるため、計算されるすべての処理を1/60秒で実行し、画面にレンダリングする必要があります。
  2. これは、ゲーム中に同じルーチンが何千回から何十万回と呼ばれることが多いことを意味します。したがって、単一の機能の10倍の改善は、改善の利点が感じられる回数によって価値が拡大します。
  3. レンダリングレートを達成できないと、ゲームのプレゼンテーションに影響があります。ビデオは途切れ途切れになり、キャラクターは滑らかな動きの代わりにスキップやジャンプでアニメーションします。これにより、プレイヤーはすぐにゲームの没入状態から抜け出し、ゲームの価値を疑問視する領域に入ります。

したがって、ビジネスでは、4ステップのビジネスプロセスのフォームが0.6秒または0.5秒で表示されるかどうかは誰も気にしません。ゲーム中に、200ミリ秒かかるルーチンを100ミリ秒で実行できるようになるかどうかに注意します。

それはすべて、クライアントに提供される価値、クライアントのニーズ、および変更の費用便益比に関するものです。


-1

そのツールが特定のジョブのために選択された理由に関係しています。

ゴルファーは、ドライバーを使用しているときではなく、パターで方向と力に執着します。

どうして?ショットの種類が異なるからです。ドライブの場合、最大距離でフェアウェイに到達する必要があります。パットの場合は、穴に正確に入れたいです。

ここでも同じです。ゲーム開発者は、さまざまな操作のパフォーマンスを制御できるため、C ++を選択します。それを選択した場合、それを活用したいと思うでしょう。


-3

ほとんどのビジネスアプリケーションは、社内のツールとして記述されています。このツールの使いやすさに関する期待は、大口顧客に販売されるソフトウェアの場合よりもはるかに低いです。社内ビジネスアプリには、マウスクリックにゆっくり反応するメニューやダイアログ、遅延して再描画されるウィンドウ、またはSwingで書かれたGUI(ホラー!)が含まれていることはよくあります。これにはいくつかの理由があります(ソフトウェアが非常に「スナッピー」であるよりもカスタマイズ可能であることが重要です。ソフトウェアのユーザーは、問題のソフトウェアを使用するか使用しないかを選択できません。ソフトウェアをインストールする決定は、それ自体を使用しないでください...)。このすべての結果は、このツールの開発者がアプリケーションの応答性の最適化に多くの時間を費やさないことです。ただし、拡張性と機能の数には注意が必要です。異なるクライアントベース=>異なる設計目標=>異なる方法論。

Excelなどの大衆を対象とするビジネスアプリケーションは、大幅に最適化されていることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.