セットアップ:メインスレッド上iOSのpresentRenderBufferブロック
- CADisplayLink、間隔ごとに
- iOSの10.2
- OpenGLES 2.0
- iPhone 6
を発射するように設定。
-(void)callbackFromCADisplayLink:(CADisplayLink *)dl
{
u64 tStart = high_res_clock_now();
<Process input, advance game world, prepare graphics commands>
// Frame processed
u64 prePresentElapsed = high_res_clock_now() - tStart;
[myEAGLContext presentRenderbuffer:GL_RENDERBUFFER];
// Graphics commands submitted
u64 postPresentElapsed = high_res_clock_now() - tStart;
}
私は何を見つけることだと、次のとおりです。
prePresentElapsed
は0.5-2.5ms範囲内で一貫しています。- 2つのグラフィックモードが本質的にあります:
- "高速モード":
postPresentElapsed
は一貫16msの - でホバリングされる:
postPresentElapsed
が1.5-4ms範囲 - "低速モード" で一貫していますシステムは「高速モード」で始まりますが、一見無作為に(「大きなフレームスパイク」に関連付けられているようには見えません)「スローモード」に縮まり、アプリが非アクティブ/バックグラウンド状態になるまで「スローモード」にとどまりますその後、アクティブ状態に戻る。
明らかに、vsyncのダウンストリーム効果のためにpresentRenderbuffer
がブロックされているようです。
質問:
- モードの切り替えの原因は何?
- にはどうすれば確実に
お返事ありがとうございます。残念ながら、私はこれが起こっていることを非常に疑っています。 – Kay