什么是在WP7上不断更改图像的最佳性能方式?

时间:2011-02-25 07:07:59

标签: c# wcf performance windows-phone-7

我试图为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崩溃。这已经非常缓慢了(图片显示的时间晚于屏幕上显示的半秒),我想知道是否有更好/更快的方法吗?任何帮助都会很棒。提前谢谢。

2 个答案:

答案 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#就是它的一个库,它可以让你理解其他人之前是如何进行桌面远程处理的