Какой лучший способ создать «увеличительное стекло» на 2D-сцене? - PullRequest
2 голосов
/ 03 октября 2008

Я работаю над игрой, в которой мне нужно позволить игроку смотреть на плоскость (например, стену) через объектив (например, увеличительное стекло). Игра должна работать на iPhone, поэтому я могу выбрать Core Animation или OpenGL ES.

Моя первая идея (которую я еще не пробовал) - сделать это с помощью Core Animation.

  1. Создание стены и объектов на ней с использованием CALayers.
  2. Используйте метод CALayer renderInContext:, чтобы создать изображение стены в качестве фонового слоя.
  3. Обрежьте изображение до формы объектива, увеличьте его, затем нарисуйте на фоне.
  4. Нарисуйте оправу объектива и слой "блестящего стекла" поверх всего этого.

Примечания:

  • Я намного лучше знаком с Core Animation, чем с OpenGL, поэтому, возможно, есть гораздо лучший способ сделать это с OpenGL. (Пожалуйста, скажите мне!)
  • Если я использую CALayers, которые не привязаны к представлению, нужно ли мне управлять всеми анимациями самостоятельно? Или есть простой способ запустить их вручную?
  • 3D перспектива не важна; Я просто увеличиваю плоскую стену.
  • Меня беспокоит, что выполнение всего вышеперечисленного будет слишком медленным для плавной анимации.

Прежде чем я напишу много кода для написания этого, у меня вопрос Видите ли вы какие-либо подводные камни в приведенном выше плане или вы можете порекомендовать более простой способ сделать это?

Ответы [ 2 ]

3 голосов
/ 03 октября 2008

Я реализовал увеличительное стекло на iPhone с помощью UIView. CA был слишком медленным.

Вы можете нарисовать CGImage в UIView, используя его метод drawRect. Вот шаги в моем drawRect:

  1. получить текущий контекст
  2. создать путь для отсечения вида (кружок)
  3. масштабировать текущую матрицу преобразования (CTM)
  4. переместить текущую матрицу преобразования
  5. нарисовать CGimage

Вы можете предварительно визуализировать CGImage, тогда он находится в графической памяти. Если вы хотите что-то динамическое, нарисуйте его с нуля вместо того, чтобы рисовать CGImage.

Очень быстро, отлично выглядит.

2 голосов
/ 03 октября 2008

Вот как бы я это сделал, звучит как хороший план.

Независимо от того, выбираете ли вы OGL или CA, базовый принцип один и тот же, поэтому я буду придерживаться того, с чем вам удобнее.

  1. Укажите регион, который вы хотите увеличить
  2. Отображение этого региона на отдельной поверхности
  3. Визуализация любой границы / наложения на поверхность
  4. Увеличьте размер вашей поверхности на главной сцене, обрезая соответствующим образом.

С точки зрения производительности вам придется попробовать и посмотреть (просто убедитесь, что вы тестируете на реальном оборудовании, потому что симулятор работает намного быстрее, чем оборудование). Если он замедляется, то вы можете смотреть на выполнение шагов 2/3 реже, например каждые 2-3 кадра. Это даст некоторую задержку при увеличении, но может оказаться вполне приемлемым.

Я подозреваю, что производительность между OGL / CA будет примерно эквивалентна. CA построен поверх библиотек OGL, но ваша стоимость будет зависеть от фактического рендеринга, а не от времени, проведенного в слоях.

...