मेरे पास सी में एक सरल ओपनगैल टेस्ट ऐप है जो कुंजी इनपुट के जवाब में विभिन्न चीजों को आकर्षित करता है। (मेसा 8.0.4, मेसा-ईजीएल के साथ और GLFW, Ubuntu 12.04LTS के साथ एक पीसी पर NVIDIA GT4650 के साथ प्रयास किया गया)। ड्रॉ काफी सरल / तेज (सामान के त्रिकोण प्रकार घूमना) हैं। मेरा परीक्षण कोड किसी भी तरह से जानबूझकर सीमा को सीमित नहीं करता है, यह सिर्फ इस तरह दिखता है:
while (true)
{
draw();
swap_buffers();
}
मैंने यह बहुत सावधानी से तय किया है, और मुझे पता है कि एक eglSwapBuffers()
(या glfwSwapBuffers
, एक ही चीज़) से अगली कॉल का समय ~ 16.6 मिलीसेकंड है। eglSwapBuffers()
अगली कॉल से ठीक पहले कॉल करने के बाद का समय इससे थोड़ा ही कम है, फिर भी जो खींचा गया है वह बहुत सरल है। स्वैप बफ़र्स कॉल करने का समय 1ms से कम है।
हालाँकि, ऐप से जो समय बदल रहा है वह कुंजी प्रेस के जवाब में आ रहा है जो वास्तव में स्क्रीन पर दिखाई दे रहा बदलाव है>> 150ms (लगभग 8-9 फ्रेम लायक) है। इसे स्क्रीन के कैमरा रिकॉर्डिंग और 60fps पर कीबोर्ड से मापा जाता है।
इसलिए, प्रश्न:
बफ़र्स को स्वैप करने और वास्तव में स्क्रीन पर दिखाने के लिए कॉल के बीच बफ़र कहाँ हैं? देरी क्यों? यह निश्चित रूप से लगता है कि ऐप हर समय स्क्रीन के आगे कई फ्रेम खींच रहा है।
एक OpenGL एप्लिकेशन स्क्रीन पर तत्काल आकर्षित करने के लिए क्या कर सकता है? (यानी: कोई बफरिंग नहीं है, बस तब तक ब्लॉक करें जब तक ड्रा पूरा न हो; मुझे उच्च थ्रूपुट की आवश्यकता नहीं है, मुझे कम विलंबता की आवश्यकता है)
उपर्युक्त तात्कालिक ड्रॉ को जितनी जल्दी हो सके करने के लिए एक आवेदन क्या कर सकता है?
किसी एप्लिकेशन को कैसे पता चल सकता है कि वास्तव में अभी स्क्रीन पर क्या है? (या, वर्तमान बफ़रिंग देरी कितने फ्रेम / कितने समय के लिए है?)