最適化について話すときは、特定の状況と条件および制限を提供する必要があります。最適化はすべてマイクロ管理に関するものだからです。そうでなければ、それは無意味です。
あなたのより速いの基礎は何ですか?どのように測定しましたか?数字は何ですか?
たとえば、no-opまたは非常に単純な-drawRect:
方が高速になる可能性がありますが、常にそうなるとは限りません。
CAの内部設計もわかりません。だからここに私の推測があります。
静的コンテンツの場合
あなたの描画コードが絶えず呼び出されているのは奇妙です。描画結果をキャッシュし、メッセージCALayer
を送信するまで再度描画しないためです。setNeedsDisplay
セルのコンテンツを更新しない場合は、単一のビットマップレイヤーと同じです。合成コストを必要としないため、複数の合成レイヤーよりも高速である必要があります。同時にすべてのプールに存在するのに十分な少数のセルのみを使用している場合は、更新する必要はありません。最近のモデルではRAMが大きくなるため、最近のモデルで発生する可能性が高くなります。
動的コンテンツの場合
常に更新されている場合は、実際に自分で更新していることを意味します。したがって、レイヤー合成バージョンも絶えず更新される可能性があります。これは、フレームごとに再度合成されていることを意味します。複雑で大きいため、速度が低下する可能性があります。複雑で大きく、重複する領域が多い場合は、速度が低下する可能性があります。どの領域を無視してもよいかを判断できない場合、CAはすべてを厳密に描画すると思います。あなたが描くかどうかを選択できるのとは異なります。
実際の描画はCPUで行います
ビューを多くのレイヤーの純粋な構成として構成した場合でも、最終的には各サブレイヤーを描画する必要があります。また、コンテンツの描画はGPUで行われることが保証されていません。たとえばCATextLayer
、CPUで自分自身を描画していると思います。(現在のモバイルGPUでポリゴンを使用してテキストを描画することは、パフォーマンスの観点からは意味がないため)また、一部のフィルタリング効果もあります。その場合、全体的なコストは同様になり、さらに合成コストが必要になります。
CPUとGPUの負荷のバランスが取れている場合
レイヤーまたは直接OpenGL描画が多すぎるために、GPUが高負荷で非常にビジー状態の場合、CPUがアイドル状態になっている可能性があります。アイドル状態のCPU時間内にCGの描画を実行できる場合は、GPUにより多くの負荷をかけるよりも高速になる可能性があります。
それらのどれもあなたの場合ではありませんか?
あなたのケースが上記の状況のいずれでもない場合、私は本当にCGコードがCA構成よりも速く描画されることを確認して確認したいと思います。ソースコードを添付してください。