私はAndroidにやや複雑なゲームエンジンを作成しています。Android:スレッドを更新するとGCがトンを実行します
現在サブシステムの更新にスレッドが使用されています。
更新方法の中には、現在のゲーム状態に基づいてゲームロジックを更新する方法があります。
ゲームの状態にはシーンが更新されています。シーンはルートノードで構成され、単純なシーングラフ構造になります。
ルーツは、更新された子を持つノードなどです。
Logcat:03-29 09:23:22.866:D/dalvikvm(18554):GC_CONCURRENTは511K、52%無料で無料になるまで、これは何とか素晴らしいものです。 2773K/5767K、外部77K/587K、一時停止2ms + 3ms
サブシステムを更新する方法をコメントアウトするときに、GCメッセージがないので、更新ループになる原因を切り離しました。さらに、私は更新ループについて深くコメントしています。ルートノードの子プロセスが更新される時点までは、GCが精力的に実行される時点までです。
(GameLgoic)
public void onUpdate(float deltaTime)
{
if (gameState != null)
gameState.onUpdate(deltaTime);
}
(GameState)
public void onUpdate(float deltaTime)
{
scene.onUpdate(deltaTime);
}
(Scene)
public void onUpdate(float deltaTime)
{
root.onUpdate(deltaTime);
}
(SceneNode)
public void onUpdate(float deltaTime)
{
for (int i = 0; i < children.size(); ++i)
{
children.get(i).onUpdate(deltaTime); // Memory leak runs crazily here
}
}
私がコメントしているのはchildren.get(i).onUpdate(deltaTime)リークはありません!私の心はとてもうんざりです。みんなありがとう。
グッドニュースを:あなたのリークにonUpdate()の呼び出しではありません。そのメソッドの内部にあるコードです。関連するコードスニペットを追加してください。 – WarrenFaith
'children'の定義と関連する' onUpdate'メソッドを示してください。 – Gray
ああ、ループで 'size()'を呼び出すたびに、子猫が死ぬ。 – WarrenFaith