Как нарисовать световой эффект поверх текстуры на iPhone с помощью UIKit / Quartz - PullRequest
2 голосов
/ 07 мая 2011

У меня есть сцена с фоновым изображением (освещенная комната) и черным изображением (тень) над ним.Мне нужно иметь возможность перемещать палец по фону и раскрывать некоторые части сцены, имитируя тусклый источник света в темной комнате.

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

Кто-нибудь может придумать лучший подход (который не предполагает использование OpenGL ES - это не вариант в этом проекте) для этого?

Ответы [ 5 ]

2 голосов
/ 07 мая 2011

Чтобы перейти с моими комментариями выше.

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

room image with grid views and shadow view

1 голос
/ 07 мая 2011

Я бы попробовал это: использовать один вид с пользовательской реализацией drawRect: сначала нарисуйте теневое изображение (в оттенках серого), затем изображение яркого пятна в белом альфа И, наконец, фоновое изображение в режиме «умножения».

1 голос
/ 07 мая 2011

Без дополнительной информации немного трудно понять, будет ли этот подход работать в вашем случае, но вы могли бы создать одно изображение маски, скажем, радиальный градиент альфа, а затем применить к нему аффинное преобразование, чтобы придать ему форму по касанию. Это может быть использовано для имитации луча факела / фонарика.

0 голосов
/ 07 мая 2011

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

0 голосов
/ 07 мая 2011

Просто мысль, должна ли тень быть изображением?Возможно, вы могли бы просто закрасить слой тени цветом и замаскировать его?Таким образом, использование памяти должно быть меньше, а эффект должен быть почти одинаковым (если не точно таким же).

...