3

こんにちは、iPhone 用の VNC クライアント アプリ (学校のプロジェクト用) を開発しており、RFB プロトコルを使用しています。

ピクセルのマトリックス (ピクセルあたり 32 ビット) を受け取り、それらを表示する必要があるところですが、高速である必要があり、VNC クライアントとして、変更が発生したときに画像をすばやく更新する必要があります。

試してみたところCGBitmapContextCreate、画像を作成して表示できましたが、更新する必要があるたびに新しい画像を作成する必要があるため、優れたソリューションではありません。

ピクセルのマトリックスを表示するためのより便利な方法またはより良い方法があるかどうか疑問に思っていました。

4

1 に答える 1

4

サーバーが部分的な更新を送信し、更新ごとにフルスクリーンのスナップショットを送信するわけではないと思います。

簡単なテクニックは、それを作成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プログラミングをあまり行っていない場合、これはかなり大きな作業になります。

于 2012-12-14T20:04:26.170 に答える