2

まず第一に、私は Microsoft Surface を約 1 ~ 2 か月間学習しており、私のプロジェクトでは、VNC ビューアーの使用を Surface アプリケーションに組み込むことを検討する必要があります。

WPF アプリケーションの VNC コントロールから VNCSharp と VNCSharpWpf を調べました。現在、VNCSharpWpf を使用しています。これは、WPF 環境でのユーザー操作が優れているためです。ただし、パフォーマンスはビューアーに比べてやや不足しています。

これが私の質問です。フレームバッファ/スレッドの処理方法に、Microsoft Surface WPF とデフォルトの WPF に違いはありますか?

クライアントが Surface 環境で四角形を描画しようとすると、更新される四角形の幅と高さが 0 になるという例外が発生することに気付きました。

ただし、VNCSharpWPF の作成者が提供するサンプル コード (WPF on Window) でテストすると、エラーは発生しません。

デコードされた四角形の幅と高さが 0 でない場合にのみ描画するように if 句を設定することで回避策を試みました。これにより、アプリケーションのクラッシュは防止されますが、画面に変更があるたびに画面の周りにデッド ピクセルが発生します。サーバーエンド。

私はすでに 1 ~ 2 週間この状況で立ち往生しており、アイデアが尽きており、どこを調べるべきかについてのガイダンスが必要です。

または、見逃していた Surface プロジェクトに使用できるクールな VNC ビューアー/サーバーはありますか?

4

1 に答える 1

3

私は PC 上の VNCSharp WPF で同じ問題を抱えていましたが、VNC Sharp for WinForms をテストしたところ、問題なく動作しました。

さらに、デバッグで WPF の VNCSharp をテストしたところ、問題なく動作しましたが、リリースで失敗しました。

私はそれをデバッグするのに数時間を無駄にしました(ネットワークストリームの間違った場所からリモートデバイスの幅と高さを何らかの方法で読み取ることがわかったので、VNCプロトコルのいくつかの部分を学びました)。

このバグは float の比較に関連しています。使用しているマシンによって異なります (マシンによってはうまく動作する場合とそうでない場合があります)。

VncClient の 349 行目を見てください。

  if (rfb.ServerVersion == 3.8) rfb.ReadSecurityFailureReason();

デバッグ中にそこにブレークポイントを置くと、rfb.ServerVersion が 3.8f であることがわかります。

ServerVersion は、計算された float を返します。

    public float ServerVersion {
        get {
            return (float) verMajor + (verMinor * 0.1f);
        }
    }

ServerVersion が 3.8 であるため、ReadSecurityFailureReason が実行され、コードが機能するために必要な余分なバイトが読み取られることを期待する必要がありますが、リリース時 (Visual Studio リリースではコードがデバッグされているため、Ctrl+F5)おそらく問題なく動作します) これらの余分なバイトは読み取られないため、幅と高さがストリームの間違った場所から読み取られ、0px を超える 0px になります。

私の主張を実証するために、次のコードを取得し、x86 としてコンパイルしてください (これがここの状況であるため、x64 マシンと x64 OS があると想定しています)。

    class Program
{
    static void Main(string[] args)
    {
        SomeVersion someVersion = new SomeVersion(3, 8);

        if (someVersion.Version == 3.8f)
        {
            Console.WriteLine("Version is 3.8");
        }

        Console.ReadLine();
    }

}

public class SomeVersion
{
    private int _major;
    private int _minor;

    public SomeVersion(int major, int minor)
    {
        _major = major;
        _minor = minor;
    }

    public float Version
    {
        get
        {
            return (float)_major + (_minor * 0.1f);
        }
    }
}

デバッグ x86 でコードを実行します (Visual Studio デバッガーと Ctrl+F5 の両方を使用)。どちらの場合でも、"バージョンは 3.8" というメッセージが表示されるはずです。ここで、Release x86 に変更します... F5 で実行します。メッセージが表示されるはずです。今すぐ Ctrl + F5 で実行してください... WTF??、メッセージはありません!

Vnc Sh​​arp WPF のバグを修正するために、クラス RfcProtocol を取得し、別の関数を追加しました。

    public bool CompareVersion(int major, int minor)
    {
        return major == verMajor && minor == verMinor;
    }

VNC クライアント (188 行と 349 行の両方) で、2 つの float を比較する代わりに、新しい関数を使用して比較するようにコードを変更しました。

于 2014-01-20T06:53:56.957 に答える