Эффективность использования видеопамяти WPF 3D - PullRequest
1 голос
/ 23 декабря 2009

Я постараюсь объяснить мою ситуацию как можно лучше, извините, если она не слишком ясна ...

У меня есть Viewport3D, который содержит несколько больших прямоугольников, похожих на большие кристаллы.

Когда пользователь нажимает на один из кристаллов, я добавляю новый материал к кристаллу в том месте, где щелкнул, используя ImageBrush. Затем я перебираю список растровых изображений (List<BitmapImage> collection) и обновляю ImageBrush каждый кадр, чтобы создать анимацию на трехмерном кристалле.

Это хорошо работает, и у меня до 5 различных эффектов, играющих на кристаллах, но после профилирования моего приложения я обнаружил, что из-за мипмапов (я думаю) и способа рендеринга 3d моя видеопамять прыгает через крышу! !

По моим подсчетам, если у меня 75-кадровая анимация, 400х400, работающая с 4 байтами на пиксель и имеющая ~ 5 различных анимаций, вы можете увидеть, как это может быть большим:)

75 * 400 * 400 * 4 * 5 = ~ 250 МБ

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

Моя идея исправить это - заменить коллекцию List<BitmapImage> на List<Byte[]> и вместо обновления ImageSource я хотел бы попытаться использовать WriteableBitmap для записи байтов в него.

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

Может кто-нибудь помочь мне?

1 Ответ

1 голос
/ 23 декабря 2009

WriteableBitmap на самом деле довольно плох с производительностью, хотя и требует грязных областей. Попробуйте использовать InteropBitmap. У меня есть класс, готовый пойти на это здесь:

http://silverlightviewport.codeplex.com/SourceControl/changeset/view/33100#809062

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