[英]What's best performance way to constantly change image on WP7?
我正在尝试为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崩溃。 这已经很慢了(图像比屏幕上的显示晚了半秒钟),我想知道是否有更好/更快的方法? 任何帮助都会很棒。 提前致谢。
我想我可以阐明您的OutOfMemoryException。 您是否知道IDisposable接口? MemoryStream类型是IDisposable,因此必须在其上调用Dispose以确保已对其进行垃圾回收并释放了其拥有的所有资源。 您的代码应如下所示:
using(MemoryStream stream = new MemoryStream( data ))
{
BitmapImage image = new BitmapImage( );
image.SetSource( stream );
}
关于性能,真正的远程桌面(RDP)应用程序不会在每次更改时发送整个屏幕图像,而是发送部分更新以最大程度地减少带宽使用。
如果每次都要进行全屏刷新,请确保已适当缩放和压缩它。
ColinE是正确的,但有细微差别。 如果使用他的代码,将其设置为源后,它将自动处理该图像。 结果可能是错误,表明您已尝试从非UI线程更新UI,或者在尝试可视化已准备就绪的位图时导致问题。
相反,我会选择保留对当前图像的引用,然后更改图像,然后使用对先前的当前图像的引用来处置该图像。 没有访问IDE atm的权限,而是访问其他东西的权限(假设代码在UI线程中运行,否则,您还必须确保代码在此处被唤醒)。
MemoryStream流=新的MemoryStream(data); BitmapImage图片=新的BitmapImage();
image.SetSource(stream);
IDisposable toDispose =(IDisposable)BackgroundImage.Source;
BackgroundImage.Source =图片;
toDispose.Dispose();
另外,如果您不想重蹈覆辙,请查看VNC, VNC#是它的库,它使您可以合理地了解其他人之前如何进行桌面远程处理
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.