Проблема оптимизации производительности графики - PullRequest
0 голосов
/ 10 сентября 2010

Вот проблема:

Мне нужно прокрутить огромное изображение волновой формы, которое было визуализировано ранее, WPF не позволил мне назначить это огромное (80000 * 256) изображение для изображения, оноработает с изображениями меньшего размера (30000 * 256), но анимация настолько медленная, что это непрактично.

Поэтому я решил использовать WriteableBitmap, который я назначаю своему Image.Source, и тогда мне нужно только обновитьскажем, 1920 * 256 (или только ширина экрана).Теперь он работает намного лучше, но после некоторого профилирования кажется, что сам процесс копирования занимает довольно много времени, и каждый раз это не 60 кадров в секунду.

Я уже записываю в растровое изображение, блокируя его и используя указатели.*

Мой вопрос:

Знаете ли вы какой-либо (более быстрый) способ обновления растрового изображения?

Эти пиксели уже находятся в памяти в огромном растровом изображении, чтение отсюда прямомудрая идея;ну, избавьтесь от WriteableBitmap между моим Image.Source и моим BitmapData.

Спасибо за вашу помощь:)

Ответы [ 3 ]

1 голос
/ 12 сентября 2010

Вы можете попробовать использовать InteropBitmap для обновления пикселей, так как WriteableBitmap немного медленный с внутренними операциями, связанными с процессором.У меня есть некоторый код, который использует его: http://silverlightviewport.codeplex.com/SourceControl/changeset/view/57274#1534506

Он жестко задан для Bgra32, единственного цветового пространства, поддерживаемого InteropBitmap в 3.5 SP1.В 4.0 он должен поддерживать 24-битные цветовые пространства.

1 голос
/ 10 сентября 2010

Вы можете попробовать использовать BitmapSource.CopyPixels для извлечения байтов с информацией о цвете из изображения (не уверен, если вам это нужно) и BitmapSource.Create , который создает битовую карту избайтовый массив (или его перегрузка , которая может получать информацию о цвете непосредственно из неуправляемой памяти ).

0 голосов
/ 19 сентября 2010

Я исправил это, используя GC.Collect; до сих пор не могу поверить, что это решило проблему. Не знаю, хорошая ли это практика, но она работает ...

Это дало мне головные боли и ночные кошмары в последние несколько дней, но сейчас большинство разобрано. Забавный вывод, который я сделаю по этому поводу, заключается в том, что GCCollectionMode.Optimized, думает, что никогда не время собирать память, он начал использовать 2Gb, дестабилизировать всю систему (Windows) до того момента, пока она не замерзнет, ​​лол ...

Спасибо за вашу помощь: -)

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