1

しばらくして FPS が低く GPU 使用率が高いことに気付いたゲームをほぼ完成させました。問題を特定するためにトレースを実行しましたが、すべての CPU 時間が Cocos2D フレームワークによって消費されているようです。これは、この動作が正常であることを意味しますか? または、結果を間違って解釈していることはありますか? レンダリング エンジンを使用している場合、アイドリングは実際には不可能であると読みましたが、アニメーションが発生していないときに 98% の CPU 使用率は非常に間違っているようです。ここで何が起こっているのか、誰かに光を当てることはできますか? または、誰かが私を助けてくれるのを助けるために、他に何を投稿できるか教えてください。

楽器のトレース

4

1 に答える 1

1

最も重いスタックは 25 レベルの深さで、そのうちの 9 つはコード内にあるようです (Mighty Meteor?)。スタック上のこれらの関数呼び出しのいずれかが必要以上に行われている場合、それが問題の説明になります。コンピュータを屈服させる最も簡単な方法は、1 回で十分な場合に 2 回、3 回、またはそれ以上実行させることです。特に、複数の抽象化レベルで実行する場合はそうです。

追加: コード内にあるように見える呼び出しの 9 つのレベルは次のとおりです。

93.2% CCDirectorIOS drawScene
78.6% CCScheduler update
77.4% invokeMethods
76.3% CCActionManager update:
65.3% CCActionFollow step:
60.6% CCNode position
38.3% CCNode nodeToParentTransform
30.3% RigidBodyToParentTransform
14.0% NodeToPhysicsTransform
 5.4% objc_object::sidetable_retain()

左側の数値が実際に何を意味するのかは明確ではありません (おそらく、上記のすべてのレベルで等しいスタック トレースの割合)。ただし、関数が同じ引数で N 回呼び出されている場合、一度だけ呼び出される可能性があります。 、実行時間を N 倍します。これらのうちの別の 1 つが 1 回しか呼び出されないときに M 回呼び出されている場合、速度低下係数は N*M です。そして、そのようなスローダウンがあるかどうかにかかわらず、「ホット パス」はそれほど変わらないように見えます。したがって、ホット パスを見て問題がどこにあるかはわかりませんが、以下の 1 つを呼び出す時点でこれら 9 つのルーチンのいずれかに問題がある可能性が高いと言えます。

(パーセンテージは降順であるため、包括的な時間にはなりません。包括的な時間には、これらのスタック トレースに示されている呼び出しだけでなく、「最も重い」ものではない他のスタック トレースも含める必要があるためです。たとえば、一般的な知恵では、左の数値が 30.3% から 14.0% に低下するため、からRigidBodyToParentTransformへの通話に集中する必要があると言われています. しかし、それは に多くのセルフタイムがあることを意味するわけではありません.さらに、他の多くの関数を呼び出す時間も長くなり、1 つの関数のコストが全体的な包括的パーセント。)NodeToPhysicsTransformRigidBodyToParentTransformNodeToPhysicsTransformNodeToPhysicsTransform

(また、「自己時間」は無視してください。他の関数を呼び出す関数では、通常は重要ではなく、さらに包括時間に含まれます。)

PS プロファイラーでは、個々のスタック サンプルを表示できますか? それを行うことに対する通常の議論は、統計的精度を得るのに十分に見ることができないということです。しかし、精度は必要ありません。1000 サンプルの 30% の費用がかかる場合、その測定値の標準偏差は 1.4% になります。わずか 10 個のサンプルのうち 3 個でそれが見られる場合、それはまだ 30% ですが、標準偏差は 14% であるため、コストはおよそ 16% から 44% の間にあることを意味します。たった 16% で、簡単に修正できるとしたら、そうではありませんか? したがって、統計精度はあまり重要ではありません。重要な違いは、プロファイラーの要約では明らかでないプログラムを高速化する方法を認識できることです。重要なことは、何が起こっているのかを見つけることです、時間の観点から、少数のランダム サンプルを調べると、それがわかります。それがこの方法です。

于 2014-05-15T22:12:42.290 に答える