मैं अपने प्रस्तुतकर्ता को प्रोफाइल करने की कोशिश कर रहा हूं, और मुझे कुछ अजीब प्रोफाइलिंग व्यवहार दिखाई दे रहा है जिसे मैं समझा नहीं सकता।ओपनगलएस में ग्लक्लेयर अवरुद्ध क्यों है?
मैं एक glSurfaceView का उपयोग कर रहा हूं, जिसे मैंने निरंतर प्रस्तुत करने के लिए सेट किया है।
यह कैसे मेरे onDrawFrame()
public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
executeAllDrawCommands();
}
यह प्रकाश लोड के अंतर्गत धीरे-धीरे पुराने व्यवहार संरचित है, तो मैं एक टाइमर वर्ग बनाया है और यह कुछ प्रोफ़ाइल शुरू कर दिया है। मैंने जो देखा उससे मैं आश्चर्यचकित था।
public void onDrawFrame(GL10 unused) {
swapTimer.end();
clearTimer.start();
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
clearTimer.end();
drawTimer.start();
executeAllDrawCommands();
drawTimer.end();
swapTimer.start();
}
clearTimer
उपायों समय यह glClear, drawTimer
उपायों समय यह सब मेरी ड्रा कॉल को चलाने के लिए ले जाता है कॉल करने के लिए लेता है, और swapTimer
उपायों समय:
मैं इतनी तरह मेरे onDrawFrame विधि पर कुछ जांच डाल जब से ड्राफ्रेम बाहर निकलता है और जब यह लौटाता है (eglSwapBuffers को कॉल करने के लिए लिया गया समय)।
जब मैं एक बहुत ही हल्के से भरी हुई दृश्य भाग गया, मैं वास्तव में कुछ अजीब संख्या मिल गया मैं व्याख्या नहीं कर सकते:
swapTimer : 20ms (average)
clearTimer : 11ms (average)
drawTimer : 2ms (average)
मैं उम्मीद स्वैप समय के रूप में मेरा मानना है कि डिवाइस vsync मजबूर कर दिया है कुछ हद तक बड़ा सा हो सकता है, ~ 30fps पर सक्षम करें, हालांकि मुझे नहीं पता कि वास्तविक 'स्पष्ट' कॉल 11 मिलीसेकंड के लिए क्यों अवरुद्ध हो रहा है? मैंने सोचा कि यह सिर्फ एक एसिंक्रोनस कमांड जारी करने और वापसी करने के लिए माना जाता था?
जब मैं एक बहुत अधिक व्यस्त दृश्य आकर्षित, संख्या काफ़ी बदल: इस दृश्य में
swapTimer : 2ms (average)
clearTimer : 0ms (average)
drawTimer : 44ms (average)
मेरी ड्रा कॉल इतना समय वह अपने vsync अवधि का एक बहुत छुपा की तरह लग रहा है कि ले जा रहे हैं , और स्पष्ट कॉल पर ब्लॉक पूरी तरह से चला जाता है।
क्या कोई स्पष्टीकरण है कि ग्लिलीयर मेरे हल्के लोड किए गए दृश्य पर क्यों अवरुद्ध कर रहा है? मामले में किसी को मेरी 'टाइमर' वर्ग स्रोत कोड के लिए
लिंक मेरी मापने तकनीक का शक है: http://pastebin.com/bhXt368W
क्या आप clearTimer.start() विधि से पहले GLES20.glFinish() को कॉल करने का प्रयास कर सकते हैं और देख सकते हैं कि समय कैसे बदलता है? –
मैंने एक 'glfinish' (और finishTimer.start()/end() को इसके चारों ओर रखा है), और यह हर समय glClear से दूर लेता है। इसके बजाय अब glFinish कुछ मिलीसेकंड लेता है, और glClear तत्काल हो जाता है। ऐसा लगता है कि यह सब बनाम vync से संबंधित है, हालांकि मैं glClear के अंदर बनाम vync समय दिखाई देने के लिए हैरान था। – Tim