2010-03-13 5 views
5

स्थिति: एक अनुरूपित वातावरण में कई संस्थाएं हैं, जिनमें "टिक्स" नामक समय की कृत्रिम धारणा है, जिसका वास्तविक समय कोई लिंक नहीं है। प्रत्येक इकाई इसे स्थानांतरित करने के लिए ले जाती है, लेकिन कुछ दूसरों की तुलना में तेज़ी से होती हैं। यह एक देरी से, ticks में व्यक्त किया जाता है।एक अंतिम काल्पनिक एटीबी-शैली कतार वापस करने के लिए कौन सी डेटा संरचना (ओं)? (देरी कतार)

एक एक बी ए

मैं क्या डेटा संरचना का उपयोग करने के सोच रहा हूँ: तो इकाई एक 10 की देरी, और बी 25. इस मामले में बारी क्रम जाना होगा हो सकता है। सबसे पहले मैंने स्वचालित रूप से "प्राथमिकता कतार" सोचा लेकिन देरी "वर्तमान समय" के सापेक्ष हैं जो मामलों को जटिल बनाती है। इसके अलावा, बड़ी देरी वाली संस्थाएं होंगी और यह असुरक्षित नहीं है कि कार्यक्रम लाखों टिकों के माध्यम से चलाएगा। यह एक आंतरिक काउंटर के लिए मूर्खतापूर्ण लगता है जब देरी स्वयं अपेक्षाकृत छोटी रहती है और वृद्धि नहीं करती है।

तो आप इसे कैसे हल करेंगे?

उत्तर

4

आप इकाइयों को एक हीप में स्टोर करते हैं और प्रतीक्षा करने के लिए अपने समय तक उन्हें समूहित करते हैं। आगे बढ़ने वाली संस्थाओं का समूह ढेर के शीर्ष पर होगा। आपको केवल इन इकाइयों को अपडेट करना होगा। जब उनका समय 0 तक गिरने के लिए शेष रहता है, तो आप उन्हें ढेर से निकाल देते हैं। पिछले कदम से पहले पारित समय की प्रतीक्षा करके अपने समय को कम करने के दौरान अपने समय को कम करने के दौरान इकाइयों के अगले समूह को ढेर के शीर्ष पर रखें।

उदाहरण के लिए:

आपका ढेर 3 नोड्स है (ए, बी, और सी), शीर्ष नोड एक दो संस्थाओं के साथ है दोनों होने 5 शेष टिक्स। बच्चे के पास क्रमशः 10 और 12 टिक शेष हैं।

  • समय टी = 5 आप 10-5 = 5 के साथ सभी संस्थाओं है कि ढेर के शीर्ष करने के ढेर
  • बी चाल से नोड में bucketed कर रहे हैं एक
  • निकालें एक चाल तो शेष टिक्स
  • दोहराना।
+1

यदि "प्रतीक्षा करने का समय" द्वारा ढेर को ऑर्डर करने के बजाय आप इसे "उस समय" जिस पर यह इकाई अगली कार्रवाई करेंगे "द्वारा आदेश दें, तो आपको प्रत्येक इकाई के" प्रतीक्षा करने का समय "कम करने की आवश्यकता नहीं है। –

+0

गिनती करते समय आपको Int या Int64 की सीमाओं से अधिक होने पर एक बार रोलिंग करना पड़ सकता है (यदि आपकी लड़ाई लंबी चल रही है)। – vfilby

+0

मेरा मतलब अगली कार्रवाई तक समय था, लेकिन प्रतीक्षा करने का समय कम टाइपिंग था। – BeWarned

0

विकल्प # 1: मतदान

मैं शायद एक नियंत्रक कि सभी विभिन्न संस्थाओं के लिए देरी की खोज और प्रत्येक इकाई के लिए एक टिक-शेष बनाए रख सकते हैं का निर्माण होगा। नियंत्रक टिकों के माध्यम से चक्र करेगा और प्रत्येक टिक पर यह खेल में सभी इकाइयों के लिए टिक टिक को कम करेगा।

एक बार एक संस्थाएं टिक-शेष मूल्य शून्य तक पहुंच जाती है, तो आप जानते हैं कि यह उनकी बारी है, या तो दिल की धड़कन विधि द्वारा नियंत्रित किया जाता है जो आपको टिक्स या एक विधि को नियंत्रित करता है।

विकल्प # 2 घटनाक्रम

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

घटना संचालित मार्ग का पालन करने से पहले सुनिश्चित करें कि मतदान मार्ग काम नहीं करेगा। कार्डिनल नियम को हमेशा याद रखें को हमेशा अनुकूलित करें क्योंकि अधिकतर आपको ऑप्टिमाइज़ेशन की आवश्यकता नहीं होती है।

+0

व्यवहार्य लगता है, लेकिन यदि बहुत सारी संस्थाएं हैं तो संभवतः थोड़ा धीमा? – ZoFreX

+1

अच्छा, मुझे लगता है कि यदि आपके पास बहुत सारी संस्थाएं हैं तो आप मतदान प्रणाली का उपयोग नहीं करना चाहते हैं। इसके बजाय एक घटना स्थापित करें जो प्रत्येक इकाई तैयार होने पर आग लगती है। इस तरह आपके नियंत्रक को घटनाओं को इस तरह की इकाइयों को संसाधित करना होता है। – vfilby

+0

जब आप प्रत्येक टिक के माध्यम से कदम उठाते हैं तो इन दोनों विधियों में बहुत ही असुरक्षित हैं। आम तौर पर इस प्रकृति के सिमुलेशन में आप बड़े अंतराल को उस समय छोड़ देते हैं जहां उनके माध्यम से वृद्धि के बजाय कुछ भी नहीं होता है। – ZoFreX

0

यदि हम मानते हैं कि आपकी संस्थाएं सिमुलेशन समय देख रही हैं या देख रही हैं, तो वे प्रत्येक इंटरफ़ेस को कार्यान्वित कर सकते हैं जो उन्हें ticks left ट्रैक करता है और यह सुनिश्चित करने के लिए एक विधि प्रदान करता है कि किसी विशेष इकाई के लिए कितनी टिक शेष रहें। प्रत्येक टिक में इकाई इसके द्वारा ticks left 1.

फिर आप एक क्रमबद्ध सेट कतार रख सकता है (सेट क्योंकि प्रत्येक इकाई केवल एक बार कतार में हो जाएगा) कम कर देता है इन संस्थाओं के, get ticks left के आधार पर क्रमबद्ध ताकि 0 इकाई आगे बढ़ने वाला है, और एनएच इकाई "धीमी" है।

जब इकाई के get ticks left विधि 0 है, यह क्रमबद्ध सेट से निकाल दिया जाता है, ticks left टाइमर रीसेट किया जाता है, और यह क्रमबद्ध सेट में पुन: शामिल किया गया है।

1

ऐसा लगता है कि आपके विवरण से "अगला क्या है?" "अगली कार्रवाई तक कितनी देर तक है" से अधिक महत्वपूर्ण है? यह मामला है, अपनी कतार को "अगली-टू-गो" या उच्चतम तक की टिकों की सबसे कम संख्या द्वारा क्रमबद्ध करें।आवेषण, निश्चित रूप से, उनके उचित क्रम में प्रवेश करते हैं, और बदली गई प्रविष्टियां ("गति तेज करें" मंत्र को कतार को हटा दिया जाता है, बदल दिया जाता है, और फिर उचित रूप से पुनः दर्ज किया जाता है।

फिर, आप बस कतार से अगले नौकरी को पॉप करते हैं। जो कुछ भी टिक टिक गया था वह "समय-समाप्त" होना चाहिए। कतार पर एक पास बनाता है, जो कि आपने अभी तक खोज की गई टिकों की मात्रा से प्रत्येक प्रविष्टि के शेष क्षेत्र को टिकाना है।

इसका शेष समय की अवधारणा का ट्रैक रखने का लाभ है, लेकिन घटनाओं को आग लगाने या किसी भी अन्य कोड को निष्पादित करने का लाभ नहीं है, जब कोई कार्रवाई करने की आवश्यकता नहीं होती है। आप इसे बर्दाश्त कर सकते हैं, क्योंकि वास्तविक समय से कोई संबंध नहीं है। केवल "अगला क्या है?", और "वहां पहुंचने में कितना समय लगा?"।

+0

आप सही हैं, "अगला क्या है?" महत्वपूर्ण धारणा है। जब तक सही क्रम में प्रक्रिया की प्रक्रिया होती है तब तक अगली कार्रवाई पूरी तरह से अनियंत्रित होने तक कितनी देर तक या कितनी देर तक होती है। मुझे कतार में सबकुछ कम करने के बारे में निश्चित नहीं है ... वहां कुछ हो सकते हैं, और मैं इसे तेज़ होना चाहता हूं। हालांकि, अगर मुझे कोई बेहतर तरीका नहीं मिल रहा है तो शायद यह होगा कि मैं क्या करूँगा। – ZoFreX

0

देखें कि जावा का DelayQueue लागू किया गया है।

+0

समय की वैश्विक धारणा, प्रत्येक तत्व जानता है कि यह कब होता है, और मिलने पर एक सापेक्ष समय का खुलासा करता है और तुलना करें। यह अभी भी अतिप्रवाह समस्या से पीड़ित है। – ZoFreX

संबंधित मुद्दे