3

私は「リモートスクリーンキャスティング」アプリケーションを開発しています (VNC と同じですが、正確ではありません)。ここでは、更新された画面ピクセルのタイルをネットワーク経由で転送します。キャッシュメカニズムを実装したいのですが、あなたの推奨事項を聞きたいです...

これが私がそれを行うべきだと思う方法です。タイル座標ごとに、更新されたタイルを追加する固定サイズのスタック (キャッシュ) があります。保存するとき、タイル データ (つまり、ピクセル) のある種のチェックサム (おそらく CRC-16 で十分でしょう?) を計算します。(デスクトップの新しいスクリーンショットから) 新しいタイルを取得すると、そのチェックサムを計算し、そのタイル座標のスタック内のすべての項目のチェックサムと比較します。チェックサムが一致する場合、タイルを送信する代わりに、「位置 X のキャッシュ スタックからタイルを取得」などの特別なメッセージを送信します。これは、サーバーとクライアントで同一のキャッシュ スタックが必要であることを意味します。

ここに私の質問があります:

  • デフォルトのスタック サイズ (深さ) は? スタック サイズが 5 の場合、これは指定された座標の最後の 5 つのタイルが保存され、画面ピクセルの解像度の 5 倍が合計キャッシュ サイズになることを意味します。大画面の場合、画面の生の RGB バッファは約になります。5 メガバイトなので、10 レベルのスタックを持つことは 50 MB のキャッシュを意味しますよね? では、キャッシュの深さはどうあるべきでしょうか? たぶん10だと思いますが、あなたの提案が必要です。

  • ネットワーク経由で送信する前に、タイルを JPEG に圧縮しています。圧縮前に JPEG タイルまたは生の RBG タイルのキャッシュを実装する必要がありますか? 論理的な選択は、キャッシュにあるタイルの不要な JPEG エンコードを回避するため、生のタイルをキャッシュすることです。ただし、RGB ピクセルを保存するには、はるかに大きなキャッシュ サイズが必要です。では、最適なオプションは何ですか?圧縮前または圧縮後?

  • 新しいスクリーン タイルとキャッシュ スタック内のタイルを比較するには、CRC-16 チェックサムだけで十分ですか? CRC が一致する場合、タイルのバイトごとの比較を追加する必要がありますか、それとも冗長ですか? 衝突確率は破棄できるほど低いか?

  • 一般的に、私が説明したスキームについてどう思いますか? その中で何を変えますか?どんな種類の提案もいただければ幸いです!

4

3 に答える 3

1

私はあなたがすべてを説明した方法が好きです。これは確かに実装するのに良いアイデアです.

数か月前に同様のアプリケーションに同様のアプローチを実装しましたが、それと一緒に機能するか、それを置き換えるいくつかの異なるスキームを探しています。

画面に存在するタイルと同じ数のキャッシュ スタック サイズを使用し、タイルが同じ場所の前のタイルと一致するように制限しませんでした。ユーザーがウィンドウを移動している間は非常に役立つと思います。キャッシュ サイズは、処理能力、メモリ、および帯域幅の間のトレードオフです。キャッシュ内のタイルが多いほど、メモリと処理のコストで帯域幅を節約できます。

私も CRC16 を使用しましたが、キャッシュ内のいくつかの CRC にヒットすると、非常に奇妙な画像が生成されるため、これを実装するのは理想的ではありません。処理能力の点で余裕がある場合は、ピクセルごとに一致させるのが最善です。私の場合、できませんでした。

メモリを節約するには、JPEG をキャッシュすることをお勧めします。JPEG から BITMAP を作成すると、品質の点で既に損傷を受けているためです。間違った CRC にヒットする確率は、どちらの場合も同じであると思います。私の場合、JPEGを使用しました。

于 2011-07-29T12:07:36.397 に答える
1

より高速なハッシュ アルゴリズムを使用します。たとえば、murmur2 または Jenkins です。それははるかに優れた独自性を約束します。キャッシュの例については、Spice リモート プロトコル (www.spice-space.org) を参照してください。キャッシュは可能な限り大きくする必要があります (クライアント上または中間プロキシ内)。

于 2012-02-21T11:55:22.513 に答える
0

x11vnc のキャッシュ実装を確認してください。

于 2011-06-09T22:10:13.520 に答える