2013-02-21 52 views
8

मैं बहुत ओपनजीएल में नया हूं।एंड्रॉइड ओपेंग जीएल ईएस 2 बड़े बनावट धीमा

मैं बनावट क्वाड (2 त्रिकोण) खींचने की कोशिश कर रहा हूं। बनावट का आकार 900x900px है। मुझे एक ट्रैक्टर के साथ कोई समस्या नहीं है, लेकिन जब मैं 5-10 क्वाड खींचने की कोशिश करता हूं तो मुझे धीमा लगता है।

शायद

मैंने कुछ गलत कर रहा हूँ ...

कोड:

public void onDrawFrame(GL10 gl) { 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 
    ... matrix calculation ... 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); 
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); 
} 

वर्टेक्स shaders:

uniform mat4 uMVPMatrix; 
attribute vec4 vPosition; 
attribute vec2 a_TexCoordinate; 
varying vec2 v_TexCoordinate; 
void main() { 
    gl_Position = uMVPMatrix*vPosition; 
    v_TexCoordinate = a_TexCoordinate; 
} 

टुकड़ा शेडर:

precision mediump float; 
    uniform sampler2D u_PreviewTexture; 
    varying vec2 v_TexCoordinate; 

    void main() { 
     vec4 color = texture2D(u_PreviewTexture, v_TexCoordinate); 
     gl_FragColor = color; 
    } 

परीक्षण मंच है गैलेक्सी s3। प्रोफाइलर में मैं देखता हूं कि लगभग 60ms eglSwapBuffers कॉल लेता है।

मैं बड़े बनावट के साथ quads कैसे तेजी से आकर्षित कर सकते हैं?

+0

थोड़ा और महत्वपूर्ण जानकारी: बिटमैप्स ARGB_8888 प्रारूप में है और GL_BLEND सक्षम है। –

उत्तर

4

यह आपके बनावट के आकार और आपके द्वारा उपयोग किए जा रहे उपकरणों के ओपनजीएल ड्राइवर कार्यान्वयन के कारण हो सकता है।

अधिकांश आधुनिक जीपीयू एनपीओटी (दो की शक्ति नहीं) के साथ काफी अच्छा काम करते हैं, लेकिन यह हर बार निकटतम शक्ति (आपके मामले में 1024X1024) में खींचे जाने की आवश्यकता होती है, ।

कोशिश निम्नलिखित 2 समाधान का उपयोग करने के लिए:

1- 1024x1024 करने के लिए अपने बनावट रूपांतरित करें और करने के लिए अपने ज्यामिति में निर्देशांक का उपयोग केवल आपको क्या चाहिए (900x900)

2- कोशिश मिपमैप उत्पन्न करने के लिए आकर्षित, यदि आपके पास बहुत ज़ूमिंग है तो यह कई परिदृश्यों में एक प्रदर्शन उद्धारक है।

+0

यदि बनावट स्थैतिक संपीड़न मेमोरी बैंडविच को भी कम कर सकती है। ईटीसी 1 संपीड़न शायद सभी मोबाइल उपकरणों पर उपलब्ध है। यह अल्फा चैनल के बिना, केवल आरजीबी प्रारूप का समर्थन करता है। – marekb

+0

उत्तर के लिए धन्यवाद। मैंने बनावट को 1024x1024 पर स्केल करने की कोशिश की लेकिन इससे कोई फर्क नहीं पड़ता। और मैं ईटीसी 1 का उपयोग नहीं कर सकता क्योंकि मुझे रनटाइम में बिटमैप्स मिल रहा है। मैंने जीपीयू कॉल प्रोफाइल करने की कोशिश की और ऐसा लगता है कि सभी कॉल 2ms से कम लेते हैं ... –

+0

एक और परीक्षण: 10 क्वाड, प्रत्येक 1024x1024 बनावट (मिश्रण() का उपयोग किया जाता है): eglSwapBuffers कॉल 35-40ms abiut लेता है लेकिन में जीपीयू प्रोफाइलर सभी ड्राइंग प्रक्रिया 3 एमएमएस से कम लेते हैं। –

1

आपके एस 3 में लगभग 600 एम टेक्सास/सेकंड भरना है (GLBenchmark देखें)। यदि आप पूर्ण-स्क्रीन क्वाड प्रस्तुत कर रहे हैं - दस डबल-बनावट क्वाड प्रति फ्रेम 20M टेक्स्ट देते हैं। मान लीजिए कि जीएलबीनमार्क यह कहता है कि (टेक्स्टिंग थ्रूपुट मापें) 20 एम टेक्क्सल फिलेट्रेट का 1/30 है, 33 एमएमएस सर्वश्रेष्ठ एचडब्ल्यू एक फ्रेम को संसाधित कर सकता है। फ्रेमबफर मिश्रण मुझे यकीन है कि सक्रिय रूप से भरने के लिए प्रतिस्पर्धा करता है - मिश्रित 10 एम पिक्सल काफी है इसलिए मुझे लगता है कि बाधा भी हो सकती है।

आप यह सुनिश्चित करने के लिए क्या कर सकते हैं कि धीमा हिस्सा क्या है - 512x512 कहने के लिए बनावट आकार को कम करें, और देखें कि यह प्रदर्शन को कैसे प्रभावित करता है। रेंडर किए गए क्वाड के स्क्रीन आकार को कम करें (काफी, बनावट के साथ - उदाहरण के लिए स्क्रीन का आधा/चौथाई बनाओ)।

0

मेरे अनुभव में, बनावट प्रदर्शन समस्याएं आम तौर पर एमआईपीएमएपी फ़िल्टरिंग कैसे सेट की जाती हैं, इस बात से निकलती हैं। प्रदर्शन का एक बहुत बेहतर नहीं सेट (कम से कम सेटिंग्स दिखाया गया है) निम्नलिखित मानकों के साथ खो जा सकता है:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

यदि संभव हो, गहराई परीक्षण निष्क्रिय करने के लिए प्रयास करें। बनावट संपीड़न पर @ मरेकब की सलाह भी बहुत सारे प्रदर्शन लाभ प्रदान करती है।