जावा 2 डी गेम प्रोग्रामिंग: गेम लूप बनाने के लिए विभिन्न दृष्टिकोण


10

मैं जावा गेम प्रोग्रामिंग में नया हूं, लेकिन जितना अधिक मैं उलझन में हूं, उतना अधिक पढ़ता हूं, क्योंकि मैंने गेम लूप बनाने के लिए कई अलग-अलग दृष्टिकोण देखे हैं: 1. मानक दृष्टिकोण, जो टाइमर क्लास का उपयोग करता है (कम प्रतीत होता है) सटीक)। 2. अधिक सटीक दृष्टिकोण जो System.nanoTime का उपयोग करता है। 3. एक सरल तरीका जो शेड्यूल का उपयोग करता है।

आमतौर पर किसे प्राथमिकता दी जानी चाहिए और प्रत्येक दृष्टिकोण के फायदे / नुकसान कहां हैं? किसी भी जानकारी के लिए अग्रिम धन्यवाद।

जवाबों:


7

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

Http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime%28%29 का उपयोग करके आप बीते हुए समय के लिए मतदान कर सकते हैं। मूल रूप से ...

public static void main(String [ ] args)
{
    long current_frame_time = system.nanoTime();
    long last_frame_time = current_frame_time;

    while(gameIsRunning)
    {
        last_frame_time = current_frame_time;
        current_frame_time = system.nanoTime();

        long timeTaken = current_frame_time - last_frame_time;

        //update and render game here
    }
}

इस बुनियादी विधि को बेहतर बनाया जा सकता है, जैसे http://www.koonsolo.com/news/dewitters-gameloop/ और http://gafferongames.com/game-physics/fix-your-timestep/

वैकल्पिक रूप से, आप एक टाइमर बना सकते हैं और अपने अपडेट को चलाने और हर एक्स मिलीसेकंड को रेंडर करने के लिए इस टाइमर को सेट कर सकते हैं। लेकिन, इस तरह एक गेमेलोप के निर्माण के लिए कुछ डाउनसाइड हैं।

Http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html के अनुसार : " प्रत्येक टाइमर ऑब्जेक्ट के अनुरूप एक सिंगल बैकग्राउंड थ्रेड है जिसका उपयोग सभी टाइमर को निष्पादित करने के लिए किया जाता है। कार्य, क्रमिक रूप से। टाइमर के कार्य जल्दी से पूरा होने चाहिए। यदि टाइमर कार्य को पूरा करने में अत्यधिक समय लगता है, तो यह टाइमर के कार्य निष्पादन थ्रेड को "हॉग" करता है। यह, बदले में, बाद के कार्यों के निष्पादन में देरी कर सकता है, जो कि "गुच्छा अप" हो सकता है। तीव्र उत्तराधिकार में निष्पादित (जब और यदि) अपमानजनक कार्य अंत में पूरा होता है। "

Http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html#scheduleAtFixedRate%28java.util.TimerTask.%20java.util.Date,%20long%29 : के अनुसार। " निश्चित दर निष्पादन में, प्रत्येक निष्पादन प्रारंभिक निष्पादन के निर्धारित निष्पादन समय के सापेक्ष निर्धारित होता है। यदि निष्पादन किसी भी कारण से विलंबित होता है (जैसे कचरा संग्रह या अन्य पृष्ठभूमि गतिविधि), तो तेजी से उत्तराधिकार में दो या अधिक निष्पादन होंगे। "पकड़ने के लिए।" लंबे समय में, निष्पादन की आवृत्ति निर्दिष्ट अवधि के बिल्कुल पारस्परिक होगी (सिस्टम घड़ी अंतर्निहित Object.wait (लंबे समय तक) सटीक है)। "

चूँकि आप आमतौर पर समय से पहले नहीं जानते हैं कि गेम लूप कितना समय लेता है, अपने गेमो को हर एक्स मिलीसेकंड (लक्ष्य फ्रेम दर के आधार पर) निष्पादित करने के लिए टाइमर सेट करने से कुछ गुच्छेदार फ्रेम हो सकते हैं, जो कि जब भी कोई फ़्रेम निष्पादित होता है। जब कोई फ़्रेम शेड्यूल किया गया हो तो उसके बजाय समाप्त। जब ऐसा होता है ... पहली बार में टाइमर का उपयोग क्यों करें?

अब, मुझे गलत मत समझो, टाइमर एक बुरा वर्ग नहीं है, लेकिन यह आमतौर पर छोटे कार्यों के लिए बेहतर होता है, जिन्हें समय-समय पर या एक निश्चित समय पर करने की आवश्यकता होती है, जैसे एक मेल क्लाइंट हर 5 में नए मेल की जांच करना चाहता है। दौड़ शुरू होने से पहले उलटी गिनती प्रदर्शित करने के लिए मिनटों, या एक काउंटर को हर सेकंड घटाया जा सकता है।


सवाल गेम लूप के बारे में था इसलिए awt / स्विंग की जानकारी ऑफ-टॉपिक है। हालाँकि ऐसा लग रहा था कि प्रश्न में एक अप्रासंगिक और भ्रामक रेखा के कारण यह जानकारी प्रासंगिक थी, इसलिए मैंने इसे हटा दिया।
झॉकिंग

मैंने प्रश्न के लिए किए गए परिवर्तनों को प्रतिबिंबित करने के लिए अपने उत्तर को अनुकूलित किया।
16

7

मैं मुख्य लूप को टाइमर में नहीं डालूंगा। बल्कि मैं एक 'जबकि ’लूप बनाऊंगा जो हर फ्रेम को प्रोसेस करता है और फिर किसी प्रकार की टाइमकीपिंग कार्यक्षमता का उपयोग करता है (ऐसा लगता है कि जावा में ऐसा लगता है कि System.nanoTime) यह गणना करेगा कि आखिरी फ्रेम / अंतिम पुनरावृति के बाद कितना समय बीत चुका है। पाश।

कुछ भाषाएं यहां अपवाद हैं (उदाहरण। जावास्क्रिप्ट, एक्शनस्क्रिप्ट) क्योंकि वे भाषाएँ एक ऐसे वातावरण के भीतर काम करती हैं, जिसमें निहित मुख्य लूप हुक करने के लिए होता है (जैसे ब्राउज़र, फ़्लैश प्लेयर) लेकिन यह अपवाद जावा पर लागू नहीं होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.