ゲームのコーディングを行っていますが、レンダリング コードで速度を計算することは非常に重要です。
一部の操作の速度を取得するにはどうすればよいですか?
たとえば、乗算がsqrtなどよりも高速かどうかを知る方法は? または、テストを行って時間を計算する必要があります。
プログラミング言語はC ++です、ありがとう。
ゲームのコーディングを行っていますが、レンダリング コードで速度を計算することは非常に重要です。
一部の操作の速度を取得するにはどうすればよいですか?
たとえば、乗算がsqrtなどよりも高速かどうかを知る方法は? または、テストを行って時間を計算する必要があります。
プログラミング言語はC ++です、ありがとう。
この種のマイクロ最適化は、最小限の利益のために時間を無駄にするだけのものです。
プロファイラーを使用して、ゲームがほとんどの時間を費やしているとプロファイラーが指示する場合は常に、独自のアルゴリズムとコードを改善することから始めます。
より効率的な設計を実装するために、ソフトウェア全体(またはその大部分)をオーバーホールしなければならない場合があることに注意してください。その場合、プロファイラーの結果は経験の浅い人に誤解を与える可能性があります。たとえば、複雑な計算を最適化すると、その結果を一度だけキャッシュする場合と比較して、最小限のゲインしか得られない場合があります。
このやや関連のあるスレッドも参照してください。
特定の操作の速度を決定することは、多くの場合、プロファイリングとして知られています。操作をプロファイリングするための最適なソリューションは、プロファイラーを使用することです。Visual Studio には優れたプロファイラーがあります。Linux にはgprofがあります。コンパイラにプロファイラがない場合、頻繁にコードをプロファイリングする場合は、プロファイラを備えたコンパイラを購入する価値があります。
プロのプロファイラーを使用せずにやり遂げる必要がある場合は、通常、独自のプロファイラーをプログラムに埋め込むことで解決できます
一部のプロファイラーのコードについては、これを確認してください。
最善の策は、AQTime などのツールを使用してプロファイリングを実行することです。そうすれば、最適化に時間を費やすべき場所がわかります。しかし、時期尚早に、または推測に基づいてそれを行うと、多くのことを得ることができず、コードが複雑になるか、何かが壊れてしまうだけです。最善の方法は、浮動小数点計算、特に sin や cos などを取り除き、可能であればループから sqrt を取り除くことです。
私はかつてこのようなものを持っていました:
for i = 0 to nc
for j = 0 to nc
aij = sqrt(a[i]*b[j])
nc*nc 平方根を計算します。しかし、sqrt(a*b) は sqrt(a)*sqrt(b) に等しいので、すべての a と b の平方根を前もって計算しておくと、ループは次のようになります。したがって、nc*nc 平方根の代わりに、2*nc 平方根があります。
for i = 0 to nc
for j = 0 to nc
aij = asqrt[i]*bsqrt[j]
あなたが求めている質問は、ハードウェア レベルで開発しているプラットフォームに大きく依存しています。異なるチップセット (Intel / AMD) 間でバリエーションがあるだけでなく、プラットフォームにもバリエーションがあります (iPhone には、特定のことをより速く行うための指示がそれほど多くないのではないかと思います)。
あなたは質問で、「レンダリングコード」について話していると述べています。CPU ではなく GPU (シェーダー コード) で実際に実行されるコードについて話している場合、ルールは大幅に変更されます。
@thkala が述べているように、始める前にこれについて心配する必要はありません。最初に動作するようにコーディングし、次に (改善が必要な場合にのみ) コードをプロファイリングするときに遅いビットを書き直す方が簡単であるだけでなく、より迅速であることがわかりました。通常、特定の機能のみを使用しようとするよりも、アルゴリズムが優れているほどパフォーマンスが向上します。
私たちが iPhone 向けに開発しているゲームで、私が心に留めていた唯一のことは、大きな数学演算 (sqrt) が遅く (基本的な数学ではない)、すべてのフレームを実行する for ループが高速であるということです。 CPUを食い尽くす。それを念頭に置いて、コードをほとんど最適化する必要はありませんでした - とにかくすべてが 60fps で実行されているためです - 最初に心配しなくてよかったです。