2016-11-07 3 views
5

В моем приложении iOS у меня есть набор карт планеты в виде изображений, размером до 14k. Я могу применить уменьшенные версии к сферам для создания моделей планет в SceneKit. Тем не менее, я хочу, чтобы пользователи могли увеличивать масштаб изображения, чтобы видеть детали изображений с полным разрешением. Я также хочу, чтобы это можно было сделать, если у моего приложения не хватит памяти. Есть ли способ автоматически чередовать текстуры в сфере, такой как Карты Google, и загружать только части и разрешения, когда они необходимы?Сопоставление чрезвычайно высокого разрешения с сферой в SceneKit

ответ

1

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

Если вы установили свойство mipFilter объекта SCNMaterial, представляющего вашу карту планеты, вы получите автоматически созданный mipmap.

Если вы предоставите несколько экземпляров SCNLevelOfDetail для вашей планеты, вы получите версии с очень низким количеством полигонов, которые сохранят память.

Они оба упомянуты в разговоре WWDC SceneKit 2013 года. SCNLevelOfDetail упоминается еще в 2014 году. Пример кода 2014 содержит примеры того, как генерация mipmap в AAPLPresentationViewController, и LOD в слайде 58.

+0

Из моих ненаучных тестов с mipFilter, он выглядит, как использование памяти извести остается постоянным на основе уровня масштабирования. 8k текстуры на объекте hogging ~ 400 Мб памяти, независимо от того, объект очень мал и далеко или близко. Я использую режим линейного фильтра. Есть ли что-то еще, что я должен реализовать для этого? – Timestretch

1

Что вам нужно сделать, это разделить текстуры на более мелкие куски и обеспечить различные размеры в зависимости от на уровне детализации. Когда ваша камера будет масштабироваться достаточно глубоко, вы можете использовать текстуры с самым высоким разрешением, но вам также необходимо ограничить количество отображаемых текстур. Когда вы показываете, что поверхность планеты увеличена только на небольшом ее куске, ее можно увидеть на экране, но увеличена вся передняя поверхность. Так разделите текстуру на мелкие кусочки, а также создайте текстуры с более низким разрешением для других уровней масштабирования. Вам также потребуется создать пользовательскую геометрию и назначить на нее небольшие куски текстуры высокого разрешения. Наконец, вам нужно будет решить, какую текстурированную геометрию показывать для какого вида камеры в зависимости от расстояния или угла обзора. Используя представление frustum, вам также нужно решить, какие части видны в текущей сцене. В настоящее время я сталкиваюсь с той же проблемой. Я уже создал все вспомогательные ячейки и все меньшие текстуры, используя SCNNode (не загружайте текстуры здесь - их нужно загружать только по требованию!), Однако у меня нет рабочего решения для теста, какие юниты видимый. Исследуемый внутри frustum метод сцены здесь не помогает, потому что он ограничивает только ограничивающий прямоугольник и ограничивающие прямоугольники большими, большинство из них всегда будут частично внутри сглаживания (так что я в настоящее время пытаюсь реализовать мои собственные тесты). И вам также понадобятся некоторые нормали поверхности, чтобы проверить, указывает ли фронт поверхности в направлении камеры. К сожалению, потому что у меня все еще нет рабочего решения, я не могу размещать здесь какой-либо код. Я могу описать только свой «план кодирования», который будет работать (по крайней мере, используя OpenGL, я уже реализовал такие вещи, как лет назад). Может быть, основная идея решения уже полезна для вас? В противном случае, возможно, мы сможем узнать все вместе ... :-)