के साथ ईवेंट को संभालने का सबसे अच्छा तरीका क्या है मैं अपने गेम प्रोजेक्ट के दृश्य भागों के लिए एसडीएल का उपयोग कर रहा हूं। और मैं मुख्य थ्रेड को बाधित किए बिना कुंजी प्रेस घटनाओं को संभालना चाहता हूं। तो मैंने किसी भी घटना को पकड़ने और मुख्य धागे को सूचित करने के लिए एक और दृश्य धागे में एक अनंत लूप चलाने का फैसला किया। हालांकि, मुझे यकीन नहीं है कि यह सबसे अच्छा है क्योंकि इससे वर्कलोड हो सकता है और सिस्टम प्रदर्शन कम हो सकता है? क्या इस तरह की चीजों को करने का कोई बेहतर तरीका है? धन्यवाद।एसडीएल/सी ++
उत्तर
किसी अन्य धागे से परेशान न करें। क्या बात है?
आपका मुख्य धागा क्या करता है? मैं कुछ इस तरह की कल्पना:
- अद्यतन तर्क
- प्रस्तुत
- गोटो 1
आप के बाद (या के दौरान) इनपुट प्राप्त करते हैं अद्यतन चक्र तो आप अगले अद्यतन तक इंतजार करना पड़ता है इससे पहले कि आप प्रभाव देखेंगे चक्र। प्रतिपादन के दौरान भी यही सच है। आप अपडेट चक्र से पहले इनपुट की जांच भी कर सकते हैं और इसे सभी सिंगलथ्रेड कर सकते हैं।
- इनपुट
- अद्यतन तर्क
- प्रस्तुत
- गोटो 1
बहु सूत्रण लाभ कुछ भी नहीं यहाँ और सिर्फ जटिलता बढ़ जाती है।
कुछ अतिरिक्त पढ़ने के लिए, Christer Ericson's blog post about input latency देखें (वह टीम के लिए तकनीक का निदेशक है जो युद्ध के देवता बनाता है)।
और मैं मुख्य थ्रेड को बाधित किए बिना कुंजी प्रेस ईवेंट को संभालना चाहता हूं।
एसडीएल स्वाभाविक रूप से एक बाधा या घटना संचालित ढांचा नहीं है। आईओ SDL_WaitEvent
या SDL_PollEvent
पर कॉल करके इवेंट कतार के ईवेंट को पढ़कर होता है। यह "मुख्य" थ्रेड में होना चाहिए, जिसे SDL_SetVideoMode
कहा जाता है।
यह कहना नहीं है कि आप एकाधिक धागे का उपयोग नहीं कर सकते हैं, और ऐसा करने के लिए अच्छा औचित्य है, उदाहरण के लिए, यदि यह एसडीएल इवेंट लूप पर भरोसा नहीं करना है तो यह नेटवर्क संचार को सरल बना सकता है। यदि आप एक अलग धागे में होने के लिए सिमुलेशन चाहते हैं, तो यह सिंक्रनाइज़ साझा वस्तुओं के माध्यम से आगे और आगे जानकारी पास कर सकता है। विशेष रूप से, आप हमेशा किसी भी थ्रेड से एसडीएल इवेंट कतार में ईवेंट डाल सकते हैं।
वह, और इनपुट थ्रेड-सुरक्षित नहीं है। कई एसडीएल ट्यूटोरियल यह स्पष्ट रूप से बताते हैं। – new123456