मैं ऊर्ध्वाधर सिंक रेंडर करने की कोशिश कर रहा हूं ताकि किसी भी फ्रेम को छोड़ने या दोहराने के बिना प्रति वर्टिकल सिंक प्रति ठीक किया जा सके। मुझे विंडोज 7 और (भविष्य में) विंडोज 8 के तहत काम करने की आवश्यकता होगी।प्रति वर्टिकल सिंक (बिल्कुल दोहराना, कोई छोड़ना नहीं) प्रतिपादन कैसे करें?
यह मूल रूप से QUADS
का अनुक्रम चित्रित करने वाला होगा जो स्क्रीन के अनुरूप होगा ताकि मूल छवियों से एक पिक्सेल 1: 1 ए से मेल खा सके। स्क्रीन पर पिक्सेल। प्रतिपादन भाग ओपनजीएल या डायरेक्टएक्स के साथ कोई समस्या नहीं है। समस्या सही सिंकिंग है।
मैं पहले, ओपन का उपयोग कर, WGL_EXT_swap_control
विस्तार के साथ करने की कोशिश की ड्राइंग और फिर बुला
SwapBuffers(g_hDC);
glFinish();
मैं glFlush (के साथ-साथ सभी संयोजनों और इन दो निर्देशों के क्रमचय की कोशिश की) द्वारा, और यह विश्वसनीय नहीं था।
मैं तो, Direct3D 10 के साथ की कोशिश की ड्राइंग और फिर बुला
g_pSwapChain->Present(1, 0);
pOutput->WaitForVBlank();
जहां g_pSwapChain
एक IDXGISwapChain*
और pOutput
IDXGIOutput*
कि SwapChain से जुड़े है से।
दोनों संस्करण, ओपनजीएल और डायरेक्ट 3 डी, इसके परिणामस्वरूप: 60 फ्रेम के पहले अनुक्रम, यह क्या नहीं होना चाहिए (60hz पर 1000ms के बजाय, 1030 या 1050ms की तरह कुछ रहता है), निम्नलिखित लोग ठीक काम करते हैं (लगभग 1000.40ms), लेकिन हर अब और फिर यह एक फ्रेम छोड़ने लगता है। मैं माप QueryPerformanceCounter
के साथ करता हूं।
डायरेक्ट 3 डी पर, केवल वेटफॉरवीब्लैंक की लूप की कोशिश कर रहा है, 1000 पुनरावृत्तियों की अवधि लगातार भिन्नता के साथ 1000.40 है।
तो यहां की परेशानी बिल्कुल नहीं जानती है जब प्रत्येक कार्य को वापस बुलाया जाता है, और क्या स्वैप लंबवत सिंक के दौरान किया जाता है (पहले नहीं, फाड़ने से बचने के लिए)।
आदर्श रूप से (यदि मुझे गलत नहीं है), जो मैं चाहता हूं उसे प्राप्त करने के लिए, यह एक रेंडर करने के लिए होगा, सिंक शुरू होने तक प्रतीक्षा करें, सिंक के दौरान स्वैप करें, फिर सिंक पूरा होने तक प्रतीक्षा करें। ओपनजीएल या डायरेक्टएक्स के साथ ऐसा कैसे करें?
संपादित करें: सिर्फ WaitForVSync
60x का एक परीक्षण पाश लगातार 1000.30ms से 1000.50ms पर ले जाता है। Present(1,0)
से पहले एक ही लूप, कुछ भी नहीं, कोई प्रतिपादन नहीं, एक ही समय लेता है, लेकिन कभी-कभी यह विफल रहता है और 1017ms लेता है, जैसे कि फ्रेम को दोहराया जाता है। कोई प्रतिपादन नहीं है, इसलिए यहां कुछ गड़बड़ है।
क्या यह डीएक्स 10 में भी उपलब्ध है? मैं 'D3D10CreateDeviceAndSwapChain' के साथ डिवाइस बना रहा हूं, जहां तक मैं कह सकता हूं कि कोई वर्तमान पैरामीटर नहीं है। – slazaro
मुझे डर है कि डीएक्स 10 में यह विकल्प नहीं है। क्षमा करें, मैं डीएक्स 10 में ज्यादा नहीं हूं। – miloszmaki
असल में आप इसे भी सेट करना चाहते हैं: D3DPRESENT_INTERVAL_ONE ... और D3D10 अपनी वर्तमान विधि 'swapChain-> वर्तमान (vSync, 0) के माध्यम से बनाम बना देता है;' – zezba9000