Как эффективно отобразить SKScene с высоким разрешением в SceneKit?

Возможно связано: Оптимизация производительности SceneKit с текстурами высокого разрешения

Я картирую SKScene на геометрию доски, чтобы создать настольную игру. Сцена должна быть относительно большой (2048x1024), чтобы я мог увеличить масштаб действия и при этом иметь красивые детали. Теперь, чтобы решить эту общую проблему, я уже знаю о двух подходах:

  • Использовать текстуры с меньшим разрешением при уменьшении масштаба (т. Е. Мипмапинге) - это не проблема, SceneKit делает это для меня.
  • Плитка сцены для крупных планов и отображать только те плитки, которые на экране.

Теперь второй момент заставляет меня задуматься. Как я могу составить мозаику SKScene и отобразить их в разных точках геометрии? Есть ли другой способ сделать эту работу?


Скриншоты

Вот геометрия: Простая геометрия без текстуры

Это геометрия со статическим изображением (2048x1024) в качестве текстуры: Геометрия с текстурой изображения

Это геометрия с SKScene (2048x1024) в качестве текстуры:

Сцена не содержит никаких физических тел, всего около 40 SKSpriteNodes это ничего не делать. Мне нужно, чтобы можно было менять цвета территорий, возможно, добавить дополнительные наложения и т. Д. Был бы способ сделать это с SceneKitполностью? Может быть, создать геометрию для каждой территории?


Реализованные ответы

Теперь я попытался достичь той же сцены, используя SceneKit только. Каждая территория представляет собой квад, с использованием текстур с предварительно отрисованными границами. Различные режимы наложения помогают выдвигать нижнюю текстуру бумаги. К сожалению, производительность почти одинакова - я пришел к выводу, что это не так SpriteKit в конце концов, это потребляет ресурсы, но количество узлов в сочетании с текстурами высокого разрешения (которые, к сожалению, необходимы, чтобы сохранить границы четкими, если вы не используете пути).

Решение с использованием только SceneKit

2 ответа

Являются ли SKSpriteNode вашими территориями? То есть один SKSpriteNode на территорию? Из огромного снижения производительности, которое вы видели при переходе от статического изображения к SKScene, похоже, что SpriteKit - это то, что вас убивает.

Было бы интересно попробовать использовать геометрию SCNShape, по одной на территорию, вместо использования текстуры, производной от SpriteKit, возможно, добавив levelOfDetail или два к каждому узлу территории. Я не понимаю, как получить тот же граничный эффект более темного тона, который вы используете. Но вы могли бы сделать некоторые интересные эффекты с SCNShape, например, анимировать изменение глубины экструзии для данной территории.

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

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

Сложной частью будет раскладка всех этих квадов и их текстур для формирования вашей карты мира. Сначала вам придется сделать это в приложении для 2D или 3D дизайна, чтобы вы могли получить все именно так. Затем преобразуйте любую систему координат, которую вы используете в приложении для проектирования, во что-то, что вам подходит в SceneKit.

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

Не весело, но это будет работать, и будет довольно эффективно. Я думаю.

Ваша частота кадров, вероятно, снижена SpriteKit. Вы включили растеризацию сцены? Убедитесь, что на узлах не выполняется масштабирование, и следуйте рекомендациям Apple по работе с количеством узлов.

Другие вопросы по тегам