2011-02-25 36 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和它給你的他人如何

相關問題