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

Я пытаюсь понять, почему мои изображения не мгновенные, поэтому я создал образец для проверки производительности 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();

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

8
задан Avi 13 February 2012 в 18:18
поделиться