मैं opengl es 2.0 का उपयोग कर एक एंड्रॉइड 2 डी गेम प्रोग्रामिंग कर रहा हूं। बैकबफर में अपने स्प्राइट्स खींचने के बाद मैं रोशनी को एफबीओ में खींचता हूं और इसे फिर से बैफर बफर में मिश्रित करने का प्रयास करता हूं। जब मैं फ्रेमबफर पर एफबीओ खींचता हूं, बिना किसी रंग के ट्रांस्पैरेंट, फ़्रेमेट्स सैमसंग गैलेक्सी डब्ल्यू पर 60 से 30 तक गिर जाता है (इसमें एक एड्रेनो 205 जीपीयू है)। मैंने हर जगह खोज की और सब कुछ करने की कोशिश की, भले ही मैं दृश्य पर एक स्प्राइट खींचना चाहूं और फ्रेमरेट बूंदों को स्क्रीन पर एक पारदर्शी एफबीओ बनावट को मिश्रित कर दूं। मैंने उस फोन पर प्रकाश प्रभाव के साथ अन्य खेलों की कोशिश की और वे ठीक चलते हैं, लगभग हर गेम उस फोन पर ठीक है, मुझे विश्वास है कि वे फ्रेमबफर का भी उपयोग करते हैं। गैलेक्सी एसआईआई (माली 400 जीपीयू) पर ठीक चल रहा है, मैं ओपनगल के लिए काफी नया हूं इसलिए मुझे विश्वास है कि मैं कहीं गलती कर रहा हूं, मैं अपना कोड साझा करता हूं।एंड्रॉइड पर ओपनजीएल ईएस 2.0 का उपयोग करते हुए फ़्रेमबफर एफबीओ बनावट को प्रस्तुत करना बहुत धीमा है, क्यों?
// Create a framebuffer and renderbuffer
GLES20.glGenFramebuffers(1, fb, offset);
GLES20.glGenRenderbuffers(1, depthRb, offset);
// Create a texture to hold the frame buffer
GLES20.glGenTextures(1, renderTex, offset);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTex[offset]);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA,
screenWidth, screenHeight, 0,
GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE,
null);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_LINEAR);
//bind renderbuffer
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthRb[offset]);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16,
screenWidth, screenHeight);
// bind the framebuffer
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fb[offset]);
// specify texture as color attachment
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
GLES20.GL_TEXTURE_2D, renderTex[offset], 0);
// specify depth_renderbufer as depth attachment
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT,
GLES20.GL_RENDERBUFFER, depthRb[0]);
// Check FBO status.
int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
if (status == GLES20.GL_FRAMEBUFFER_COMPLETE)
{
Log.d("GLGame framebuffer creation", "Framebuffer complete");
}
// set default framebuffer
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
मैं इसे सतह निर्माण पर एक बार करता हूं। सुनिश्चित नहीं है कि सही है या नहीं। जब मुझे आवश्यकता हो तो मैं उन्हें स्विच करने के लिए बनावट और फ्रेमबफर आईडी रखता हूं। मेरे ड्राइंग कोड:
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
ShaderProgram program = glgame.getProgram();
//put vertices in the floatbuffer
mTriangleVertices.put(vertices, 0, len);
mTriangleVertices.flip();
GLES20.glVertexAttribPointer(program.POSITION_LOCATION, 2, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
//preparing parameter for texture position
mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
GLES20.glEnableVertexAttribArray(program.POSITION_LOCATION);
//preparing parameter for texture coords
GLES20.glVertexAttribPointer(program.TEXTURECOORD_LOCATION, 2, GLES20.GL_FLOAT,
false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES,
mTriangleVertices);
//set projection matrix
GLES20.glEnableVertexAttribArray(program.TEXTURECOORD_LOCATION);
GLES20.glUniformMatrix4fv(program.MATRIX_LOCATION, 1, false, matrix, 0);
//draw triangle with indices to form a rectangle
GLES20.glDrawElements(GLES20.GL_TRIANGLES, numSprites * 6, GLES20.GL_UNSIGNED_SHORT,
indicesbuf);
//clear buffers
mTriangleVertices.clear();
mVertexColors.clear();
सब कुछ स्क्रीन पर सही ढंग से प्रदान की गई है, लेकिन प्रदर्शन को बर्बाद कर दिया जाता है तो बस जब मैं FBO बनावट आकर्षित। आपकी मदद के लिए बहुत बहुत धन्यवाद। मैंने इस पर बहुत मेहनत की और समाधान नहीं मिला।
देर से जवाब, लेकिन मैं आईसीएस के तहत एचडी 2 पर कुछ ऐसा कर रहा हूं और यह काफी समान है। मैं 60 एफपीएस पर कोई समस्या नहीं दे सकता, लेकिन जब मैं एफबीओ का उपयोग करता हूं, फ्रेम दर 45 हो जाती है, और यदि मैं एक और एफबीओ का उपयोग करता हूं तो यह 30 हो जाता है। –
हम्म ... मैंने सैमसंग पर कुछ गेम देखे हैं गैलेक्सी डब्ल्यू समस्याओं के बिना चल रहा है और वे 2 डी रोशनी के लिए फ्रेमबफर का उपयोग करना प्रतीत होता है, मेरा कोड धीरे-धीरे चलता है। मुझे आश्चर्य है कि मैं गलती कर रहा हूं। – mao
गैलेक्सी एसजीएक्स चिपसेट का उपयोग करता है। जैसा कि मैंने छोटे जीएमएम और टाइल आर्किटेक्चर से संबंधित कहा था, हर बार जब आप फ्रेमबफर को बदलते हैं तो आपको सामान्य मेम पर कॉपी करने की आवश्यकता होती है, अगर आप इसे बांधने के बाद पहले कॉल के रूप में साफ़ कर देंगे तो इसे सामान्य से वापस कॉपी करने की आवश्यकता नहीं है gmem को याद रखें, यही कारण है कि फ़्रेमबफर विशेष रूप से एड्रेनो 200 पर धीमे होते हैं :) यदि आप एड्रेनो डिवाइस हैं, तो आप एड्रेनो प्रोफाइलर के साथ फ्रेमबफर का उपयोग करके ऐप देख सकते हैं, बस इसे प्लग करें और वर्तमान फ्रेम डाउनलोड करें, फिर बनावट में एफबी की जांच करें। यदि आप एक पाएंगे, तो आप सुनिश्चित होंगे कि – ZZZ