Я постараюсь объяснить мою ситуацию как можно лучше, извините, если она не слишком ясна ...
У меня есть 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
и записывать байты в него снова и снова в эффективном поместье.
Может кто-нибудь помочь мне?