Эффективное переключение изображения при перетаскивании - PullRequest
2 голосов
/ 24 января 2011

У меня есть 200 изображений на SD-карте , которые представляют 360 представлений объекта кадр за кадром.
Я хочу, чтобы пользователь «вращал» объектперетаскивая палец над изображением.

У меня нет проблем с реализацией события перетаскивания, проблема с загрузкой и переключением между изображениями.Кэширование всех изображений перед отображением действия невозможно из-за ограниченной виртуальной памяти (изображения довольно большие, разрешение превышает SVGA) для процесса.Загрузка изображений по событию перетаскивания неэффективна - далеко не даже приемлемо.

Кто-нибудь сталкивался с такой проблемой или схожим?
Любая помощь будет высоко ценится.

Ответы [ 3 ]

1 голос
/ 24 января 2011

Ограниченная память VM, которую вы упоминаете, также называемая размером кучи VM, которая составляет около 16 МБ, влияет только на память, выделенную в Java.Вы можете выделить больше памяти в собственном коде.На реальных устройствах, как правило, сотни мегабайт оперативной памяти.

Однако, если ваше приложение использует слишком много памяти, оно все равно может быть уничтожено системой.Поэтому, когда вам нужно иметь дело с большой памятью, лучшее решение - использовать отображение файлов памяти с помощью функции Linux mmap ().Это довольно умно и работает как своп.Используя mmap (), вы можете даже отобразить больше памяти, чем фактический физический объем ОЗУ, и ядро ​​будет загружать / выгружать страницы памяти по мере необходимости из базового файла.

Однако я не думаю, что вы можете использоватьmmapped память со стандартными виджетами, такими как ImageView.Кроме того, чтобы добиться плавного переключения изображений и прокрутки в том, что вы объясняете, я считаю, что требуется OpenGL.

Поэтому я бы рекомендовал загружать и декодировать изображения в область памяти mmaped, чтобы эффективно использовать их в качестве текстур OpenGL (есть поток android-ndk с подробностями об этом, см. этот пост и последующие).

0 голосов
/ 24 января 2011

Вы можете пропустить некоторые изображения и деформировать ближайший / интерполировать 2 ближайших для обслуживания пропущенного изображения.

После остановки вращения загрузите правильное изображение.Таким образом, даже небольшое вращение заметно (и, следовательно, вы можете вращаться с еще большей детализацией.

Но это более требовательно к вычислительной мощности, поэтому его торговля составляет.

0 голосов
/ 24 января 2011

Самое простое решение - использовать меньше фотографий и / или уменьшить разрешение изображения.Вы можете использовать меньше изображений при более низком разрешении, а затем, когда изображение перестает вращаться, загрузить фотографию высокого разрешения.200 фотографий - это много, только для фотографии на 360 градусов.

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