1

画像を絶えず更新するために、.01秒ごとにperformSelectorを実行するメソッドがあります。

-(void)setNeeds

[mag setNeedsDisplay];
[vc setNeedsDisplay];
[na setNeedsDisplay];
[wave setNeedsDisplay];
[mon setNeedsDisplay];

[self performSelector:@selector(setNeeds)
           withObject:NULL
           afterDelay:.01];

これは、通常のユーザー操作がある場合に問題なく更新されます。ただし、ユーザーがUIViewPickerで値をスライドすると、インタラクションが停止するまですべての更新が一時停止されます。NSTimerオブジェクトが繰り返しに設定されている場合も同じことが起こります。

継続的なアクションを実行するためのより一貫した方法を望んでいますが、この問題の解決策も素晴らしいでしょう。

4

2 に答える 2

0

これはかなり一般的な質問です。ユーザーの操作中にNSTimer作成されたが一時停止する可能性があるためです。これも同様の質問です。ご想像のとおり、メソッドは内部的に使用します。基本的に、ユーザーがアプリケーションを操作している間、タイマーが実行ループで一時停止する可能性がある場合、またはタイマーがスケジュールされている場合。解決策は、次のように自分で実行ループのタイマーをスケジュールすることです。scheduledTimerWith...performSelector:..afterDelay:..NSTimerscheduledTimerWith...performSelector:..afterDelay:..NSDefaultRunLoopModeCommonModes

timer = [NSTimer timerWithTimeInterval:0.01 target:self selector:@selector(setNeeds) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

この関数を自分NSTimerで管理することに反対する場合は、この関数を使用できますperformSelector:withObject:afterDelay:inModes:。最後の引数は、実行ループモードの配列であり、そこにを置くことができますNSRunLoopCommonModes

于 2012-01-17T16:51:07.773 に答える
0

すべてを1/100秒ごとに必要な表示としてマークしても、100 fpsのフレームレートは得られません。必要なものとしてマークを付けると、メインの実行ループを通過する次のパスで描画される機会のみが表示されます。

描画に1/10秒かかる場合は、10fpsになります...

さらに、このアプローチではsetNeedsを呼び出す必要があり、その呼び出しサイクルが何らかの理由で中断されても再開されない場合は、NSTimer +scheduledTimer...呼び出しを使用して定期的なタイマーを作成する必要があります。

于 2012-01-17T17:29:57.890 に答える