2011-02-25 40 views
0

我正在尝试为WP7创建自己的远程桌面。我有一个WCF服务,它返回目标机器屏幕上的图像。在WP7上不断改变图像的最佳性能方式是什么?

这里的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中崩溃。这已经非常慢了(图像显示比屏幕上的时间迟了半秒钟),并且我想知道是否有更好/更快的方式来执行此操作?任何帮助都会很棒。提前致谢。

回答

4

我想我可以对你的OutOfMemoryException有所了解。你知道IDisposable接口吗? MemoryStream类型是IDisposable,因此您必须在其上调用Dispose以确保它被垃圾回收并释放其保留的任何资源。您的代码应该如下:

using(MemoryStream stream = new MemoryStream(data)) 
{ 
    BitmapImage image = new BitmapImage(); 
    image.SetSource(stream); 
} 

关于性能,真正实现了远程桌面(RDP)应用程序不发送整个屏幕图像,每次有新的变化,他们为了尽量减少带宽使用发送部分更新。

如果您打算每次都进行全屏刷新,请确保它适当缩放并压缩。

+0

做过桌面远程合理的理解哇,我不得不说我忘了这件事感觉很愚蠢。万分感谢。 – ProgrammerAl 2011-02-25 19:06:40

1

ColinE是对的,但有一个细微之处。如果你使用他的代码,它会自动处理图像,一旦它被设置为源。这样做的结果可能是一个错误,表明您试图从非UI线程更新UI,或在尝试可视化已放置的Bitmap时导致问题。

相反,我会选择保留对当前图像的引用,然后更改图像,然后使用参考前一个当前图像来处理该图像。没有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();

此外,如果你想dan't重塑得多车轮看看VNC,VNC#是它的一个libary和它给你的他人如何

相关问题