Как максимально быстро отобразить серию вычисленных растровых изображений в Silverlight? - PullRequest
0 голосов
/ 30 марта 2011

Я заинтересован в том, чтобы как можно быстрее отображать на экране в 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 голосов
/ 30 марта 2011

Самый быстрый подход, вероятно, состоит в том, чтобы предварительно визуализировать изображения в вашей анимации в виде списка WriteableBitmaps, а затем выборочно установить каждое из них в качестве источника элемента управления Image.

0 голосов
/ 30 марта 2011

QuakeLight использует примерно следующее решение:

Вместо использования WriteableBitmap вы можете создать очень простой PNG-кодировщик (необработанный растровый рисунок, без сжатия, при необходимости используйте QuakeLight).Заполните обычный массив данными пикселей, закодируйте его как PNG в памяти, затем оберните его в MemoryStream и присоедините к изображению.Создание несжатого PNG в основном означает создание заголовка фиксированного размера перед вашим массивом.

Вы даже можете использовать очередь производителя-потребителя, чтобы вы могли построить свой PNG в отдельном потоке, позволяя вам использовать многоядерныйсистемы для лучшей производительности.

Надеюсь, это поможет.Поделитесь своим опытом, если попробуете этот метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...