サーバーが部分的な更新を送信し、更新ごとにフルスクリーンのスナップショットを送信するわけではないと思います。
簡単なテクニックは、それを作成CGBitmapContext
してそれを維持することです。CGContextFillRect
新しいピクセルを取得するときにデータを直接更新し(使用ははるかに遅くなります)、を使用してその画像から画像を作成し、CGBitmapContextCreateImage
その画像をに割り当てview.layer.contents
ます。(そのプロパティに保存した後、画像を解放することを忘れないでください!)
ただし、ご存知のとおり、毎回新しいイメージを作成する必要があります。なんで?ACGImage
は不変です。不変性を強制するために、Core Graphicsは、を作成するときにピクセルデータをプライベートストレージにコピーしますCGImage
。次に、画像をレイヤーに表示するときに、iOSはピクセルデータをウィンドウサーバーに再度コピーする必要があります(これは別のプロセスです)。画面全体に相当するピクセルデータのコピーには時間がかかります。デバイスに応じて、614 KB(iPhone 3GS以前)から12.6 MB(Retina iPad)の範囲でコピーします。
UIKitとCoreAnimationの世界にとどまりながら、これを高速化する1つの方法は、レイヤーのグリッドで画面を並べて表示することです。それぞれ64x64ピクセルのレイヤーで並べて表示するとします。CGBitmapContext
レイヤーごとにを作成します。次に、サーバーからピクセルデータを受信したら、適切なCGBitmapContext
のデータを更新してから、それを必要とするレイヤーのみのコンテンツを更新します。画面のごく一部が変更された場合、更新するタイルは1つまたは数個だけなので、コピーするデータははるかに少なくなります。64x64ピクセルでは、タイルごとに16KiBをコピーしています。いくつかの異なるサイズを試して、何が最適かを判断することをお勧めします。
それでも十分な速度が得られない場合は、UIKitとCore Animationの世界を離れ、OpenGLESを使用する必要があります。iOSでは、OpenGL ESは、電子メールアドレスが。で終わっていない限り、許可されているビデオカードへの最も直接的なアクセスを提供します@apple.com
。ピクセルデータを使用してテクスチャを作成し、そのテクスチャを使用して2つの三角形(長方形を形成するように配置)を描画し、をカバーすることができますCAEAGLLayer
。新しいピクセルデータを取得したらglTexSubImage2D
、三角形を使用してテクスチャに書き込み、再描画できます。OpenGLプログラミングをあまり行っていない場合、これはかなり大きな作業になります。