2011-03-30 46 views
0

我感興趣的是儘可能快地對動畫的目的在Silverlight顯示一系列計算的位圖到屏幕上。現在這是我正在使用的策略,結果是我的筆記本電腦在50年代中期的FPS可以拍攝1200x700像素的圖像。如何在Silverlight中儘可能快地渲染一系列計算位圖?

你能推薦一個更好的辦法?

public partial class MainPage : UserControl 
{ 
    private int _height; 
    private int _width; 
    private WriteableBitmap _bitmap; 
    private DateTime _start; 
    private int _count = 0; 

    public MainPage() 
    { 
     InitializeComponent(); 
     _width = (int)this.MainImage.Width; 
     _height = (int)this.MainImage.Height; 

     _bitmap = new WriteableBitmap(_width, _height); 
     this.MainImage.Source = _bitmap; 

     _start = DateTime.Now; 
     RenderFrame(); 
    } 

    private void RenderFrame() 
    { 
     Dispatcher.BeginInvoke(RenderFrameHelp); 
    } 

    private void RenderFrameHelp() 
    { 
     int solid = -16777216; 
     for (int i = 0; i < _width * _height; i++) 
     { 
      _bitmap.Pixels[i] = _count % 2 == 0 ? 255 : 100 | solid; 
     } 
     _bitmap.Invalidate(); 
     this.FPS.Text = (_count++/(DateTime.Now - _start).TotalSeconds).ToString(); 
     RenderFrame(); 
    } 

} 

回答

0

QuakeLight大致採用以下解決方案:

而不是使用一個WriteableBitmap的,你可以做一個非常基本的PNG編碼器(原始位,無壓縮,如果你必須把它從QuakeLight)。用像素數據填充一個正常的數組,將其編碼爲PNG內存,然後將其包裝在MemoryStream中並將其附加到Image上。製作一個未壓縮的PNG基本上意味着在陣列前打一個固定大小的標題。

你甚至可以使用一個生產者 - 消費者隊列,這樣就可以在一個單獨的線程構建PNG,讓你利用多核系統有更好的表現。

希望這會有所幫助。分享你的經驗,如果你嘗試這種方法。

+1

我相信WriteableBitmap的比PNG編碼方法快得多。這個方法或多或少是相同的,但是你不必爲記憶流和png頭部而煩惱。 – 2011-03-30 18:55:22

0

最快的方法很可能將是預渲染動畫的圖像WriteableBitmaps的列表,然後選擇性地設置他們每個人作爲一個形象的源頭控制。