2013-01-17 55 views
5

आईफोन/आईपैड के लिए एक छोटी परियोजना के लिए कुछ परीक्षण करने के दौरान, मैंने देखा कि GL_LINES के साथ glDrawElements का उपयोग करके वायरफ्रेम ड्राइंग में एक बड़ा सीपीयू प्रदर्शन जुर्माना है ।GL_LINES के साथ glDrawElements gleRunVertexSubmitARM को मजबूर करता है? (या: आईओएस पर वायरफ्रेम क्यों धीमा है?)

यह परिदृश्य है:

  • 640 vertexes (पद के लिए 4 तैरता, Normals के लिए 3 तैरता है, कोई संरेखण समस्याओं ... सभी 4 बाइट्स पर सीमाओं)
  • 3840 अनुक्रमित (अहस्ताक्षरित कम) के साथ एक मॉडल
  • दोनों vertexes और अनुक्रमित VBOs (कोई VAO)
  • ऊपर मॉडल GL_TRIANGLES साथ glDrawElements के साथ तैयार काम करता है ठीक
का उपयोग 63,210 तब

:

  • 640 vertexes
  • 2560 अनुक्रमित
  • VBOs और कोई VAO
  • साथ एक ही मॉडल GL_LINES साथ glDrawElements के साथ तैयार gleRunVertexSubmitARM के लिए निरंतर कॉल, CPU उपयोग आकाश रॉकेट से चलाता है ...

दोनों मामलों में मॉडल अपेक्षित दिखते हैं और कोई ग्लिटर नहीं ...

ऐसा लगता है कि समस्या डिवाइस निर्भर है। मैं इसे आईफोन 3 जीएस और आईफोन 4 पर अनुभव करता हूं, आईपैड 2 पर नहीं और सिमुलेटर। आईपैड 2 फ्रेम-टाइम सीपीयू = 1 एमएमएस पर और एक आईफोन 4 फ्रेम-टाइम सीपीयू = 12 एमएमएस पर gleRunVertexSubmitARM पर कोई कॉल नहीं, और gleRunVertexSubmitARM को लगातार कॉल करता है।

क्या कोई इस व्यवहार को समझा सकता है या बता सकता है कि मैं कौन सी गलतियों को कर सकता हूं?

किसी भी अंतर्दृष्टि की अत्यधिक सराहना की जाती है। अग्रिम धन्यवाद,

फ्रांसेस्को

उत्तर

0
नहीं

एक नहीं आसान सवाल मैं कहूंगा कि के लिए एक आसान जवाब।

वैसे भी, एक ही "परिवार" के 2 डिवाइस अलग-अलग तरीकों से व्यवहार करते हैं, कई कारकों पर निर्भर हो सकते हैं।

सबसे पहले, वे अलग अलग GPUs माउंट (मैं बहुत यकीन है कि आप पहले से ही पता कर रहा हूँ यह बहुत खेद है, स्पष्ट राज्य के लिए) जो निम्नलिखित अंतर लाता है:

  • iPhone 4 और iPhone 3GS माउंट ही GPU , PowerVR SGX535
  • आईपैड 2 PowerVR SGX543MP2

सबसे पहले का उपयोग करता है, बाद एक बहुत अलग प्रवाह और एक नए वास्तुकला के साथ पहले का विकास है।

यह अकेले सबकुछ समझा नहीं जाता है, कारण है कि आप gleRunVertexSubmitARM को और अधिक कॉल क्यों देखते हैं, इसके जीपीयू पर पावरवीआर द्वारा किए गए ओपनजीएल ड्राइवर कार्यान्वयन को समझाया जा सकता है, शायद एसजीएक्स 535 जीपीयू चालक आपके द्वारा आवश्यक कार्यों को निष्पादित करता है उस समारोह पर हुक।

अंतिम, लेकिन कम से कम, प्रदर्शन बुद्धिमान, GL_LINES के साथ बैठक कई कारणों से समय की सबसे बहुत अक्षम है:

  • किसी भी छिपा ज्यामिति का पता लगाने
  • किसी भी चेहरे
  • को मारने निष्पादित नहीं करता है निष्पादित नहीं करता है
  • GL_LINE_WIDTH या GL_LINE_SMOOTH का उपयोग करके, (और 2-3 साल पहले अपने अनुभव के बारे में) पढ़ना, ड्राइवर को "सॉफ़्टवेयर" को किसी भी एचडब्ल्यू त्वरण का उपयोग न करने का कारण बनता है। यह जीपीयू और उसके ओपनजीएल चालक कार्यान्वयन पर निर्भर करता है
  • जब एक भरे बहुभुज को प्रस्तुत किया जाता है, तो चालक "पदानुक्रमित गहराई बफर" के साथ परिचालन को अनुकूलित कर सकता है, जीएल_लाइन के साथ यह नहीं कर सकता है (फिर से, यह ड्राइवर पर बहुत निर्भर करता है लेकिन यह है एक बहुत ही आम पहलू)
  • कुछ ड्राइवर प्रतिपादन के समय त्रिकोण में आपके GL_LINES जाल का अनुवाद करते हैं। यह ऐसा कुछ है जिसे मैं साबित नहीं कर सकता लेकिन पिछले गेम इंजन डेवलपर्स दोस्तों के साथ एक बहुत ही आम विषय है।

मुझे आशा है कि मैंने आपको किसी तरह से मदद की है।

Ciao मौरीज़ियो

0

मैं पीसी पर हूँ, लेकिन मुझे लगता है कि यह प्रासंगिक है। मैंने वायरफ्रेम मोड में फ्रेम दर देखी: glPolygonMode (GL_FRONT_AND_BACK, GL_LINE) ...

GlEnable (GL_LINE_SMOOTH) 10x धीमी थी;

आप इसे इस आदेश के साथ अक्षम कर सकते हैं: glDisable (GL_LINE_SMOOTH);