| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 - РАБОТАЕТ (дергание анимации исчезло), но создаются куча ненужных файлов. Потом непонятно как там кеширование выполняется, раньше все на автомате кешировалось
, а теперь не знаю ВОПРОСЫ: 1) Как можно создать BitmapImage в другом потоке из инета и передать его UI 2) Как можно только 1 раз создать пустой BitmapImage, и менять в нем только UriSource (лично у меня все время ошибки вылетают при этом) 3) Может у кого есть другие идеи по оптимизации |
| Автор: Kaerus 29.12.2010, 02:03 |
| В общем разобрался, решение оказалось радикальным - перевел все на XNA. Плюсов немерено: программа стала просто летать даже на нетбуках (со встроенной видюхой), жрать меньше память, не требуются диспетчеры потоков, более удобная анимация. Все-таки 3D в WPF жутко тормозное. P.S. При этом сам интерфейс остался на WPF (на хабре есть статья по теме) |