2011-04-08 20 views
6

के साथ पूर्ण स्क्रीन पृष्ठभूमि बनावट मैं ओपनजीएल में एक बनावट त्रिकोण जाल का उपयोग कर एक पूर्ण स्क्रीन पृष्ठभूमि ड्राइंग करते समय देख रहे खराब प्रदर्शन के साथ काफी परेशान हूं: केवल पृष्ठभूमि को चित्रित करना और कुछ और नहीं सबसे बुनियादी शेडर का उपयोग कर 40 एफपीएस, और डिफ़ॉल्ट पाइपलाइन का उपयोग कर 50 एफपीएस।ओपनजीएल प्रदर्शन समस्या (आईपैड)

जबकि 40 एफपीएस बहुत बुरा नहीं लग रहा है, इसके ऊपर कुछ और जोड़ना एफपीएस ड्रॉप करता है, और मुझे इसके ऊपर 100-200 अन्य मेष आकर्षित करने की आवश्यकता है, मैं एक कम से कम 15 एफपीएस के साथ समाप्त होता हूं यह बस उपयोग करने योग्य नहीं है।

मैं एक XCode उपलब्ध परियोजना here में प्रासंगिक कोड अलग है, लेकिन यह का सार विहित बनावट नक्शे उदाहरण है:

static const GLfloat squareVertices[] = { 
    -1.0f, -1.0f, 
    1.0f, -1.0f, 
    -1.0f, 1.0f, 
    1.0f, 1.0f, 
}; 
static const GLfloat texCoords[] = { 
    0.125, 1.0, 
    0.875, 1.0, 
    0.125, 0.0, 
    0.875, 0.0 
}; 


glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

if ([context API] == kEAGLRenderingAPIOpenGLES2) { 
    // Use shader program. 
    glUseProgram(program); 

    glActiveTexture(GL_TEXTURE0); 
    glUniform1i(uniforms[UNIFORM_TEXTURE], 0); 
    glBindTexture(GL_TEXTURE_2D, texture); 

    // Update attribute values. 
    glVertexAttribPointer(ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices); 
    glEnableVertexAttribArray(ATTRIB_VERTEX); 
    glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 0, texCoords); 
    glEnableVertexAttribArray(ATTRIB_TEXCOORD); 
} else { 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    glVertexPointer(2, GL_FLOAT, 0, squareVertices); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
} 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

शिखर शेडर:

attribute lowp vec4 position; 
attribute lowp vec2 tex; 

varying lowp vec2 texCoord; 

uniform float translate; 

void main() 
{ 
    gl_Position = position; 
    texCoord = tex; 
} 

टुकड़ा शेडर :

varying lowp vec2 texCoord; 
uniform sampler2D texture; 

void main() 
{ 
    gl_FragColor = texture2D(texture, texCoord); 
} 

आयताकार आकार को दो से विभाजित करना फ्रेम दर को दोगुना कर देता है, इसलिए प्रतिपादन समय स्क्रीन पर ड्राइंग अचल संपत्ति पर स्पष्ट रूप से निर्भर है। यह पूरी तरह से समझ में आता है, लेकिन मुझे यह समझ में नहीं आता है कि ओपनजीएल बनावट-मैप किए गए मेस के साथ 15 से अधिक एफपीएस पर पूरी स्क्रीन को कवर करना संभव नहीं लगता है।

फिर भी वहां सैकड़ों गेम हैं जो ऐसा करते हैं, इसलिए यह संभव है और मुझे कुछ गलत करना होगा, लेकिन यह क्या है?

+0

एफडब्ल्यूआईडब्ल्यू, किसी भी कारण से आप प्रासंगिक कॉल करने के बाद ग्राहक स्थिति को सक्षम कर रहे हैं? (जैसे लंबवत सरणी सक्षम करने से पहले वर्टेक्स पॉइंटर को कॉल करना) –

+0

वास्तव में अधिकांश कोड ओपनजीएल ईएस आईपैड ऐप के लिए डिफ़ॉल्ट टेम्पलेट से है, जिसका मतलब यह नहीं है कि यह अच्छा कोड है, लेकिन जब तक यह काम करता है, मैंने खुद से नहीं पूछा चाहे इसे इस तरह या किसी अन्य तरीके से करने के लिए समझ में आया हो :-) –

उत्तर

7

दुर्भाग्य से, मेरे पास अभी यह परीक्षण करने के लिए मेरा आईपैड 2 है (मेरी आईपैड 1 टेस्ट इकाई घर पर बैठी है), और यह हास्यास्पद तेजी से खंड प्रसंस्करण है। यह आपके लॉगिंग में 1400 सैद्धांतिक एफपीएस के साथ 60 एफपीएस पर आंका जा रहा है।

हालांकि, मैंने ओपनजीएल ईएस चालक और समय प्रोफाइलर उपकरणों का उपयोग करके इंस्ट्रूमेंट्स के माध्यम से इसे नए नए ओपनजीएल ES विश्लेषक (जो एक्सकोड 4 के साथ आता है) के साथ चलाया।

OpenGL ES Analyzer

OpenGL ES ड्राइवर में Tiler उपयोग आँकड़ों को देखते हुए खपरीकार मुश्किल से सब पर इस्तेमाल किया जा रहा से पता चलता फिर से, लेकिन रेंडरर कुछ का उपयोग कर रहा (: यह क्या OpenGL ES विश्लेषक से परिणाम की तरह लग रही है , मेरे आईपैड 2 पर केवल 5%)। यह इंगित करता है कि आपके ज्यामिति के लिए वीबीओ और सूचकांक का उपयोग करने के सुझाव शायद आपके लिए बहुत कुछ नहीं करेंगे।

OpenGL ES redundant calls

आप फ्रेमबफर बंधन और व्यूपोर्ट हर फ्रेम, जो समय प्रोफाइलर के अनुसार की स्थापना रखने के 10% के लिए लेखांकन है:

एक है कि बाहर चिपक जाता है अनावश्यक कॉल के बारे में चेतावनी है आपके आवेदन में काम भार। लाइन

[(EAGLView *)self.view setFramebuffer]; 

अपने फ्रेम ड्राइंग की शुरुआत के निकट बाहर टिप्पणी करते वजह से सैद्धांतिक फ़्रेमरेट 1400 एफपीएस मेरी iPad 2 पर 27000 एफपीएस के लिए कूद करने (एक तरफ एक के रूप में, आप चाहिए शायद measure using milliseconds for your rendering)।

फिर से, यह मुझे आईपैड 2 में वास्तव में शक्तिशाली जीपीयू पर परीक्षण चला रहा है, लेकिन आप इस प्रदर्शन की बाधा को सत्यापित करने और संभावित रूप से दूसरों को हाइलाइट करने के लिए मूल आईपैड या किसी अन्य डिवाइस पर इन समान चरणों को दोहराने में सक्षम होना चाहिए।मुझे नया ओपनजीएल ईएस विश्लेषक मिला है जो शेडर से संबंधित प्रदर्शन मुद्दों को चुनने में वास्तव में आसान है।

+0

"दुर्भाग्यवश, मेरे पास अभी यह परीक्षण करने के लिए मेरा आईपैड 2 है"। मैं आपके जैसे दुर्भाग्यपूर्ण बनना चाहता हूं :-) आईपैड 2 पर टेस्ट ऐप को अपने पैसों के माध्यम से डालने के लिए धन्यवाद! मैं आपके उत्तर से लेता हूं कि आप पृष्ठभूमि को आकर्षित करने के तरीके में कुछ भी गलत नहीं देखते हैं? –

+0

@ गुई - मैंने अभी अपने अप्रचलित आईपैड 1 पर यह कोशिश की है और मुझे अभी भी 60 एफपीएस मिल रहा है, जिसमें पुराने हार्डवेयर पर 1400 सैद्धांतिक एफपीएस के साथ उपरोक्त अनावश्यक कॉल को हटाने से पहले भी। आपके एक्सकोड बिल्ड सेटिंग्स में कुछ टूटा हो सकता है, क्योंकि आपका टेस्ट केस मेरे हार्डवेयर पर बहुत तेजी से चलता है। साथ ही, यह उस हार्डवेयर पर आईओएस 4.3.1 का उपयोग कर रहा है। यदि आप 3.2 पर हैं, तो यह धीमा हो सकता है। –

+0

सैनिटी चेक के लिए एक गुच्छा धन्यवाद, मैं वास्तव में और जांच करूँगा! –

0

जंगली अनुमान निम्नलिखित, मैं किसी भी आईपैड अनुभव की जरूरत नहीं है: इस benchmark के अनुसार

, आप, शुद्ध भरण दर में 214fps के बारे में है करने के लिए पृष्ठभूमि संकल्प में उम्मीद कर सकते हैं।

क्या आपने अपनी बनावट से सीमित हैं या नहीं, यह जांचने के लिए आपने टेक्स्टिंग को अक्षम करने का प्रयास किया था?

क्या आपका बनावट 'दो बनावट की शक्ति नहीं है'? इस मामले में, क्या आपने GL_CLAMP(_TO_EDGE) द्वारा प्रतिस्थापित करके GL_TEXTURE_WRAP_* से GL_REPEAT को निकालने का प्रयास किया है? एनपीओटी को दोहराने से कुछ हार्डवेयर पर कुछ प्रदर्शन हो सकता है।

आखिरकार, आप न्यूनतम/अधिकतम फ़िल्टर GL_NEAREST को भी सेट करने का प्रयास कर सकते हैं।

+0

तस्वीर में 2 आयाम की शक्ति नहीं है, लेकिन मैं इसे 512x512 बनावट में लोड करता हूं, और मैंने GL_NEAREST को भी कोशिश की है, लेकिन GL_CLAMP नहीं। करेंगे, पॉइंटर्स के लिए धन्यवाद। –

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