Я пытаюсь создать приложение для растрового редактора для iphone, которое будет похоже на Brushes или Layers или вырезанную версию Photoshop. Я хотел бы иметь возможность поддерживать изображения с разрешением 1000x1000 с примерно 4 слоями, если это возможно.
Я пытаюсь создать свою систему отмены/повтора, прежде чем писать слишком много кода, и у меня возникают реальные проблемы с хорошим решением из-за ограничений мобильного устройства и того факта, что операции с растровым редактором обычно разрушительный. Самые распространенные проекты отмены/повтора, о которых я знаю, следующие:
-
Используйте шаблон команды. Вы сохраняете начальное состояние и команды, используемые для преобразования этого состояния в текущее состояние. Чтобы отменить, вы перезагружаете начальное состояние и воспроизводите все команды, кроме последнего.
-
Используйте шаблон памяти. После каждой операции вы храните достаточно информации, чтобы иметь возможность вернуть эту операцию.
Я предвижу следующие проблемы:
-
Шаблон команды: что мне делать после 500 операций редактирования, и я хочу отменить последний? Загрузка начального состояния и применение 499 может занять много времени, особенно если некоторые из них являются дорогостоящими вещами, например, применяя фильтры размытия. Мне не нравится, как отмена происходит в разное время в разных сценариях.
-
Memento pattern: Сохранение частей модифицированного растрового изображения требует большой памяти. Кэширование этих растровых изображений на диск также может быть медленным (поэтому у меня могут возникнуть проблемы с кешированием растровых изображений, если пользователь делает много быстрых изменений), и я не уверен в том, что последствия использования батареи.
Единственные решения, о которых я могу думать, следующие:
-
Используйте шаблон команды и шаблон памяти, где каждые 10 команд или около того или после дорогостоящей операции сохраняется также все состояние (что дает вам возможность автосохранения бесплатно). Чтобы отменить, я перезагружаю ближайший моментальный снимок, а затем воспроизвожу команды. Однако я предпочел бы избежать этой сложности.
-
Используйте шаблон памяти и заставляйте пользователя ждать кэширования растровых изображений. Это не так уж плохо, если я построю это время, например. ожидая применения фильтра, но он не очень хорошо работает между мазками кисти.
Есть советы? Мне было бы интересно узнать, как это делают некоторые существующие приложения.
Я могу думать о всех видах странных гибридов выше, но все они имеют очевидные проблемы. Все, что я могу сделать, это жить с некоторыми из этих проблем или скомпрометировать приложение, чтобы упростить задачу (например, уменьшить размер максимального размера растрового изображения). Я заметил, что несколько приложений имеют довольно низкие максимальные размеры растровых изображений и уровни слоев.