1

iOSゲームを作成していますが、XCodeデバッガーで正常に実行しているときにゲームが正常に実行されることに気付きました。ただし、Instruments内から実行すると([Product]-> [Profile to trace Leaks])、Instrumentsが左側のサイドバーに[Analyzing Process]と表示すると、ゲームがフリーズします。その後、分析されていたゲームの一部がフリーズし、他の部分が進行し続けたため、ゲームはすべての状態を台無しにしました。

これは私が修正できる/修正する必要があるものですか、それともゲームがリリースで実行されることを確認するのに十分ですか?

修正が必要な場合、それを機能させるために何をする必要がありますか?

アップデート1:

そのため、問題が見つかりました。ゲームをプレイしている場合でも同じ問題が再現され、ホームボタンを押してゲームアイコンをクリックし、プレイを続行します。

問題は、ほとんどの作業がupdateメソッドで行われ、(ccTime)dtパラメーターの値に依存していることです。dtの値は通常<0.1秒、場合によっては最大0.5秒です)一時停止して(ホームボタンをクリックするか、楽器がゲームを一時停止してスナップショットを撮るとき)、再生を再開すると、dtの値は数になります。秒!そして、それは私たちのすべての計算を範囲外に投げます。

この問題を修正する一時的な(しかし醜い)回避策を試しました。updateメソッドの最初に、これを追加します。

if(dt > 1)
  return;

そして今では期待通りに動作します-同期が外れることはありません。ただし、これは永続的な解決策ではありません。dtの値が合法的に1秒に近い場合があり、リソースが不足している状況では、これがスタッター(またはさらに悪い)につながる可能性があるためです。

また、dtの以前の値を格納する別の(同様に醜い)ソリューションを検討し、次にupdateメソッドをチェックインします。

if(dt > 10 * prevDt)
{
  return;
}

を呼び出してメソッドを呼び出してみましたunscheduleUpdateAppDelegate.m、そのアプローチは機能しませんでした。applicationDidEnterBackgroundscheduleUpdateapplicationWillEnterForeground

外部の一時停止による不規則な時間値の更新に対処するための最良の方法は何ですか?

ありがとうアナンド

4

2 に答える 2

2

残念ながら、これは問題であり、確実な答えはありません。少なくとも、さまざまなチェックを実行するためにシステムにアクセスする必要があります。

プロファイルの失敗は、ゲームがタイトなループを実行していて、そのタイミングが予測できない方法で混乱し、タイミングまたはリソースの問題(これらのタイミングの問題が同じデバッガーで発生しない場合)が原因でゲームがクラッシュしていることが原因である可能性があります仕方)。その場合、おそらくそれについてできることはあまりありません。または、コードに問題があることが原因である可能性があります。問題は、これらのどれが当てはまるかを理解するのが非常に難しい場合があることです。ただし、問題がコードにあると想定し、さらに調査を行うのがおそらく最善です。

最初に行うことは、まだ実行していない場合は、静的分析ツール(Xcodeの[製品]メニューから分析)を実行することです。発生した各エラーを注意深く検討し、すべてを削除するように努めます。時々それらは明白に見えるかもしれません、そしてあなたはそれらを無視することができるとあなたは思うかもしれません、しかしいくつかのうなずきはそれらがより深い問題の症状であることを明らかにします。

まだ試していない場合は、楽器を実行してゾンビをチェックしてみてください。割り当て手段が失敗した場合にもこれが失敗する可能性が高くなりますが、割り当て解除されたオブジェクトへの古い参照がぶら下がっている場合は、問題が発生している可能性があります。試すことができるもう1つの手段は、パフォーマンスアナライザーで、アプリがほとんどの時間を費やしている場所を確認します。あなたが気付いていないリソースの過剰割り当てには、いくつかの本当に重大な問題があるかもしれません。メモリプロファイラーを実行できない場合、これが当てはまるかどうかを確認するのは困難ですが、パフォーマンスアナライザーを使用すると、アプリがどこかで長時間ハングアップしていないかどうかを確認できる可能性があります。ありません。

最後に、他のすべてが失敗し、これがナットを割る大ハンマーである可能性がある場合、また、どのような場合でも解決策を提供しない可能性があります。ARCを使用していない場合は、アプリを使用するように変換するのにかかる時間を考慮してください(ただし、実行する前に必ず最初にブランチを作成してください)。オブジェクトの割り当て/割り当て解除のためのAppleのアルゴリズムは非常に効率的であり、微妙なメモリ管理エラーがある場合は、自動参照カウントによって排除される可能性が非常に高くなります。

于 2013-01-11T17:34:48.070 に答える
2

cocos2Dがどのように機能するかについてはよくわかりませんが、オプションが足りなくなった場合は、デルタ時間を上限に固定するだけです。デルタタイムを使用する更新方法が何であれ、私は次のことを行います。

double delta = (dt > 0.5) : (0.5) ? (dt);

その時点からではdeltaなく、を使用してください。dtその結果、デルタが0.5秒を超えるフレームは、デルタが0.5秒に制限されます。フレームをスキップしたくない場合は、連続して多くのフレームをスキップする可能性があり、ユーザーに悪影響を与える可能性があるためです。彼らはおそらくアプリがクラッシュしたか何かだと思うでしょう。ただし、デルタが大きいフレームを実行することは望ましくありません。デルタに依存するオブジェクトとフォースがそのフレームで何度も乗算され、衝突などをキャッチできなくなるためです。そのため、値を下にクランプするだけで、フレームをスキップせずにゲームが完全に台無しになるのを防ぎます。

マイナス面は、フレームレートが1秒あたり2フレームに低下すると、アプリの動きが遅くなることです。時間ベースの更新方法の利点は失われます。これは、エンジンが過負荷になったときに、ゲームが常に明確に定義された速度で実行されているように見せることができる機能です。

正直なところ、1秒あたり2フレームで長時間実行すると、より大きな問題が発生する可能性があります。とにかく、ゲームが誰もが知っているときに1回だけレンダリングしている場合、オブジェクトが1秒あたり少し遅く移動するかどうかにユーザーが気付くことはないと思います。

于 2013-02-12T04:23:15.343 に答える