2010-11-08 6 views
2

В моем проекте я делаю большие изменения в пикселях растрового изображения, и я хочу добавить функцию отмены отмены в этот проект. Сохранение нескольких растровых изображений в памяти виртуальной машины не является хорошей идеей. Я думал, что мой единственный выбор - хранить историю (растровые изображения) как temp files. Прежде чем начать реализовывать, я хочу быть уверенным, что я делаю что-то не глупое здесь.- это хорошая идея хранить растровые изображения в качестве временных файлов для реализации функции отмены и повтора?

ответ

2

Зависит от вычислительной мощности и длины истории отмены, которую вы хотите сохранить. Если вы можете применить преобразования с разумной скоростью, то вы можете просто сохранить копию операций bitmap x назад, а в случае отмены просто примените к ней последние преобразования x-1.

2

Как быстро вам нужно отменить, чтобы это произошло? Помните: память быстрее, чем что-либо еще.

Сколько растровых изображений вам нужно, чтобы иметь возможность вернуться и отменить? Если это много, то да, временные файлы могут быть лучшими.

Что делать, если они закрывают приложение и возвращаются позже (или приложение убито для освобождения памяти)? Насколько важно добраться до этих отскоков? Если это важно, вам нужно сохранить их на диск.

Насколько велики изображения? Это также может повлиять на ваше решение о том, сколько вы могли бы в памяти.

Возможно, даже рассмотреть некоторые из них? Сохранять последнее в памяти и сохранять его и все остальные на диск?

2

Независимо от того, есть ли у вас место в куче, сохранение состояния отмены в вашем постоянном хранилище (а не временные файлы) является вашим единственным вариантом. Пользователь может покинуть ваше приложение, после чего ваш процесс может быть убит. По возвращении вам необходимо перезапустить приложение с тем же состоянием, которое они видели в последний раз. Все, что у вас было в вашей собственной куче, больше не будет; вы не можете поместить большие растровые изображения в Bundle в onSaveInstanceState(). Поэтому вам нужно разместить их в постоянном хранилище.

Просто убедитесь, что вы не блокируете пользовательский интерфейс, делая это - асинхронно записывайте новое состояние с обновления пользовательского интерфейса.