2010-11-28 7 views
5

मैं वर्तमान में बेहद परिष्कार और चालाक का एक गेम लिख रहा हूं, जो आपको भय से भर देगा और जीत जाएगा - ओह, ठीक है, यह 15 पहेली है, और मैं बस एसडीएल के साथ खुद को परिचित कर रहा हूं।खिड़की वाले एसडीएल अनुप्रयोग में लंबवत रिट्रेस के साथ पेज-फ्लिप को सिंक कैसे करें?

मैं विंडो मोड में चल रहा हूं, और सामान्य-केस पेज अपडेट के रूप में SDL_Flip का उपयोग कर रहा हूं, क्योंकि यह विंडो मोड में पूर्ण विंडो के स्वचालित रूप से एक SDL_UpdateRect पर मानचित्र करता है। इष्टतम दृष्टिकोण नहीं, लेकिन यह देखते हुए कि यह केवल 15 पहेली है ...

वैसे भी, टाइल चाल लुभावनी गति से हो रही है। IOW, विंडो मोड में SDL_Flip वर्टिकल रीट्रेसेस के साथ कोई सिंक्रनाइज़ेशन शामिल नहीं है। मैं विंडोज एक्सपी एटीएम में काम कर रहा हूं, लेकिन मुझे लगता है कि यह एसडीएल के लिए सही व्यवहार है और अन्य प्लेटफार्मों पर भी होगा।

SDL_UpdateRect का उपयोग करने के लिए स्विचिंग स्पष्ट रूप से कुछ भी नहीं बदलेगी। संभवतः, मुझे अपने कोड में देरी तर्क लागू करने की आवश्यकता है। लेकिन एक साधारण घड़ी-आधारित टाइमर के परिणामस्वरूप अपडेट हो सकता है जब खिड़की आधा खींची जाती है, जिससे दृश्य विकृतियां होती हैं (मैं तकनीकी नाम भूल जाता हूं)।

EDIT इस समस्या को "फाड़ने" के रूप में जाना जाता है।

तो - एसडीएल में खिड़की वाले मोड गेम में, मैं वर्टिकल रिट्रेस के साथ अपने पेज-फ्लिप को सिंक्रनाइज़ कैसे करूं?

EDIT मैंने समाधान के दौरान खोज करते समय कई दावों को देखा है, कि खिड़की वाले अनुप्रयोग में लंबवत रिट्रेस में पेज-फ्लिप को सिंक्रनाइज़ करना असंभव है। विंडोज़ पर, कम से कम, यह केवल झूठा है - मैंने गेम लिखे हैं (जिसके द्वारा मेरा मतलब 15-पहेली के समान स्तर पर चीजें हैं) जो ऐसा करते हैं। मैंने एक बार डार्क बेसिक और डार्क जीडीके के साथ कुछ समय बर्बाद कर दिया - दोनों डायरेक्टएक्स-आधारित और दोनों सिंक्रनाइज़िंग पेज-फ्लिप विंडो विंडो में लंबवत रिट्रेस पर।

उत्तर

4

मेजर संपादित

यह पता चला मैं और अधिक समय बिताया है चाहिए मांगने से पहले देख। एसडीएल पूछे जाने वाले प्रश्न से ...

http://sdl.beuc.net/sdl.wiki/FAQ_Double_Buffering_is_Tearing

काफी दृढ़ता से सूचित करते हैं कि खड़ी retrace के साथ सिंक्रनाइज़ एसडीएल विंडोड मोड क्षुधा में समर्थित नहीं है लगता है।

लेकिन ...

बुनियादी तकनीक विंडोज पर संभव है, और मुझे लगता है कि एसडीएल यह होता है, एक अर्थ में शुरुआत कर रहा हूँ। अभी तक बिल्कुल निश्चित नहीं है।

विंडोज़ पर, मैंने पहले कहा था, विंडो मोड में वर्टिकल सिंक के लिए पृष्ठ-फ्लिप को सिंक्रनाइज़ करना सिंक्रनाइज़ेशन मोड का उपयोग कर 16-बिट दिनों तक सभी तरह से संभव है। यह पता चला है कि यह बिल्कुल गलत नहीं है, लेकिन भ्रामक है। मैंने WinG का उपयोग करके कुछ पुराने स्रोत कोड खोले, और पेज-ब्लिट्ज ट्रिगर करने वाला एक टाइमर था। विनग लुभावनी गति से चलेंगे, जैसे कि मैं एसडीएल द्वारा आश्चर्यचकित था - ब्लिट-टू-स्क्रीन पेज-फ्लिप ऑपरेशंस को लंबवत रिट्रेस के लिए प्रतीक्षा नहीं करता है।

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

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

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

तो मैं अभी भी अनिश्चित हूं, लेकिन यह हो सकता है कि खिड़की वाला मोड एसडीएल फाड़ने की प्रतिरक्षा के रूप में है क्योंकि यह उन प्लेटफार्मों पर हो सकता है जो इसे अनुमति देते हैं। मेरे पुराने लैपटॉप पर भी, जैसा कि मैंने कल्पना की, उतना बुरा नहीं लगता है।

लेकिन - क्या कोई कोई निश्चित उत्तर दे सकता है?

+0

इस पुराने प्रश्न को बंद करने के लिए स्वीकृत, लेकिन यदि कोई निश्चित उत्तर दिखाई देता है तो मैं स्विच करने के लिए अभी भी खुला हूं। – Steve314

0

आप SDL_gfx के फ़्रेमेट नियंत्रण का उपयोग कर सकते हैं। पुस्तकालय की docs को देखते हुए, अपने आवेदन के प्रवाह इस तरह होगा:

// initialization code 
FPSManager *fpsManager; 
SDL_initFramerate(fpsManager); 
SDL_setFramerate(fpsManager, 60 /* desired FPS */); 


// in the render loop 
SDL_framerateDelay(fpsManager); 

इसके अलावा, आप अपने खुद के फ़्रेमरेट नियंत्रण बनाने के लिए source code पर लग सकता है।

+0

प्रश्न यह है कि वर्टिकल रिट्रेस के साथ फ़्रेम सिंक्रनाइज़ कैसे करें। समानता पुरानी सीआरटी डिस्प्ले है, जिसने सीआरटी बीम को बंद कर दिया था, उस अवधि के साथ फ्रेम परिवर्तन को सिंक्रनाइज़ करना। आधुनिक डिस्प्ले के साथ, कोई बीम नहीं है, लेकिन "[फाड़ना] (http://en.wikipedia.org/wiki/Screen_tearing)" से बचने के लिए लंबवत रिट्रेस के साथ सिंक करना अभी भी महत्वपूर्ण है। फ्रेम दर सेट करना उस से अलग है - भले ही फ्रेम दर पूरी तरह से मेल खाती हो, इसका मतलब है कि आंसू प्रत्येक फ्रेम में एक ही स्थिति में है। – Steve314

+0

टीबीएच, मेरा अंतिम टिकाऊ निष्कर्ष यह था कि एसडीएल * हमेशा * लंबवत रिट्रेस के साथ सिंक्रनाइज़ करता है यदि यह ऐसा करने में सक्षम है। यह विंडो मोड में सक्षम नहीं हो सकता है। यह * संभव है * विंडो-मोड डायरेक्टएक्स गेम हर समय ऐसा करते हैं - लेकिन इसका मतलब यह नहीं है कि एसडीएल इसका समर्थन कर सकता है, और यह निर्भर करता है कि अंतर्निहित एपीआई एसडीएल क्या उपयोग कर रहा है। – Steve314

+0

ठीक है। मुझे लगता है कि ऐसा करने के लिए एसडीएल पर कोई रास्ता नहीं है। वैसे भी, ऐसा करने का एक तरीका होना चाहिए। जीएलएफडब्ल्यू विंडोज़ पर विंडो मोड पर वीएसआईएनसी करते हैं। –