WPF представляют производительность с BitmapSource

Без фактической базы данных я не уверен, сработает ли это, но вот моя попытка:

var qryResults =
    (from r in dbContext.Routes
     join br in dbContext.BrokerRoutes on r.RouteId equals br.RouteId
     where br.Broker.ApiKey == apiKey
     join pr in dbContext.RoutePathFilters.Include(x => x.PathFilter) on r.RouteId equals pr.RouteId into paths
     group new { r, paths } by r.RouteId into rprg
     let r = rprg.First().r
     select new RouteTemplate {
         RouteId = rprg.Key,
         Version = r.Version.Version,
         Url = r.Url,
         IsActive = r.IsActive,
         Paths = rprg.Select(rpr => rpr.paths.First().PathFilter.FilterName).ToList()
     })
    .AsNoTracking()
    .ToImmutableList();
7
задан Daniel Wolf 2 May 2009 в 14:53
поделиться

2 ответа

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

Я согласен с вами, что это, вероятно, поток рендеринга: I выполнил тест, и поток пользовательского интерфейса все еще успешно отправлял сообщения, в то время как эта задержка рендеринга происходила из-за попытки отобразить полностью предварительно кэшированный BitmapImage.

Это должно быть какое-то преобразование или подготовка изображения, как вы спекуляционные. Я пытался смягчить это в своем приложении, «рендеринг», но скрывая изображение, а затем раскрывая его, когда мне нужно показать его. Однако это далеко не идеально, потому что замораживание рендеринга происходит в любом случае.

(Правка)

Некоторое продолжение: После обсуждения псевдонима MS WPF я нашел причину задержек. На моей машине с Server 2008 это была комбинация старых видеодрайверов, которые не поддерживают новую модель драйвера WDDM, и задержка для изменения размера изображения.

Если исходный размер изображения отличается от размера дисплея, это приведет к задержке сделать нить до того, как изображение появится. По умолчанию для изображения установлено самое высокое качество, но вы можете изменить параметры масштабирования для рендеринга, вызвав RenderOptions.SetBitmapScalingMode (uiImage, BitmapScalingMode.LowQuality); . Как только я это сделал, загадочное замораживание перед отображением изображения прошло. Альтернативой, если вам не нравится падение качества при масштабировании, является загрузка BitmapImage с DecodePixelWidth / Height, равным размеру, при котором он будет отображаться.

3
ответ дан 7 December 2019 в 16:45
поделиться

Также попробуйте следующее:

/* ivis is declared in XAML <Image x:Name="iVis" UseLayoutRounding="True" SnapsToDevicePixels="True" /> */

iVis.Stretch = Stretch.None;
RenderOptions.SetBitmapScalingMode(iVis, BitmapScalingMode.NearestNeighbor);
RenderOptions.SetEdgeMode(iVis, EdgeMode.Aliased);
VisualBitmapScalingMode = BitmapScalingMode.NearestNeighbor;
iVis.Source = **** your bitmap source ****

У меня были проблемы с производительностью при использовании огромного количества цветов канала "A", но дождавшись окончания рендеринга изображения для масштабирования, я стал работать гораздо лучше.

Также, как вы сказали, вы используете плиточную графику?

Обычно вы используете TileBrush, чтобы просто установить его в качестве кисти на вашем элементе FrameworkElement. Если вы анимируете их или добавляете новые динамически, вы можете сгенерировать кисти и применить их к объекту вручную, не забудьте заморозить их, если сможете. Также, VisualBitmapScalingMode является свойством любого Visual.

0
ответ дан 7 December 2019 в 16:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: