2012-09-01 11 views
8

मैं अपने प्रस्तुतकर्ता को प्रोफाइल करने की कोशिश कर रहा हूं, और मुझे कुछ अजीब प्रोफाइलिंग व्यवहार दिखाई दे रहा है जिसे मैं समझा नहीं सकता।ओपनगलएस में ग्लक्लेयर अवरुद्ध क्यों है?

मैं एक 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

+0

क्या आप clearTimer.start() विधि से पहले GLES20.glFinish() को कॉल करने का प्रयास कर सकते हैं और देख सकते हैं कि समय कैसे बदलता है? –

+0

मैंने एक 'glfinish' (और finishTimer.start()/end() को इसके चारों ओर रखा है), और यह हर समय glClear से दूर लेता है। इसके बजाय अब glFinish कुछ मिलीसेकंड लेता है, और glClear तत्काल हो जाता है। ऐसा लगता है कि यह सब बनाम vync से संबंधित है, हालांकि मैं glClear के अंदर बनाम vync समय दिखाई देने के लिए हैरान था। – Tim

उत्तर

10

मैं() के चारों ओर और finishTimer.start()/अंत() एक glFinish रखा, और यह GlClear से हर समय दूर लेता है। इसके बजाय अब glFinish कुछ मिलीसेकंड लेता है, और glClear तत्काल हो जाता है।

यह बताता है।

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

जब रेंडरर को आकर्षित करने के लिए कई ऑब्जेक्ट होते हैं, तो सिंक्रनाइज़ेशन रोक देगा (आपके व्यस्त दृश्य के प्रोफाइल डेटा को दिया जाएगा) क्योंकि रेंडरर स्क्रीन के अपडेट के बाद आता है।

आप glFinish() उपयोग करते हैं, यह समय glClear() समारोह अन्यथा का कारण होता है, जो, भरण दर तर्क का पालन करते हुए, इसका मतलब है कि glFinish() अब समारोह है कि स्क्रीन के साथ तुल्यकालन सुनिश्चित किया जाता है निकालता है।

गणना:

एफ = 1/टी

आसान दृश्य:

एफ = 1/टी = 1/((20 + 11 + 2) * 10^- 3) = ~ 30 हर्ट्ज

सिंक्रनाइज़ेशन का विलंब समय आपके प्रोफाइलर में दिखाई देता है। रेंडरर स्क्रीन के साथ सिंक्रनाइज़ किया जा रहा है। इसका अर्थ यह है कि यदि आप glClear() या glFinish() कॉल को हटाते हैं, तो देरी कहीं और दिखाई देगी।

भारी दृश्य:

एफ = 1/टी = 1/((2 + 0 + 44) * 10^-3)) = ~ 22 हर्ट्ज

तुल्यकालन की देरी समय नहीं है अपने प्रोफाइलर में दिखाई देते हैं। रेंडरर स्क्रीन की अद्यतन आवृत्ति के बाद है।

यह इस तरह लगता है सब

सही प्रतीत हो रहा है कि VSync से संबंधित है।

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