गेम लूप (विंडोज पर) में स्लीप () का उपयोग करना सुरक्षित है?


27

गेम लूप (C ++) में विंडोज पर स्लीप () फ़ंक्शन का उपयोग करना सुरक्षित है? मैं निश्चित फ्रेम दर चाहता हूं।


आपको स्पष्ट करने की आवश्यकता है, "सुरक्षित" से आपका क्या मतलब है। बेशक यह सुरक्षित है और खिलाड़ियों को भ्रष्ट करने या पीसी को उड़ाने के लिए नहीं जा रहा है।
क्रॉम्स्टर का कहना है कि

जवाबों:


32

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

तो संक्षेप में:

  • सोने के लिए समय केवल एक न्यूनतम गारंटी है और वास्तविक नींद का समय अधिक हो सकता है।
  • TimeBeginPeriod के माध्यम से मूल्य सेट (या सेट नहीं) के लिए संवेदनशील।

नींद का उपयोग करने के लिए केवल उचित मामला होगा यदि आप उदाहरण के लिए सीपीयू के उपयोग को कम करना चाहते हैं। तब भी आप स्लीप (1) का उपयोग कर रहे होंगे; फ्रैमरेट्स को नियंत्रित करने के लिए इसका उपयोग करने का तरीका नहीं है।

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

इस समय इस लेख का उल्लेख करना आवश्यक है: गेमर ऑन गेम्स - फिक्स योर टाइमस्टेप! । यह आपके सिमुलेशन में एक सुसंगत टाइमस्टेप प्राप्त करने के लिए आवश्यक चरणों का वर्णन करता है।


लिंक के लिए बहुत धन्यवाद। अब तक, मैं आमतौर पर लेख में वर्णित "चर टाइमस्टेप" दृष्टिकोण का उपयोग करता था।
इवान वूइका

उन मशीनों पर भी नींद खतरनाक है जो इंटेल स्पीड-स्टेप सक्षम है।
वाटरविल्ड

"लेकिन यह वास्तव में उस समय की किसी भी मनमानी राशि के लिए सो सकता है।" खैर, यह साबित करना होगा कि मुझे लगता है ... कभी भी इसका कोई प्रमाण नहीं देखा है इसलिए मुझे लगता है कि यह उन 'परिभाषाओं' में से एक है। अच्छा जवाब हालांकि और हाँ, आप नहीं कर सकते हैं (भले ही यह सही था) एक निश्चित फ्रैमरेट सेट करने के लिए किसी भी प्रकार की नींद का उपयोग करें (अच्छी तरह से आप कर सकते हैं लेकिन आपको इसे करने के लिए एक उच्च परिशुद्धता टाइमर की आवश्यकता है)।
18

2
प्रति MSDN - "ध्यान दें कि तैयार धागे को तुरंत चलाने की गारंटी नहीं है। नतीजतन, थ्रेड नींद के अंतराल के कुछ समय बाद तक नहीं चल सकता है"। यह सच है, मैंने ऐसा कभी नहीं देखा है, लेकिन साथ ही साथ अगर यह संभव के रूप में प्रलेखित है, तो मैं निश्चित रूप से इस पर कभी भी भरोसा नहीं करूंगा।
मैक्सिमस मिनिमस

1
उल्लेख करते हुए, मुझे लगता है कि यह "... यदि आप CPU उपयोग को कम करना चाहते हैं ..." से संबंधित होगा: ": nanobit.net/doxy/quake3/win__main_8c-source.html <- प्रासंगिक कोड 01224 से शुरू होता है
user_123abc

16

संक्षिप्त उत्तर: नहीं, यह नहीं है।

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

ग्लूट ग्लूटिमेरफंक () प्रदान करता है , जो कि, यदि आप ओपनजीएल में प्रोग्रामिंग कर रहे हैं, तो आपको सही फ़ंक्शन की आवश्यकता है। पर एक नजर डालें इस उदाहरण के लिए, या यह एक।


1
" कम से कम msec मिलीसेकंड के बाद , OpenGLUT कॉलबैक कॉल करेगा" - यह कैसे अलग है Sleep?
क्रॉम्स्टर का कहना है कि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.