Производительность WPF Bitmap - PullRequest
       7

Производительность WPF Bitmap

8 голосов
/ 13 февраля 2012

Я пытаюсь понять, почему мои изображения не являются быстрыми, поэтому я создал пример для проверки производительности WPF. Я использовал таймер, чтобы вычислить, как долго выполнялся мой обработчик событий «отображения изображений», и использовал секундомер, чтобы измерить, сколько времени потребовалось для отображения изображений на экране. Итог: при отображении 100, 1600, 2500 и 3600 изображений WPF потребовалось 2, 9, 12 и 16 секунд после , когда мой код завершил отображение изображений на экране. Поэтому я чувствую себя беспомощным: кажется, я не могу улучшить свой код, чтобы заставить изображения появляться быстрее - мне нужно что-то сделать с WPF!

Итак, мой вопрос: Что мне нужно сделать по-другому, чтобы ускорить отображение изображений?


Настройка теста проста:

Окно содержит сетку. После нажатия кнопки «Тест» добавляются определения строк и столбцов. Затем изображение добавляется в каждую ячейку сетки следующим образом:

            var image = new Image();
            image.BeginInit();
            image.Name = ImageNameFromCell(theRow, theColumn);
            image.Stretch = Stretch.None;
            image.HorizontalAlignment = HorizontalAlignment.Center;
            image.VerticalAlignment = VerticalAlignment.Center;
            RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.LowQuality);
            image.EndInit();

            theGrid.Children.Add(image);

Наконец, для источника каждого изображения задано растровое изображение: изображение в оттенках серого уже уменьшено до предполагаемого размера экрана. Растровое изображение генерируется следующим образом:

            var smallerBitmapImage = new BitmapImage();
            smallerBitmapImage.BeginInit();
            smallerBitmapImage.DecodePixelWidth = (int)(theImageWidth);
            smallerBitmapImage.UriSource = theUri;
            smallerBitmapImage.CacheOption = BitmapCacheOption.None;
            smallerBitmapImage.EndInit();

            //BitmapFrame bitmapFrame = BitmapFrame.Create(this.FullPath);

            var convertedBitmap = new FormatConvertedBitmap();
            convertedBitmap.BeginInit();
            convertedBitmap.Source = smallerBitmapImage;
            convertedBitmap.DestinationFormat = PixelFormats.Gray16;
            convertedBitmap.EndInit();
            convertedBitmap.Freeze();

Итак, я в своем уме. Изображения появляются с заметной задержкой, и это, кажется, вне моего контроля. Что я могу сделать?

Ответы [ 2 ]

3 голосов
/ 15 февраля 2012

То, что, кажется, имело значение, состоит в установке параметра кэширования изображения на OnLoad

smallBitmapImage.CacheOption = BitmapCacheOption.OnLoad;

Это переместило работу в мой обработчик событий, так что теперь я могу использовать предварительную выборку, чтобы сделать это на заднем плане.

3 голосов
/ 13 февраля 2012

Вы на самом деле видите все эти изображения одновременно?Если нет, вы можете использовать ItemsControl с панелью виртуализации, чтобы отображались только изображения.(Говоря о панелях, ваша текущая настройка также может быть заменена на ItemsControl, который использует UniformGrid как панель )

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

...