Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Создание множества BitmapImage в UI Thread


Автор: Kaerus 13.12.2010, 20:34
Многие наверное знают Cooliris, меня заинтересовал ее 3D интерфейс, решил реализовать его на чистом WPF 3D (без DirectX и т.п.). Специфика программы что требуется за раз создать около 90 BitmapImage из списка Uri. Все вроде бы оптимизировал, что бы изображения грузились быстрее, да они и так в фоне грузяться и теор. не должны мешать UI Thread, хотя создаваться он должен именно в потоке UI (так как BitmapImage привязан к диспетчеру)

Вот тут и весь подвох: создания одного BitmapImage (просто вызов new BitmapImage(uri) ) отнимает около 15мс, а их нужно 90 => 0.015*90 ~ 1.3 сек. Ладно это не заметно когда изображения сами подгружаются секунд 5-10 и камера статична.
Но если при этом камерой вращать влево-вправо, а когда ее отпускаешь она сама поворачивается на место (с помощью анимации) -> вот и появляется дерганье и зависания короткие, но периодические (юзабилити страдает :(

Что пытался сделать:
1) Изменить DispatcherPriority до минимума в методе добавления ссылок в ObservableCollection - не помогло, только изображения стали позже появляться
2) Создавать BitmapImage в другом потоке, замораживать его и передавать UI - проблема оказалась в том что нельзя заморозить BitmapImage созданный из ссылки на изображение в WWW
3) Загружать вручную изображение в /Temp папку и из него уже создавать BitmapImage, замораживать и отправлять UI - РАБОТАЕТ (дергание анимации исчезло), но создаются куча ненужных файлов. Потом непонятно как там кеширование выполняется, раньше все на автомате кешировалось
Код

  <system.net>
    <requestCaching defaultPolicyLevel="CacheIfAvailable" />
  </system.net>

, а теперь не знаю

ВОПРОСЫ:
1) Как можно создать BitmapImage в другом потоке из инета и передать его UI
2) Как можно только 1 раз создать пустой BitmapImage, и менять в нем только UriSource (лично у меня все время ошибки вылетают при этом)
3) Может у кого есть другие идеи по оптимизации

Автор: Kaerus 29.12.2010, 02:03
В общем разобрался, решение оказалось радикальным - перевел все на XNA. Плюсов немерено: программа стала просто летать даже на нетбуках (со встроенной видюхой), жрать меньше память, не требуются диспетчеры потоков, более удобная анимация. Все-таки 3D в WPF жутко тормозное.

P.S.
При этом сам интерфейс остался на WPF (на хабре есть статья по теме)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)