如何在Silverlight中尽可能快地渲染一系列计算的位图?

时间:2011-03-30 03:43:44

标签: silverlight silverlight-4.0

我有兴趣尽快为Silverlight中的屏幕显示一系列计算位图以用于动画。现在这是我正在使用的策略,这导致我的笔记本电脑上的50年代中期FPS为1200x700像素图像。

你能推荐一种更好的方法吗?

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();
    }

}

2 个答案:

答案 0 :(得分:0)

QuakeLight大致采用以下解决方案:

您可以制作一个非常基本的PNG编码器(原始位图,不压缩,如果必须,可以从QuakeLight获取),而不是使用WriteableBitmap。使用像素数据填充普通数组,将其编码为内存中的PNG,然后将其包装在MemoryStream中并将其附加到Image。制作未压缩的PNG基本上意味着在数组前面打一个固定大小的标题。

您甚至可以使用生产者 - 消费者队列,以便您可以在单独的线程中构建PNG,从而可以利用多核系统提高性能。

希望这会有所帮助。如果您尝试这种方法,请分享您的经验。

答案 1 :(得分:0)

最快的方法可能是将动画中的图像预渲染为WriteableBitmaps列表,然后有选择地将每个图像设置为Image控件的源。