我试图为WP7制作我自己的远程桌面类型。我有一个WCF服务,它返回目标机器屏幕上的图像。
这里是WCF服务器代码:
// Method to load desktop image
Bitmap image = new Bitmap( ViewSize.Width, ViewSize.Height );
Graphics g = Graphics.FromImage( image );
g.CopyFromScreen( Position.X, Position.Y, 0, 0, ViewSize );
g.Dispose( );
return image;
// Convert image to byte[] which is returned to client
using ( MemoryStream ms = new MemoryStream( ) )
{
Bitmap image = screenGrabber.LoadScreenImage( );
image.Save( ms, ImageFormat.Jpeg );
imageArray = ms.ToArray( );
}
这是WP7客户端的代码:
MemoryStream stream = new MemoryStream( data );
BitmapImage image = new BitmapImage( );
image.SetSource( stream );
BackgroundImage.Source = image;
BackgroundImage变量是一个Image控件。
我在短时间内注意到模拟器上的这种冻结,并最终会从OutOfMemoryException崩溃。这已经非常缓慢了(图片显示的时间晚于屏幕上显示的半秒),我想知道是否有更好/更快的方法吗?任何帮助都会很棒。提前谢谢。
答案 0 :(得分:4)
我想我可以对你的OutOfMemoryException有所了解。你知道IDisposable界面吗? MemoryStream类型是IDisposable,因此您必须在其上调用Dispose以确保它被垃圾回收并释放它所拥有的任何资源。您的代码应如下所示:
using(MemoryStream stream = new MemoryStream( data ))
{
BitmapImage image = new BitmapImage( );
image.SetSource( stream );
}
关于性能,真正的远程桌面(RDP)应用程序不会在每次更改时发送整个屏幕图像,它们会发送部分更新以最大限度地减少带宽使用。
如果您打算每次都进行全屏刷新,请确保进行适当缩放和压缩。
答案 1 :(得分:1)
ColinE是对的,但有一个细微差别。如果您使用他的代码,它将在图像被设置为源后自动处理。结果将是一个错误,表明您已尝试从非UI线程更新UI或在尝试可视化已经布置的位图时导致问题。
相反,我会选择保持对当前图像的参考,然后更改图像,然后使用对先前当前图像的参考来处理该图像。无法访问IDE atm,但有些内容(假设代码在UI线程中运行,否则您还必须确保代码在那里被激发)。
MemoryStream stream = new MemoryStream(data);
BitmapImage image = new BitmapImage();
image.SetSource(stream);
IDisposable toDispose =(IDisposable)BackgroundImage.Source;
BackgroundImage.Source = image;
<强> toDispose.Dispose(); 强>
此外,如果你不想重新发明轮子的大部分时间来看看VNC,那么VNC#就是它的一个库,它可以让你理解其他人之前是如何进行桌面远程处理的