2015-11-09 8 views
9

में प्रतिपादन को तेज़ी से बढ़ा रहा है, इसलिए, मैं पैरामीट्रिक सतहों का संग्रह प्रस्तुत करने के लिए दृश्यकिट का उपयोग कर रहा हूं (जिसमें से कोई ऑब्जेक्ट बनाता है)। इन स्क्रीन पर रखने के लिए मैं बिंदुओं का नमूना करके और त्रिकोण बनाने के द्वारा कस्टम ज्यामिति बना रहा हूं। यहां एक त्वरित विचार है कि मैं इसे कैसे करता हूं।SceneKit

Loop through the collection of surfaces 
    Generate a random color C 
    For each surface calculate a grid of N x N points (both positions and normals) 
    Assign all vertexes for that surface the color C 
    Add groups of 3 vertexes from this surface to the face index list 

और ऐसा लगता है कि यह काम करता है। बाद मैं यह सब डेटा मिलता है, मैं इसे उचित ढांचे (SCNGeometrySource और SCNGeometryElement) में बनाने के लिए और इसलिए

SCNGeometry(sources: [vertexSource, normalSource, colorSource], elements: [element]) 

यह काम करता है और एक ही ज्यामिति तत्व के रूप में स्क्रीन ठीक पर मेरे सतहों को प्रदर्शित करता है की तरह एक SCNGeometry बनाते हैं। मेरी समस्या यह है कि, मेरे पास कुछ वास्तव में जटिल वस्तुएं हैं जिनके साथ मैं काम करने की कोशिश कर रहा हूं और ऑब्जेक्ट को देखते समय कैमरे को चारों ओर ले जाने में वास्तव में धीमा चल रहा है। प्रतिपादन लगभग 500 एमएस ले रहा है। जो मेरी फ्रेम दर और अनुभव भयानक बना रहा है।

तो सवाल यह है कि, दृश्यकिट प्रदर्शन को तेज करने के लिए मैं क्या कदम उठा सकता हूं? मैंने वेबजीएल के साथ एक ही प्रोजेक्ट किया था जिसमें डेटा की एक ही मात्रा के साथ थ्री.जेएस का उपयोग किया गया था और एक कक्षीय कैमरा ठीक करने में सक्षम था, इसलिए मुझे विश्वास नहीं है कि दृश्य किट कम से कम प्रतिस्पर्धा नहीं कर सका। मैं प्रदर्शन को तेज करने के लिए क्या सुविधाओं को ट्विक और बंद कर सकता हूं? मैं त्रिभुज आदिम प्रकार का उपयोग कर रहा हूं, guarantCameraControl = ऑर्बिटिंग कैमरे के लिए सच है, और एससीएन व्यू के लिए धातु।

उन उत्सुक लोगों के लिए, मॉडल मैं चेहरे के लिए 231,900 शिखर और 347,850 सूचकांक उत्पन्न करता हूं (11.1312 एमबी वर्टेक्स डेटा (स्थिति और सामान्य) और 1.3 9 14 एमबी फेस डेटा (अनिवार्य रूप से त्रिकोण के क्रम में वर्टेक्स के सूचकांक पदों ।))

+0

आईपैड 3 या इससे पहले, यह शिखर सीमा के करीब हो रहा है। इसमें शामिल होने के बावजूद आप बहुत अधिक भरने की दर का उपयोग कर रहे हैं और आप 60 एफपीएस पर पहुंचने के लिए संघर्ष कर रहे हैं, लेकिन दूर नहीं होना चाहिए। 500ms वास्तव में असामान्य है। – Confused

+1

मेरे पुराने 4 एस उन प्रकार की संख्या को 20fps या उससे भी अधिक समय तक संभालने के लिए प्रयुक्त होते थे। आपका छद्म कोड ठीक लगता है, इस तरह मैं अपनी ज्यामिति उत्पन्न करता हूं। कई बार मैं इंडेक्स को गड़बड़ कर दूंगा जिसके परिणामस्वरूप स्क्रीन पर एक फीका हुआ गड़बड़ हो जाएगी। यह वास्तव में framerate मारा जाएगा, मैं इसे बहुत अधिक काम करने के लिए टुकड़े टुकड़े करने के लिए नीचे डाल दिया। मैं जाल को दोबारा जांच दूंगा, शायद इसे अर्द्ध पारदर्शी बनाउंगा और वायरफ्रेम 'svnView.debugOptions =.ShowWireframe' चालू करूँगा। – lock

+0

मैं भरने की दर मैन्युअल रूप से कैसे बदलूं? – Red

उत्तर

3

1) यदि आप अपनी जेनरेट की गई सतह के केंद्र पर "खड़े" हैं, तो आपकी समस्या हो सकती है कि आप बहुत ही ऑफस्क्रीन (कोई फस्टम कूलिंग) नहीं खींचते हैं और आपको अपने sufrface (एकल नोड) को subsurfaces में विभाजित करने की आवश्यकता है (बाल नोड्स), इसलिए कैमरे के दृश्य स्थान में दिखाई देने वाले नोड्स को खींचा जाता है।

कहा जा रहा है कि, 231, 9 00 शिखर वास्तव में बहुत अधिक नहीं है, मैं ओएसएक्स पर सीनकेट मेटल रेंडरर (ओपनजीएल रेंडरर का उपयोग करने से 20% तेज) के साथ 60 मिलियन से अधिक मिलियन खींचता हूं।

2) यदि आप अपनी सतहों को दूरी से देख रहे हैं और खराब प्रदर्शन करते हैं, तो bytesPerComponent: की मात्रा का पता लगाएं, जो आप SCNGeometrySource बनाते समय खिला रहे हैं। GeForce GTX (जबकि एकीकृत इंटेल ग्राफिक्स पर ठीक है) पर सादे फ्लोट के बजाय CGFloat (डबल) का उपयोग करते समय मुझे बड़ी प्रदर्शन ड्रॉप का अनुभव हुआ।

संबंधित मुद्दे