0

私はある問題から別の問題につまずきました。最初の問題を解決すると、指が画面上を移動したときに、パーティクルトレイルがタッチ位置のはるか後ろに遅れます。

上書きしてCAEmitterLayerを初期化したときにうまく機能しました

+ (Class) layerClass 
{
    //configure the UIView to have emitter layer
    return [CAEmitterLayer class];
}

と初期化

fireEmitter = (CAEmitterLayer*)self.layer; 

私はそれをに変更しました

fireEmitter = [CAEmitterLayer layer];
fireEmitter.frame = self.bounds;
[self.layer addSublayer:fireEmitter];

そして今、エミッターセルは、離れたところに芸者のように移動したタッチポイントをたどります

何故ですか?エミッターが現在放出しているレイヤーを変更したので?助けてください!thnx

4

1 に答える 1

1

1 秒あたりのタッチ イベントの数は非常に多く、1 秒あたり特定の回数しか画面に描画できません。計算してみましょう。

画面全体で指を斜めに 166 ミリ秒で移動できるとします (スワイプはかなり高速です)。また、デバイスの速度を 60 FPS から 30 FPS (レンダリング サイクルあたり 33 ミリ秒) に下げるのに十分なパーティクルをレンダリングしているとします。つまり、画面をスワイプするのにかかる時間内に約 5 回のタッチ コールバックしか取得できません。つまり、100 ピクセルごとに、または指が移動するたびにタッチ イベントしか取得していないことを意味します。

そのため、受け取ったタッチ位置にラグがないと仮定しても (実際にはありません)、ほとんどの場合目に見えるラグが発生するほどの頻度でしかそれらを取得できません。このラグを短縮する唯一の方法は、フレーム レートを上げることです (より少ない/より小さなパーティクルを使用するか、OpenGL など、使用しているパーティクルの数をより適切にスケーリングするテクノロジに切り替えることによって)。実際にフレーム レートが問題であることを確認するには、まず Instruments を使用する必要があります。

注:[CATransaction setDisableActions:YES]エミッターの位置を設定するときに を使用した効果を測定しましたが、違いは見られませんでした。したがって、これは純粋に暗黙的なアニメーションが使用されているという問題ではありません。

于 2012-06-07T15:49:19.977 に答える