Быстро отмените средство для растрового приложения редактора

Я пытаюсь сделать растровое приложение редактора для iPhone, который был бы подобен Кистям или Слоям или усеченной версии Photoshop. Я хотел бы смочь поддерживать 1000x1000 изображения разрешения приблизительно с 4 слоями, если это возможно.

Я пытаюсь разработать свою систему отмены/восстановления, прежде чем я напишу слишком много кода, и у меня есть реальные проблемы, предлагающие хорошее решение из-за ограничений мобильного устройства и того, что растровые операции редактора являются обычно разрушительными. Наиболее распространенная отмена/восстановление разрабатывает, я знаю о:

  1. Используйте шаблон "команда". Вы храните начальное состояние, и команды раньше преобразовывали это к текущему состоянию. Для отмены Вы перезагружаете начальное состояние и воспроизводите все команды за исключением последней.

  2. Используйте шаблон "memento". После каждой операции Вы храните достаточно информации, чтобы смочь вернуться та операция.

Проблемы, которые я предвижу:

  1. Шаблон "команда": Что я делаю после того, как 500 операций редактирования и я хотим отменить последнюю? Загрузка начального состояния и применение 499 могли быть трудоемкими особенно, если некоторые из них являются дорогостоящими вещами как, например, применением фильтров размытия. Мне не нравится способ отменить, занимает другое количество времени согласно различным сценариям.

  2. Шаблон "memento": Сохранение частей битового массива, которые были изменены, берет большую память. Кэширование этих битовых массивов к диску может быть медленным также (таким образом, я мог бы испытать затруднения при кэшировании битовых массивов, если пользователь делает много из быстрых редактирований), и я не уверен в последствиях использования батареи.

Единственные решения, о которых я могу думать:

  1. Используйте шаблон "команда" и шаблон "memento", где, каждые 10 команд или так или после дорогой операции, целое состояние также сохраняется (который дает Вам функцию автосохранения бесплатно). Для отмены я перезагружаю самый близкий снимок и затем воспроизвожу команды. Я избежал бы этой сложности все же.

  2. Используйте шаблон "memento" и вынудите пользователя ожидать битовых массивов, которые будут кэшироваться. Это не слишком плохо, если я создаю на этот раз в, например, ожидающий фильтра для применения, но он не работает хорошо между созданием мазков кисти.

Совет? Мне было бы интересно знать, как некоторые существующие приложения делают это.

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

11
задан Radent 13 July 2010 в 14:27
поделиться

2 ответа

Есть третий вариант, который приходит на ум: каждое действие выполняется на своем собственном слое, а отмена удаляет этот слой. Для этого нужен быстрый механизм рендеринга и умное представление "слоев действий", где не хранятся "прозрачные" (нетронутые) пиксели.

Если вы предполагаете u уровней отмены, вы можете объединить слои действий старше u шагов на задний план.

Можно также использовать гибридный подход. Если действие "маленькое", представьте его в виде слоя. Если оно большое, то как записанное действие, которое нужно воспроизвести. Как вы говорите, вам нужна эвристика для принятия решения между этими двумя случаями. Вы можете протестировать производительность рендеринга/сохранения при первом запуске приложения после установки и определить значения параметров для эвристики.

0
ответ дан 3 December 2019 в 12:28
поделиться

На мой взгляд, модель моментов выглядит лучше всего. Это означает, что я, вероятно, попытаюсь придумать способы оптимального хранения этой информации. Вы упоминаете, что потенциально это может быть растровое изображение размером 1000x1000 для одного действия - не могли бы вы, например, представить растровое изображение как 1-битное растровое изображение с отдельным полем цвета, хранящимся в другом месте? Теперь вместо 2 МБ у вас есть 125 КБ для хранения.

Еще одна вещь, на которую я, вероятно, хотел бы обратить внимание, - это создание информации, когда пользователь выполняет действие, то есть, пока он пишет, вы можете записывать эти биты в свою структуру данных по мере того, как это происходит. А затем, когда они будут выполнены, вы можете зафиксировать действие в своей истории отмен.

Вы должны иметь возможность применить некоторую алгоритмическую логику к этим структурам данных отмены, чтобы уменьшить их влияние на память, скрывая при этом использование ЦП во время ожидания пользователя.

0
ответ дан 3 December 2019 в 12:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: