Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание множества BitmapImage в UI Thread, Тормозит 3D анимацию 
V
    Опции темы
Kaerus
Дата 13.12.2010, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WPF'er
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 3.9.2010

Репутация: 1
Всего: 1



Многие наверное знают 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 - 13.12.2010, 22:09
PM MAIL ICQ   Вверх
Kaerus
Дата 29.12.2010, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WPF'er
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 3.9.2010

Репутация: 1
Всего: 1



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

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

Это сообщение отредактировал(а) Kaerus - 29.12.2010, 02:08
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0871 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.