Как эффективно отобразить SKScene с высоким разрешением в SceneKit?
Возможно связано: Оптимизация производительности SceneKit с текстурами высокого разрешения
Я картирую SKScene
на геометрию доски, чтобы создать настольную игру. Сцена должна быть относительно большой (2048x1024), чтобы я мог увеличить масштаб действия и при этом иметь красивые детали. Теперь, чтобы решить эту общую проблему, я уже знаю о двух подходах:
- Использовать текстуры с меньшим разрешением при уменьшении масштаба (т. Е. Мипмапинге) - это не проблема,
SceneKit
делает это для меня. - Плитка сцены для крупных планов и отображать только те плитки, которые на экране.
Теперь второй момент заставляет меня задуматься. Как я могу составить мозаику SKScene и отобразить их в разных точках геометрии? Есть ли другой способ сделать эту работу?
Скриншоты
Это геометрия со статическим изображением (2048x1024) в качестве текстуры:
Это геометрия с SKScene
(2048x1024) в качестве текстуры:
Сцена не содержит никаких физических тел, всего около 40 SKSpriteNodes
это ничего не делать. Мне нужно, чтобы можно было менять цвета территорий, возможно, добавить дополнительные наложения и т. Д. Был бы способ сделать это с SceneKit
полностью? Может быть, создать геометрию для каждой территории?
Реализованные ответы
Теперь я попытался достичь той же сцены, используя SceneKit
только. Каждая территория представляет собой квад, с использованием текстур с предварительно отрисованными границами. Различные режимы наложения помогают выдвигать нижнюю текстуру бумаги. К сожалению, производительность почти одинакова - я пришел к выводу, что это не так SpriteKit
в конце концов, это потребляет ресурсы, но количество узлов в сочетании с текстурами высокого разрешения (которые, к сожалению, необходимы, чтобы сохранить границы четкими, если вы не используете пути).
2 ответа
Являются ли SKSpriteNode вашими территориями? То есть один SKSpriteNode на территорию? Из огромного снижения производительности, которое вы видели при переходе от статического изображения к SKScene, похоже, что SpriteKit - это то, что вас убивает.
Было бы интересно попробовать использовать геометрию SCNShape, по одной на территорию, вместо использования текстуры, производной от SpriteKit, возможно, добавив levelOfDetail или два к каждому узлу территории. Я не понимаю, как получить тот же граничный эффект более темного тона, который вы используете. Но вы могли бы сделать некоторые интересные эффекты с SCNShape, например, анимировать изменение глубины экструзии для данной территории.
Да, вы можете сделать это с уникальной геометрией для каждой территории, простыми квадратами для каждой, а затем добавить материал, который похож на спрайт (составленный из текстур), с альфа-каналом, чтобы сформулировать каждую область.
Таким образом, вы можете иметь различные текстуры для каждого состояния каждого региона (выбранные, постукивающие, выделенные серым, все, что у вас есть).
Сложной частью будет раскладка всех этих квадов и их текстур для формирования вашей карты мира. Сначала вам придется сделать это в приложении для 2D или 3D дизайна, чтобы вы могли получить все именно так. Затем преобразуйте любую систему координат, которую вы используете в приложении для проектирования, во что-то, что вам подходит в SceneKit.
Вполне вероятно, что вы можете сделать это сначала в любом дизайнерском приложении, в котором вы создали оригинальные текстуры. Просто сделайте квадраты / прямоугольники, как кусочки для всех ваших регионов, и начните записывать их координаты и размеры.
Не весело, но это будет работать, и будет довольно эффективно. Я думаю.
Ваша частота кадров, вероятно, снижена SpriteKit. Вы включили растеризацию сцены? Убедитесь, что на узлах не выполняется масштабирование, и следуйте рекомендациям Apple по работе с количеством узлов.