2016-11-07 25 views
5

'da küreye son derece yüksek çözünürlük eşlemesi iOS uygulamasında, bazılarının 14 k çözünürlük kadar büyük, görüntü olarak bir dizi gezegen haritasını kullanıyorum. SceneKit'te gezegen modelleri oluşturmak için küçültülmüş sürümleri kürelere uygulayabilirim. Ancak, kullanıcıların tam çözünürlüklü görüntülerde ayrıntıları görmek için yakınlaştırmasını istiyorum. Ayrıca, uygulamanızın belleği bitmeksizin bunu yapabilmeyi istiyorum. Dokular, Google Haritalar gibi bir küreye otomatik olarak döşemek için bir yol var mı, ve yalnızca gerektiğinde parçaları ve çözünürlükleri yüklemek için bir yol var mı?SceneKit

cevap

1

Çok az programlama çabasıyla uygulayabileceğiniz iki optimizasyon tekniği, mipmap ve ayrıntı seviyesidir.

Gezegen haritanızı gösteren SCNMaterial'un mipFilter özelliğini ayarlarsanız, otomatik olarak oluşturulan bir mipmap elde edersiniz.

Gezegeninizin SCNGeometry için bazı SCNLevelOfDetail örneklerini sağladığınızda, belleği azaltacak çok düşük sayıda çokgen sayısına sahip sürümler elde edersiniz.

Bunlar, her ikisi de 2013 WWDC SceneKit konuşmasında belirtilmiştir. SCNLevelOfDetail, 2014'te tekrardan bahsedilmiştir. 2014 örnek kodunun her ikisinde de örnekler vardır: AAPLPresentationViewController'daki mipmap üretimi ve slaytta LOD 58.

+0

MipFilter ile yaptığım bilimsel olmayan testlerimden, kireç bellek kullanımının yakınlaştırma seviyesine bağlı olarak sabit kalmasını sağlıyor. Nesne üzerinde 8k'lık bir doku, nesnenin süper küçük ve çok uzak veya yakın bir konumda olmasından bağımsız olarak 400MB'lık bellekle ilgileniyor. Doğrusal filtre modunu kullanıyorum. Bunun için uygulamak zorunda olduğum başka bir şey var mı? – Timestretch

1

Yapmanız gereken şey, dokuları daha küçük parçalara bölmek ve farklı boyutlar sağlamaktır. detay seviyesinde. Fotoğraf makineniz yeterince yakınlaştığında, dokuları en yüksek çözünürlükte kullanabilirsiniz, ancak gösterilecek doku sayısını da kısıtlamanız gerekir. Bir gezegenin yüzeyini gösterdiğinizde sadece küçük bir parçaya yakınlaştırılmış ekranda görülebilir, ancak tüm ön yüzeye yakınlaştırılmış şekilde gösterilir. Böylece dokunuzu küçük parçalara ayırın ve aynı zamanda diğer yakınlaştırma seviyeleri için daha düşük çözünürlüklü dokular üretin. Ayrıca özel geometri oluşturmalı ve üzerine küçük yüksek çözünürlüklü doku parçaları atamalısınız. Son olarak, hangi kamera görüntüsünün mesafeye veya görüş açısına bağlı olduğunu göstermek için hangi dokulu geometrinin gösterileceğine karar vermeniz gerekecektir. Görünümü kullanarak, mevcut sahnede hangi parçaların göründüğüne karar vermeniz gerekir. Şu anda aynı sorunla karşı karşıyayım. SCNNode'ları kullanarak tüm alt ağları ve tüm küçük dokuları zaten oluşturdum (buradaki dokuları yüklemiyorum - sadece isteğe bağlı olarak yüklenmesi gerekir!), Ancak test için hangi alt düğümlerin çalıştığına dair bir çözümüm yok. gözle görülür. Sahnenin frustumof yönteminin içerisindeki görünmezliği burada yardımcı olmaz, çünkü sadece bir sınırlayıcı kutu testi yapar ve sınırlayıcı kutular büyüktür, çoğu da kısmen görüş alanının içinde olur (bu yüzden şu anda benim kendi testleri). Ayrıca, yüzeyin ön yüzünün kamera yönünde olduğunu test etmek için bazı yüzey normlarına da ihtiyacınız olacaktır. Ne yazık ki, hala çalışan bir çözümüm olmadığı için burada herhangi bir kod yayınlayamıyorum - sadece çalışacak olan “kodlama planımı” anlatabilirim (en azından OpenGL'yi halihazırda bu gibi şeyleri uygulamıştım). Belki de çözümün arkasındaki temel fikir sizin için zaten yararlıdır? Aksi takdirde, belki geri kalanını birlikte bulabiliriz ... :-)