繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM