के साथ पूर्ण स्क्रीन पृष्ठभूमि बनावट मैं ओपनजीएल में एक बनावट त्रिकोण जाल का उपयोग कर एक पूर्ण स्क्रीन पृष्ठभूमि ड्राइंग करते समय देख रहे खराब प्रदर्शन के साथ काफी परेशान हूं: केवल पृष्ठभूमि को चित्रित करना और कुछ और नहीं सबसे बुनियादी शेडर का उपयोग कर 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 से अधिक एफपीएस पर पूरी स्क्रीन को कवर करना संभव नहीं लगता है।
फिर भी वहां सैकड़ों गेम हैं जो ऐसा करते हैं, इसलिए यह संभव है और मुझे कुछ गलत करना होगा, लेकिन यह क्या है?
एफडब्ल्यूआईडब्ल्यू, किसी भी कारण से आप प्रासंगिक कॉल करने के बाद ग्राहक स्थिति को सक्षम कर रहे हैं? (जैसे लंबवत सरणी सक्षम करने से पहले वर्टेक्स पॉइंटर को कॉल करना) –
वास्तव में अधिकांश कोड ओपनजीएल ईएस आईपैड ऐप के लिए डिफ़ॉल्ट टेम्पलेट से है, जिसका मतलब यह नहीं है कि यह अच्छा कोड है, लेकिन जब तक यह काम करता है, मैंने खुद से नहीं पूछा चाहे इसे इस तरह या किसी अन्य तरीके से करने के लिए समझ में आया हो :-) –