首先,我一直在学习Microsoft Surface大约1-2个月,我的项目要求我考虑将VNC查看器的使用纳入我的Surface应用程序。
我已经从VNC control for WPF application查看了VNCSharp和VNCSharpWpf,我现在正在使用VNCSharpWpf,因为它在WPF环境中有更好的用户交互,尽管与那里的观众相比,性能有些欠缺。
这是我的问题,Microsoft Surface WPF和默认WPF在处理帧缓冲区/线程方面有什么区别吗?
我注意到当客户端尝试在Surface环境中绘制矩形时,它会导致一个异常,即要更新的矩形有0宽度和高度。
但是,当我在VNCSharpWPF的作者提供的示例代码上测试它(窗口上的WPF)时,错误永远不会发生。
我尝试通过设置和if子句来解决方法,只有在解码的矩形的宽度和高度不为0时进行绘制。虽然它可以防止应用程序崩溃,但只要有变化,就会导致屏幕周围出现死像素。服务器端的屏幕。
我已经坚持这种情况已经持续了1-2周,并且已经没有想法,需要一些关于我应该调查的指导
或者是否有任何很酷的VNC查看器/服务器我可以用于我错过的Surface项目?
答案 0 :(得分:3)
我在PC上遇到了与VNCSharp WPF相同的问题,并且在为WinForms测试了VNC Sharp时,它运行正常。
此外,当我在Debug上测试VNCSharp for WPF时,它运行正常,但在Release上失败。
我浪费了几个小时来调试它(我已经了解了VNC协议的一些部分,因为我发现它以某种方式从错误的位置读取远程设备的宽度和高度netowrk流)。
该错误与浮动比较有关。这取决于您拥有的机器(它可能在某些机器上运行良好,在其他机器上运行良好)
请查看第349行的VncClient:
if (rfb.ServerVersion == 3.8) rfb.ReadSecurityFailureReason();
如果您在调试时在那里放置一个断点,您会看到rfb.ServerVersion是3.8f
ServerVersion返回一个计算浮点数:
public float ServerVersion {
get {
return (float) verMajor + (verMinor * 0.1f);
}
}
您应该期望,因为ServerVersion是3.8,所以它将执行 ReadSecurityFailureReason读取代码工作所需的一些额外字节,但是在Release(Ctrl + F5,因为在Visual Studio Release中,而代码正在调试,它可能工作正常)这些额外的字节将不会被读取,所以宽度和高度将从流上的错误位置读取,导致它比0px超过0px
为了解除我的观点,请使用以下代码,并将其编译为x86(我假设你有一台x64机器和x64操作系统,因为这是这里的情况):
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);
}
}
}
在Debug x86中运行代码(使用visual studio调试器和Ctrl + F5) 您应该看到在两种情况下都收到消息:“版本是3.8”。 现在将其更改为Release x86 ...使用F5运行它。你应该得到消息。 现在用Ctrl + F5运行它... WTF ??,没有消息!
为了解决Vnc Sharp WPF中的错误,我采用了RfcProtocol类,并添加了另一个函数:
public bool CompareVersion(int major, int minor)
{
return major == verMajor && minor == verMinor;
}
现在在VNC客户端(第188和349行)上,我已经更改了代码,因此它将使用新功能进行比较,而不是比较2个浮点数。