タグ付けされた質問 「optimization」

ソフトウェアを変更して、その一部をより効率的に機能させるか、使用するリソースを少なくするプロセス。一般に、これは実行速度が速くなるか、必要なリソースが少なくなることを意味します。

9
最適化が早すぎるのはなぜそんなに悪いのですか?
最適化について少し調べた後、ゲームを最適化するのが早すぎることは、広く認識されている罪のように思えます(文字通りどこでも)。 私はこれを本当に理解していませんが、パフォーマンスを念頭に置いて初めて開発するのではなく、ゲームのコア構造の一部を最後に変更することは非常に難しいことではありませんか? ゲームが終了するまで待つことで最適化が必要かどうかがわかりますが、とにかくそれを行うべきではありません。プレーヤー。 最適化が早すぎるのはなぜ悪い考えなのか、誰かに説明してもらえますか?

17
C ++低レベル最適化のヒント[終了]
すでに最良の選択アルゴリズムを持っていると仮定すると、C ++コードから甘いスイートフレームレートの最後の数滴を圧縮するために、どのような低レベルのソリューションを提供できますか? 言うまでもなく、これらのヒントは、プロファイラーで既に強調した重要なコードセクションにのみ適用されますが、低レベルの非構造的な改善である必要があります。私は例をシードしました。
79 c++  optimization 

6
Minecraft風のボクセルの世界を最適化するにはどうすればよいですか?
Minecraftの素晴らしい大きな世界は、クアッドコアと肉付きのグラフィックカードを使用しても、ナビゲートが非常に遅いことがわかりました。 Minecraftの遅さは次の原因によるものと思われます。 Java。空間分割とメモリ管理がネイティブC ++で高速であるため。 弱い世界分割。 私は両方の仮定で間違っている可能性があります。しかし、これは大きなボクセルの世界を管理する最良の方法について考えさせられました。それは、ブロックは、世界の任意の部分に存在することができる真の3D世界は、であるように、それは大きな3Dアレイ基本的には[x][y][z]世界の各ブロックタイプを有する(すなわちBlockType.Empty = 0、BlockType.Dirt = 1等) このような世界をうまく機能させるには、次のことが必要だと思います。 さまざまなツリー(oct / kd / bsp)を使用して、すべてのキューブを分割します。三角形ごとではなくキューブごとにパーティション分割できるため、oct / kdの方が適しているようです。 ユーザーに近いブロックが背後のブロックを難読化し、それらをレンダリングすることを無意味にする可能性があるため、いくつかのアルゴリズムを使用して、現在どのブロックが見えるかを判断します。 ブロックオブジェクト自体を軽量にしておくと、ツリーにすばやく追加したり削除したりできます。 これに対する正しい答えはないと思いますが、このテーマに関する人々の意見を見てみたいと思います。 大きなボクセルベースの世界でパフォーマンスをどのように改善しますか?



1
エンティティシステムのキャッシュ効率はどのようになっていますか?
最近、私はC ++ / OpenGLゲームエンジンに実装するために、エンティティシステムで多くの読書を行ってきました。エンティティシステムについて絶賛されている2つの主な利点は次のとおりです。 複雑な継承階層に絡む必要がないため、新しい種類のエンティティを簡単に構築できます。 キャッシュの効率性、私は理解するのに苦労しています。 理論はもちろん単純です。各コンポーネントはメモリブロックに連続して格納されるため、そのコンポーネントを処理するシステムは、メモリ内をジャンプしてキャッシュを削除することなく、リスト全体を繰り返し処理できます。問題は、これが実際に実用的である状況を本当に考えることができないということです。 最初に、コンポーネントがどのように保存され、どのように相互に参照するかを見てみましょう。システムは複数のコンポーネントで動作する必要があります。つまり、レンダリングシステムと物理システムの両方が変換コンポーネントにアクセスする必要があります。私はこれに対処する多くの可能な実装を見てきましたが、どれもうまくいきません。 コンポーネントに、他のコンポーネントへのポインター、またはコンポーネントへのポインターを格納するエンティティへのポインターを格納させることができます。ただし、ポインタをミックスに投入するとすぐに、キャッシュの効率がすでに低下しています。すべてのコンポーネント配列が「n」の大きさであることを確認できます。「n」はシステム内に存在するエンティティの数ですが、このアプローチはひどくメモリを浪費します。これにより、新しいコンポーネントタイプをエンジンに追加することは非常に困難になりますが、1つのアレイから次のアレイにジャンプするため、キャッシュ効率が失われます。個別の配列を保持する代わりに、エンティティ配列をインターリーブすることもできますが、それでもメモリを浪費しています。新しいコンポーネントやシステムを追加するのに法外な費用がかかりますが、古いレベルをすべて無効にしてファイルを保存するという利点が追加されました。 これはすべて、エンティティがリスト、すべてのフレームまたはティックで線形に処理されることを前提としています。実際には、これは多くの場合そうではありません。オクルージョンカリングを実行するためにセクター/ポータルレンダラー、またはオクトツリーを使用するとします。エンティティをセクター/ノード内に連続して保存できる場合もありますが、好きかどうかに関係なく、飛び回ることになります。次に、他のシステムがあります。これは、他の何らかの順序で格納されたエンティティを好む場合があります。AIは、AI LODでの作業を開始するまで、エンティティを大きなリストに格納しても問題ありません。次に、プレーヤーまでの距離、またはその他のLODメトリックに従って、そのリストを分割します。物理学はそのオクトツリーを使用したいと思うでしょう。スクリプトは何でも構いません。実行する必要があります。 コンポーネントを「ロジック」(ai、スクリプトなど)と「ワールド」(レンダリング、物理、オーディオなど)に分割し、各リストを個別に管理できますが、これらのリストは相互にやり取りする必要があります。AIは、エンティティのレンダリングに使用される変換またはアニメーションの状態に影響を与えない場合、意味がありません。 エンティティシステムは、実際のゲームエンジンでどのように「キャッシュ効率」が高いのですか?おそらく、アレイにエンティティをグローバルに保存し、octree内でそれを参照するなど、誰もが使用しているが、話しているわけではないハイブリッドアプローチがあるのでしょうか。

7
ゲーム開発に適用できるC#プロパティを使用することをマイクロソフトは推奨していますか?
次のようなプロパティが必要になることがあります: public int[] Transitions { get; set; } または: [SerializeField] private int[] m_Transitions; public int[] Transitions { get { return m_Transitions; } set { m_Transitions = value; } } しかし、私の印象では、ゲーム開発では、特に理由がない限り、すべてを可能な限り高速にする必要があります。私が読んだことからの私の印象は、Unity 3Dがプロパティを介してインラインアクセスすることを確信していないため、プロパティを使用すると余分な関数呼び出しが発生することです。 パブリックフィールドを使用しないというVisual Studioの提案を常に無視する権利はありますか?(使用int Foo { get; private set; }目的を示すのに利点がある場合に使用することに注意してください。) 時期尚早な最適化が悪いことは承知していますが、私が言ったように、ゲーム開発では、同様の努力で高速化できる場合でも、速度を遅くすることはありません。

9
OpenGL最適化のヒント[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 6年前に閉鎖されました。 OpenGLをより効率的にするためのヒントやコツを教えてください。

6
距離関数を最適化する方法は?
かなり単純なRTSのようなゲームを開発しているときに、距離の計算がパフォーマンスに影響を与えていることに気付きました。 常に、ユニットがターゲットの範囲内にあるかどうか、発射体がターゲットに到達したかどうか、プレイヤーがピックアップを乗り越えたか、一般的な衝突などがあるかを知るための距離チェックがあります。 2点間の距離が多く使用されます。 私の質問はまさにそれについてです。フレームごとに何千回も実行している場合、かなり時間がかかる通常のsqrt(x * x + y * y)アプローチ以外に、ゲーム開発者が距離をチェックするための代替手段を知りたいです。 マンハッタン距離と二乗距離の比較に気づいていることを指摘したい(sqrtボトルネックをスキップすることによって)。他に何か?

7
重力計算の最適化
互いに引き寄せられるサイズと速度がさまざまなオブジェクトがたくさんあります。更新するたびに、すべてのオブジェクトを調べて、他のすべてのオブジェクトの重力による力を加算する必要があります。それはあまりうまくスケールせず、ゲームで見つけた2つの大きなボトルネックの1つであり、パフォーマンスを改善するために何をすべきかわかりません。 パフォーマンスを改善できるはずだと感じています。常に、システム内のオブジェクトの99%がオブジェクトに与える影響はごくわずかです。もちろん、オブジェクトを質量でソートすることはできず、力は質量よりも距離によって大きく変化するため、上位10個の最大オブジェクトまたは何かのみを考慮することができます(方程式はに沿っていますforce = mass1 * mass2 / distance^2)。何かに影響を与えないかもしれない世界の反対側にある何百もの小さな岩の断片を無視して、最大のオブジェクトと最も近いオブジェクトを考慮することは良い近似だと思いますが、どのオブジェクトが最も近い私はすべてのオブジェクトを反復処理する必要があり、それらの位置は絶えず変化しています、それで私が一度だけできるのではない。 現在、私はこのようなことをしています: private void UpdateBodies(List<GravitatingObject> bodies, GameTime gameTime) { for (int i = 0; i < bodies.Count; i++) { bodies[i].Update(i); } } //... public virtual void Update(int systemIndex) { for (int i = systemIndex + 1; i < system.MassiveBodies.Count; i++) { GravitatingObject body …

6
スペルキャスト-毎秒のダメージを最適化する方法
いくつかの呪文を知っているウィザードがあると想像してください。各スペルには、ダメージ、クールダウン時間、キャスト時間の3つの属性があります。かなり標準的なRPGのもの。 クールダウン時間:その呪文を再び唱えることができるまでにかかる時間(t)。呪文は、キャストを開始した瞬間に「クールダウン」します。 キャスト時間:呪文を使用するのにかかる時間(t)。ウィザードが何かを唱えている間、別の呪文は唱えられず、キャンセルすることもできません。 質問は次のとおりです。異なるスペルのセットを与えられた場合、どのようにダメージを最大化するのでしょうか? キャストタイムごとの最大ダメージを計算するのは簡単です。しかし、はるかに高い呪文が利用可能な場合、低ダメージの呪文を「スタック」してキャストするのを待つ方が良い状況ではどうでしょうか? 例えば、 ファイアボール:3000ダメージ、3秒のキャスト時間、6秒のクールダウン。 フロストボルト:ダメージ20、キャスト時間4秒、クールダウン4秒。 ファイヤーブラスト:ダメージ3、キャスト時間3秒、クールダウン3秒。 この場合、フロストボルトではなく、DPCTの低いスペル(ファイアブラスト)を選択すると、1秒あたりのダメージが大きくなります。そのため、呪文を選択した結果を考慮する必要があります。 次の例は、「オーバーキャスト」と「待機」の場合です。

5
アセンブリによる最適化の学習[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 閉じた3年前。 私はコンピューターゲームテクノロジーの2年生です。私は最近、自分のパスファインダーの「種類」の最初のプロトタイプを完成させました(幾何学的なアプローチ/パターン認識の代わりにA *を使用しません。地形が既にわかっている場合、実際に探索できるAIが必要でした。パスファインダーにはノードのメモリがあるため、最短距離で簡単に歩きます)。 とにかく私の質問はより一般的です:アルゴリズム/ループ/ for_each /などの最適化を開始するにはどうすればよいですか。一般的なヒントは大歓迎ですが、アセンブリを使用します。このトピックに関する良い本を見つけるのは本当に難しいので、私は特に良い本を探しています。このような小さな記事がいくつかありますが、それでもアルゴリズム/ゲームを最適化するには十分な知識がありません... 私が見つけることができなかった現代の良い本がそこにあることを願っています...

3
オープンな環境と多くの静的コンテンツ(例:クライシス)を備えた最新のAAAゲームでは、オクルージョンカリングはどのように実行されますか?
私が念頭に置いている2つのアイデア: 1)シーンは、低解像度および低ポリゴンカウントモデルを使用して(またはキューブや球体などの境界ボリュームのみを使用して)、不可視のバッファーにレンダリングされます。次に、バッファがチェックされ、何が表示されているかがわかります。低解像度のシーンをレンダリングする前に、錐台カリングを適用して、できるだけ多くのオブジェクトを既に削除することができます。 2)ツールが静的マップ上で実行され、複雑な(したがって低速の)レイトレーシングを実行して、マップ上のいくつかの3D位置について、何が見えて何が見えないかを認識します。その情報はすべて、後で実行時にユーザーが使用できる効率的な方法で保存されます(例:octree)このソリューションは、オブジェクトを移動せずに静的メッシュ(例:構築)でのみ機能します。

4
どのオペコードがCPUレベルで高速ですか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Game Development Stack Exchangeで話題になるようにします。 閉じた3年前。 すべてのプログラミング言語には、他よりも推奨されるオペコードのセットがあります。ここでそれらを速度の順にリストしようとしました。 ビット単位 整数の加算/減算 整数の乗算/除算 比較 制御フロー フロートの加算/減算 フロート乗算/除算 高性能コードが必要な場合は、C ++をアセンブリで手作業で最適化して、SIMD命令またはより効率的な制御フロー、データ型などを使用できます。したがって、データ型(int32 / float32 / float64)または使用される動作(*、+、&)、CPUレベルの性能に影響を与えます。 CPUでの単一の乗算は加算よりも遅いですか? MCU理論では、オペコードの速度は実行にかかるCPUサイクルの数によって決定されることを学びます。では、乗算に4サイクルかかり、加算に2サイクルかかるということですか? 基本的な数学および制御フローのオペコードの速度特性は正確に何ですか? 2つのオペコードの実行に同じサイクル数が必要な場合、両方のパフォーマンスコードはパフォーマンスの向上/損失なしで互換的に使用できますか? x86 CPUのパフォーマンスに関して共有できるその他の技術的な詳細は歓迎します


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