मैं एक नियतात्मक भौतिकी सिमुलेशन कैसे कर सकता हूं?


43

मैं एक भौतिकी खेल बना रहा हूं जिसमें कठोर शरीर शामिल हैं जिसमें खिलाड़ी एक पहेली / मानचित्र को हल करने के लिए टुकड़ों और भागों को स्थानांतरित करते हैं। खेल का एक बेहद महत्वपूर्ण पहलू यह है कि जब खिलाड़ी एक सिमुलेशन शुरू करते हैं, तो यह हर जगह समान रूप से चलता है , चाहे उनके ऑपरेटिंग सिस्टम, प्रोसेसर, आदि ...

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

मैं अपने खेल में इस नियतत्व को कैसे प्राप्त कर सकता हूं? मैं जावास्क्रिप्ट, सी ++, जावा, पायथन, और सी # सहित विभिन्न प्रकार के फ्रेमवर्क और भाषाओं का उपयोग करने के लिए तैयार हूं।

मुझे Box2D (C ++) के साथ-साथ अन्य भाषाओं में इसके समकक्षों द्वारा लुभाया गया है, क्योंकि यह मेरी जरूरतों को पूरा करता है, लेकिन इसमें फ्लोटिंग पॉइंट नियतिवाद का अभाव है, विशेष रूप से त्रिकोणमितीय कार्यों के साथ।

मैंने अब तक देखा सबसे अच्छा विकल्प Box2D का जावा समतुल्य (JBox2D) है। यह कई कार्यों के लिए उपयोग करने के StrictMathबजाय फ्लोटिंग पॉइंट नियतिवाद पर एक प्रयास करता प्रतीत होता है Math, लेकिन यह स्पष्ट नहीं है कि क्या यह इंजन मेरी ज़रूरत की हर चीज की गारंटी देगा जैसा कि मैंने अभी तक गेम का निर्माण नहीं किया है।

क्या मेरी आवश्यकताओं के अनुरूप किसी मौजूदा इंजन का उपयोग या संशोधन करना संभव है? या मुझे अपने दम पर एक इंजन बनाने की आवश्यकता होगी?

संपादित करें: यदि आप इस बारे में परवाह नहीं करते हैं कि किसी को इस तरह की सटीकता की आवश्यकता क्यों है, तो इस पद को छोड़ दें। टिप्पणियों और उत्तरों के व्यक्तियों का मानना ​​है कि मुझे कुछ ऐसा नहीं करना चाहिए, और इस तरह, मैं आगे बताऊंगा कि खेल को कैसे काम करना चाहिए।

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

कारण यह है कि सब कुछ निर्धारक होने की आवश्यकता है क्योंकि मैं कोड का उत्पादन करने की योजना बना रहा हूं जो प्रत्येक मशीन की स्थिति, आकार और रोटेशन को रिकॉर्ड करके xml या json फ़ाइल में प्रत्येक मशीन (एक स्तर को हल करने का प्रयास करता है) का सेट करेगा। फिर खिलाड़ियों के लिए सोल्व्स साझा करना संभव होगा (जो इन फ़ाइलों द्वारा दर्शाए गए हैं) ताकि वे सॉल्व्स को सत्यापित कर सकें, एक दूसरे से सीख सकें, प्रतियोगिताओं को पकड़ सकें, सहयोग कर सकें, आदि ... बेशक, ज्यादातर सॉल्व, विशेष रूप से सरल या त्वरित लोग, नियतत्ववाद की कमी से प्रभावित नहीं होंगे। लेकिन धीमे या जटिल डिजाइन जो वास्तव में कठिन स्तरों को हल करते हैं, और वे ऐसे हैं जो संभवतः सबसे दिलचस्प और मूल्य साझा करने वाले होंगे।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है । यदि आपको लगता है कि आपके पास समस्या का हल है, तो कृपया टिप्पणी के बजाय उत्तर के रूप में पोस्ट करने पर विचार करें - इससे वोटिंग / मार्किंग के माध्यम से मूल्यांकन करना, या स्वीकार किए गए सुझाव पर सीधे टिप्पणी करने के बजाय संपादित करना आसान हो जाता है एक लंबी बातचीत के धागे में उत्तर देते हैं।
DMGregory

जवाबों:


45

एक नियतात्मक तरीके से फ्लोटिंग पॉइंट नंबरों को संभालने पर

फ्लोटिंग पॉइंट नियतात्मक है। खैर, यह होना चाहिए। यह जटिल है।

फ्लोटिंग पॉइंट नंबरों पर बहुत साहित्य है:

और वे कैसे समस्याग्रस्त हैं:

अमूर्त के लिए। कम से कम, एक ही धागे पर, एक ही डेटा के साथ एक ही संचालन, एक ही क्रम में हो रहा है, निर्धारक होना चाहिए। इस प्रकार, हम इनपुट के बारे में चिंता करके, और फिर से शुरू कर सकते हैं।


एक ऐसा इनपुट जो समस्याओं का कारण बनता है वह है समय।

सबसे पहले, आपको हमेशा उसी टाइमस्टेप की गणना करनी चाहिए। मैं समय को मापने के लिए नहीं कह रहा हूं, मैं कह रहा हूं कि आप भौतिकी सिमुलेशन के लिए समय नहीं देंगे, क्योंकि समय में बदलाव सिमुलेशन में शोर का एक स्रोत है।

यदि आप इसे भौतिकी सिमुलेशन में नहीं दे रहे हैं तो आप समय क्यों मापते हैं? आप यह जानने के लिए बीता हुआ समय मापना चाहते हैं कि एक सिमुलेशन कदम कब बुलाया जाना चाहिए, और - यह मानते हुए कि आप नींद का उपयोग कर रहे हैं - सोने का कितना समय।

इस प्रकार:

  • उपाय समय: हाँ
  • सिमुलेशन में समय का उपयोग करें: नहीं

अब, निर्देश पुन: व्यवस्थित करना।

संकलक तय कर सकता है कि f * a + bजैसा है b + f * a, वैसे ही एक अलग परिणाम हो सकता है। यह भी fammd को संकलित कर सकता है , या यह कई लाइनें ले सकता है जैसे कि एक साथ होता है और उन्हें SIMD के साथ लिखता है , या कुछ अन्य अनुकूलन जो मैं अभी नहीं सोच सकता। और याद रखें कि हम उसी ऑपरेशन को उसी ऑर्डर पर करना चाहते हैं, यह इस कारण से आता है कि हम यह नियंत्रित करना चाहते हैं कि क्या ऑपरेशन होते हैं।

और नहीं, डबल का उपयोग करने से आप नहीं बचेंगे।

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

यकीनन, विधानसभा लिखना आदर्श होगा। इस तरह से आप तय करते हैं कि क्या करना है। हालाँकि, यह कई प्लेटफार्मों का समर्थन करने के लिए एक समस्या हो सकती है।

इस प्रकार:


निश्चित बिंदु संख्याओं के लिए मामला

स्मृति में जिस तरह से झांकियों का प्रतिनिधित्व किया जाता है, उसके कारण बड़े मूल्य सटीक खोते जा रहे हैं। यह इस कारण से आता है कि आपके मूल्यों को छोटा (क्लैंप) रखना समस्या को कम करता है। इस प्रकार, कोई विशाल गति और कोई बड़ा कमरा नहीं। जिसका अर्थ यह भी है कि आप असतत भौतिकी का उपयोग कर सकते हैं क्योंकि आपके पास सुरंग बनाने का जोखिम कम है।

दूसरी ओर, छोटी त्रुटियां जमा होंगी। इसलिए, काट-छाँट करें। मेरा मतलब है, पैमाने और एक पूर्णांक प्रकार के लिए डाली। इस तरह आप जानते हैं कि कुछ भी नहीं बन रहा है। ऐसे ऑपरेशन होंगे जो आप पूर्णांक प्रकार के साथ रह सकते हैं। जब आपको फ़्लोटिंग पॉइंट पर वापस जाने की आवश्यकता होती है तो आप स्केलिंग और कास्ट को पूर्ववत करते हैं।

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

मैं ट्रंकटेट कह रहा हूं। गोलाई की समस्या के बारे में, इसका मतलब है कि कलाकारों के बाद आपको जो भी मूल्य मिला है उसके अंतिम बिट पर भरोसा नहीं कर सकते। तो, कास्ट स्केल से पहले आप की जरूरत से एक बिट अधिक पाने के लिए, और बाद में इसे छोटा करें।

इस प्रकार:

  • मान छोटा रखें: हाँ
  • सावधान गोलाई: हाँ
  • संभव होने पर फिक्स्ड प्वाइंट नंबर: हां

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

क्या आप जानते हैं कि उन्होंने मूल प्लेस्टेशन के लिए सामान किया था? कृपया मेरे कुत्ते मिलिए, पैच

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

इस प्रकार: USE FIXED POINT NUMBERS।


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

मुझे नहीं लगता कि "निश्चित बिंदु संख्या कठिन है" उनका उपयोग न करने का एक अच्छा कारण है। और यदि आप उनका उपयोग करने का एक अच्छा कारण चाहते हैं, तो यह नियतात्मकता है, विशेष रूप से प्लेटफार्मों में निर्धारकवाद।


यह सभी देखें:


परिशिष्ट : मैं दुनिया के आकार को छोटा रखने का सुझाव दे रहा हूं। उस ने कहा, दोनों ओपी ans Jibb स्मार्ट इस बिंदु को लाते हैं कि मूल फ़्लोट से दूर जाने से कम सटीकता होती है। इसका भौतिकी पर प्रभाव पड़ेगा, जो कि दुनिया के किनारे से बहुत पहले दिखाई देगा। निश्चित बिंदु संख्या, अच्छी तरह से, निश्चित परिशुद्धता है, वे हर जगह समान रूप से अच्छे (या खराब, यदि आप चाहें) होंगे। अगर हम दृढ़ संकल्प चाहते हैं तो अच्छा है। मैं यह भी उल्लेख करना चाहता हूं कि जिस तरह से हम आमतौर पर भौतिकी करते हैं, उसमें छोटे बदलाव को बढ़ाने की संपत्ति होती है। तितली प्रभाव देखें - अतुल्य मशीन और गर्भनिरोधक निर्माता में नियतात्मक भौतिकी


भौतिकी करने का दूसरा तरीका

मैं सोच रहा था, यही कारण है कि फ्लोटिंग पॉइंट नंबरों में परिशुद्धता में छोटी सी त्रुटि बढ़ जाती है क्योंकि हम उन नंबरों पर पुनरावृत्तियों कर रहे हैं। प्रत्येक सिमुलेशन कदम हम अंतिम सिमुलेशन कदम के परिणाम लेते हैं और उन पर सामान करते हैं। त्रुटियों की गति को संचित करना। वह तुम्हारा तितली प्रभाव है।

मुझे नहीं लगता कि हम एक ही मशीन का उपयोग करके एक ही निर्माण को एक ही इनपुट पर एक ही इनपुट से अलग आउटपुट देंगे। फिर भी, एक अन्य मशीन पर यह या एक अलग निर्माण कर सकता है।

वहां परीक्षण के लिए एक तर्क है। यदि हम ठीक से तय करते हैं कि चीजों को कैसे काम करना चाहिए, और हम लक्ष्य हार्डवेयर पर परीक्षण कर सकते हैं, तो हमें उन बिल्ड को नहीं लगाना चाहिए जिनका एक अलग व्यवहार है।


हालाँकि, दूर काम न करने का एक तर्क यह भी है कि इसमें बहुत सारी त्रुटियाँ हैं। शायद यह एक अलग तरीके से भौतिकी करने का अवसर है।

जैसा कि आप जानते हैं, निरंतर और असतत भौतिकी है, दोनों काम करते हैं कि प्रत्येक वस्तु टाइमस्टेप पर कितना आगे बढ़ेगी। हालांकि, निरंतर भौतिकी के पास विभिन्न संभावित उदाहरणों की जांच करने के बजाय टकराव की स्थिति का पता लगाने के साधन हैं ताकि यह देखा जा सके कि टक्कर हुई थी या नहीं।

इस प्रकार, मैं निम्नलिखित का प्रस्ताव कर रहा हूं: निरंतर भौतिकी की तकनीकों का उपयोग यह पता लगाने के लिए कि प्रत्येक वस्तु की अगली टक्कर कब होगी, एक बड़े टाइमस्टेप के साथ, बहुत बड़ा कि एक एकल सिमुलेशन चरण में से एक। फिर आप निकटतम टकराव को तुरंत लेते हैं और यह पता लगाते हैं कि उस पल में सब कुछ कहां होगा।

हाँ, यह एक एकल सिमुलेशन कदम का एक बहुत काम है। इसका मतलब है कि सिमुलेशन तुरंत शुरू नहीं होगा ...

... हालाँकि, आप हर बार टकराव की जाँच किए बिना अगले कुछ सिमुलेशन चरणों का अनुकरण कर सकते हैं, क्योंकि आप पहले से ही जानते हैं कि अगली टक्कर कब होगी (या बड़े समय में कोई टक्कर नहीं होती है)। इसके अलावा, उस सिमुलेशन में संचित त्रुटियां अप्रासंगिक हैं क्योंकि एक बार जब सिमुलेशन बड़े टाइमस्टेप पर पहुंच जाता है, तो हम केवल उन पदों को रखते हैं जिन्हें हमने पहले से गणना की थी।

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


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


नोट : यदि हम इस फ्लोटिंग पॉइंट संख्या को कर रहे हैं, तो यह दृष्टिकोण वस्तुओं की समस्या को हल नहीं करता है जो कि उनके द्वारा की गई उत्पत्ति से अलग है। हालांकि, जबकि यह सच है कि सटीकता आगे खो जाती है आप मूल से दूर जाते हैं, यह अभी भी निर्धारक है। वास्तव में, यही कारण है कि मूल रूप से भी नहीं लाया।


परिशिष्ट

टिप्पणी में ओपी से :

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

तो, कोई द्विआधारी प्रारूप, सही? इसका मतलब है कि हमें चिंता करने की भी जरूरत है कि फ्लोटिंग पॉइंट नंबरों को रिकवर किया जाए या नहीं। देखें: फ्लोट प्रिसिजन रिविजिटेड: नाइन डिजिट फ्लोट पोर्टेबिलिटी


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
Vaillancourt

2
बहुत बढ़िया जवाब! फिक्स्ड पॉइंट के पक्ष में 2 और बिंदु: 1. फ़्लोटिंग पॉइंट मूल से अलग या उससे आगे का व्यवहार करेगा (यदि आपके पास एक ही स्थान पर एक ही पहेली है), लेकिन निश्चित बिंदु नहीं होगा; 2. फिक्स्ड पॉइंट वास्तव में इसकी अधिकांश रेंज के लिए फ्लोटिंग पॉइंट की तुलना में अधिक सटीक है - आप फिक्स्ड पॉइंट का अच्छी तरह से उपयोग करके सटीक प्राप्त कर सकते हैं
जिब स्मार्ट

base64तत्वों का उपयोग करके XML और JSON दोनों में बाइनरी डेटा को एनकोड करना संभव है । यह इस तरह के डेटा की बड़ी मात्रा का प्रतिनिधित्व करने के लिए एक कुशल तरीका नहीं है, लेकिन यह गलत है कि वे द्विआधारी प्रतिनिधित्व के उपयोग को रोकते हैं।
पिकालेक

1
@Pikalek मुझे पता है, ओपी ने मुझसे टिप्पणियों के बारे में पूछा, मैंने बेस 64 को एक विकल्प के रूप में उल्लेख किया, जिसमें हेक्स भी शामिल है, जो कलाकारों को इंट के रूप में पुनर्व्याख्या करते हैं, और प्रोटोबुफ़ प्रारूप का उपयोग करने के बाद से कोई भी उन फ़ाइलों को वैसे भी नहीं समझेगा, वे अप्रशिक्षित नहीं हैं ) मानव पठनीय। फिर - मेरा मानना ​​है - एक मॉड ने टिप्पणियों को हटा दिया (नहीं, यह ऊपर लिंक की गई चैट में नहीं है)। क्या ऐसा फिर होगा? क्या मुझे इसका जवाब देना चाहिए? क्या मुझे इसे लंबा करना चाहिए?
थारोट

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

6

मैं एक ऐसी कंपनी के लिए काम करता हूं, जो एक निश्चित रूप से प्रसिद्ध वास्तविक समय की रणनीति का खेल बनाती है, और मैं आपको बता सकता हूं कि फ्लोटिंग पॉइंट निर्धारकवाद संभव है।

विभिन्न संकलक, या एक ही संकलक के साथ एक ही संकलक का उपयोग करना, या एक ही संकलक के विभिन्न संस्करणों का उपयोग करना, सभी नियतांक को तोड़ सकता है।

यदि आपको प्लेटफार्मों या गेम संस्करणों के बीच क्रॉसप्ले की आवश्यकता है, तो मुझे लगता है कि आपको निश्चित बिंदु पर जाने की आवश्यकता होगी - एकमात्र संभव क्रॉसप्ले जिसे मैं फ्लोटिंग पॉइंट के साथ जानता हूं, पीसी और एक्सबॉक्स 1 के बीच है, लेकिन यह बहुत पागल है।

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

यदि आप अपने सामान को रोल करने की कोशिश करने जा रहे हैं, तो कुछ चीजें जो मदद कर सकती हैं:

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

1
एकता वास्तव में अपने डेटा-ओरिएंटेड टेक्नोलॉजी स्टैक के लिए अपने नए यूनिटी फिजिक्स सिस्टम के साथ क्रॉस-प्लेटफॉर्म निर्धारण के लक्ष्य की ओर काम कर रही है, लेकिन जैसा कि मैं इसे समझता हूं, यह अभी भी प्रगति पर है और शेल्फ का उपयोग करने के लिए अभी तक पूर्ण / तैयार नहीं है।
DMGregory

गैर-नियतात्मक SIMD निर्देश का एक उदाहरण क्या है? क्या आप अनुमानित लोगों की तरह सोच रहे हैं rsqrtps?
रुस्लान

@DMGregory यह पूर्वावलोकन में होनी चाहिए, क्योंकि आप इसे पहले ही उपयोग कर सकते हैं - लेकिन जैसा कि आप कहते हैं कि यह अभी तक समाप्त नहीं हो सकता है।
जो

@Ruslan हाँ rsqrtps / rcpps परिणाम कार्यान्वयन पर निर्भर हैं
जो 14

5

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

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


1
मैं पूरी तरह से सहमत। यह आप सभी उपयोगकर्ताओं के साथ एक साझा अनुभव की गारंटी है। gamedev.stackexchange.com/questions/6645/… एक समान विषय पर चर्चा करता है, क्लाइंट साइड बनाम सर्वर साइड भौतिकी के बीच अंतर की तुलना करता है।
टिम होल्ट

1

मैं एक काउंटर-सहज ज्ञान युक्त सुझाव देने जा रहा हूं, जबकि 100% विश्वसनीय नहीं, अधिकांश समय ठीक काम करना चाहिए और इसे लागू करना बहुत आसान है।

शुद्धता कम करें।

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

बेशक, सिमुलेशन थोड़ा कम सटीक होगा जितना कि यह (वास्तविक भौतिकी की तुलना में) हो सकता है, लेकिन यह वास्तव में उल्लेखनीय नहीं है जब तक कि आपके सभी प्रोग्राम रन उसी तरह से गलत नहीं होते हैं ।

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


मैं आपको यह सलाह भी दूंगा कि आप जिस चीज के बारे में पूछ रहे हैं, उस पर पूरी तरह से विपरीत विचार करें: अनिश्चितता को गले लगा लें ! यदि व्यवहार थोड़ा nondeterministic है, तो यह वास्तव में वास्तविक भौतिकी प्रयोगों के करीब है। तो, क्यों नहीं जानबूझकर प्रत्येक सिमुलेशन रन के लिए शुरुआती मापदंडों को बेतरतीब ढंग से चलाया जाता है, और यह एक आवश्यकता है कि सिमुलेशन कई परीक्षणों पर लगातार सफल होता है ? यह भौतिक विज्ञान के बारे में बहुत कुछ सिखाएगा, और सुपर-नाजुक लोगों के बजाय मशीनों को मजबूत / रैखिक होने के लिए इंजीनियर बनाने के बारे में, जो केवल एक सिमुलेशन में यथार्थवादी हैं।


नीचे राउंडिंग से मदद नहीं मिलेगी, क्योंकि यदि उच्च परिशुद्धता का परिणाम गैर-नियतात्मक है, तो अंत में एक परिणाम एक सिस्टम पर एक तरह से और दूसरे सिस्टम पर दूसरे तरीके से राउंड होने वाला है। उदाहरण के लिए, आप हमेशा निकटतम पूर्णांक के लिए राउंड कर सकते हैं, लेकिन फिर एक सिस्टम कंप्यूटर 1.0 और दूसरे की गणना 0.99999999999999999999999999999999999999 है और वे अलग-अलग राउंड करते हैं।
योयो

हां, यह संभव है, जैसा कि मैंने पहले ही उत्तर में कहा था। लेकिन यह बहुत ही कम होगा , जैसा कि खेल भौतिकी में अन्य glitches करते हैं। तो गोलाई करता है मदद करते हैं। (मैं नहीं होगा दौर नीचे हालांकि; दौर निकटतम करने वाली बयाझिंग से बचने के लिए।)
leftaroundabout

0

नंबर संचय के लिए अपनी खुद की कक्षा बनाएँ!

आप एक निर्धारक व्यवहार को बाध्य कर सकते हैं यदि आप ठीक से जानते हैं कि गणना कैसे की जाएगी। उदाहरण के लिए, यदि आपके द्वारा किए जाने वाले एकमात्र संचालन गुणन, विभाजन, जोड़ और घटाव हैं, तो यह केवल तर्कसंगत संख्या के रूप में सभी संख्याओं का प्रतिनिधित्व करने के लिए पर्याप्त होगा। ऐसा करने के लिए, एक साधारण तर्कसंगत वर्ग ठीक काम करेगा।

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


3
किसी भी प्रकार के संख्यात्मक एकीकरण के लिए तर्कसंगत अंकगणितीय पूरी तरह से अव्यावहारिक है। यहां तक ​​कि अगर प्रत्येक समय-चरण केवल तभी करता है, तो हर समय समय पर * / + -बड़ा और बड़ा हो जाएगा।
leftaroundabout

मैं उम्मीद करूंगा कि एकीकरण पर विचार किए बिना भी, यह एक अच्छा समाधान नहीं होगा क्योंकि केवल एक-दो गुणा या विभाजन के बाद, आपके अंश और हर का प्रतिनिधित्व करने वाले नंबर 64-बिट पूर्णांक को ओवरफ्लो कर देंगे।
jvn91173

0

यहाँ शब्दावली का कुछ भ्रम है। एक भौतिक प्रणाली पूरी तरह से नियतात्मक हो सकती है, लेकिन एक उपयोगी समय अवधि के लिए मॉडल करना असंभव है क्योंकि इसका व्यवहार प्रारंभिक स्थितियों के प्रति बेहद संवेदनशील है, और प्रारंभिक स्थितियों में एक छोटा सा परिवर्तन पूरी तरह से अलग व्यवहार का उत्पादन करेगा।

यहां एक वास्तविक उपकरण का एक वीडियो है, जिसका व्यवहार जानबूझकर अप्रत्याशित है, सिवाय सांख्यिकीय अर्थ में:

https://www.youtube.com/watch?v=EvHiee7gs9Y

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

इसे ठीक करने का सबसे अच्छा तरीका अपने स्रोत पर समस्या पर हमला करना है: अपने खेल के भौतिकी को निर्धारक के रूप में बनाएं क्योंकि इसे प्रतिलिपि प्रस्तुत करने योग्य परिणाम प्राप्त करने की आवश्यकता है।

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

एक विशिष्ट उदाहरण के रूप में, मान लीजिए कि आपके खेल में कठोर निकायों के टकराव शामिल हैं। यहां तक ​​कि अगर आप घर्षण को नजरअंदाज करते हैं, तो मनमाने आकार की वस्तुओं के बीच टकराव की सटीक मॉडलिंग, जो कताई हो सकती है क्योंकि वे चलते हैं असंभव है। लेकिन अगर आप स्थिति को बदलते हैं ताकि केवल ऑब्जेक्ट गैर-घूर्णन आयताकार ईंटें हों, तो जीवन बहुत सरल हो जाता है। यदि आपके खेल में ऑब्जेक्ट ईंटों की तरह नहीं दिखते हैं, तो उस तथ्य को कुछ "गैर-भौतिक" ग्राफिक्स के साथ छिपाएं - उदाहरण के लिए, सचमुच कुछ धुएं या लपटों के पीछे टकराव के पल को छिपाएं, या एक कार्टून-पाठ-बुलबुला "आउच" जो कुछ भी।

खिलाड़ी को गेम खेलकर गेम फिजिक्स की खोज करनी होती है । इससे कोई फर्क नहीं पड़ता कि यह "पूरी तरह से यथार्थवादी" नहीं है, जब तक कि यह आत्मनिर्भर है, और प्रशंसनीय होने के लिए सामान्य ज्ञान के अनुभव के समान पर्याप्त है।

यदि आप भौतिक विज्ञान को एक स्थिर तरीके से व्यवहार करते हैं, तो इसका एक कंप्यूटर मॉडल भी स्थिर परिणाम दे सकता है, कम से कम इस अर्थ में कि गोल त्रुटियां अप्रासंगिक होंगी।


1
मैं शब्दावली में कोई भ्रम नहीं देख रहा हूँ। ओपी एक संभावित अराजक प्रणाली से निर्धारक व्यवहार चाहता है। यह पूरी तरह से उल्लेखनीय है।
मार्क

सरल आकृतियों (जैसे मंडलियों और आयतों) का उपयोग करना समस्या को बिल्कुल भी नहीं बदलता है। आपको अभी भी बहुत सारे त्रिकोणमितीय कार्यों, sqrt आदि की आवश्यकता है ...
jvn91173

-1

का प्रयोग करें डबल चल बिन्दु परिशुद्धता , के बजाय एक चल बिन्दु परिशुद्धता । हालांकि सही नहीं है, यह आपके भौतिकी में नियतात्मक समझा जाना काफी सटीक है। आप डबल फ्लोटिंग पॉइंट परिशुद्धता के साथ चंद्रमा को रॉकेट भेज सकते हैं, लेकिन एकल फ़्लोटिंग पॉइंट सटीक नहीं।

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


11
डबल-सटीक दृष्टिकोण तितली के प्रभाव से दूर चलता है । एक गतिशील प्रणाली में (भौतिकी सिम की तरह), यहां तक ​​कि प्रारंभिक परिस्थितियों में एक छोटा विचलन प्रतिक्रिया के माध्यम से बढ़ सकता है, एक अवधारणात्मक त्रुटि तक स्नोबॉलिंग। सभी अतिरिक्त अंक इसे थोड़ी देर देरी करते हैं - स्नोबॉल को थोड़ा आगे रोल करने के लिए मजबूर करने से पहले यह समस्याओं का कारण बनने के लिए पर्याप्त है।
DMGregory

2
एक बार में दो गलतियाँ: 1) डबल फ़्लोटिंग पॉइंट्स में वही समस्याएँ होती हैं और आमतौर पर भविष्य को डिबग करने के लिए समस्या को कभी-कभी मुश्किल में डाल दिया जाता है। 2) ऐसा कोई नियम नहीं है जो कहता है कि फ़्लोटिंग पॉइंट की तुलना में निश्चित बिंदु कम सटीक होना चाहिए। पैमाने और हाथ में समस्या के आधार पर, या स्मृति पर आप निश्चित बिंदु संख्या का उपयोग करने के लिए तैयार हैं, वे कम सटीक, समान रूप से सटीक या अधिक सटीक हो सकते हैं। यह कहने का कोई मतलब नहीं है कि "वे कम सटीक हैं"।
10

@phresnel, निश्चित-बिंदु परिशुद्धता के एक उदाहरण के रूप में, IBM 1400 श्रृंखला ने मनमाना-सटीक निश्चित-बिंदु दशमलव गणित का उपयोग किया। प्रत्येक संख्या के लिए 624 अंक समर्पित करें, और आप डबल-सटीक फ़्लोटिंग पॉइंट की सीमा और परिशुद्धता को पार कर चुके हैं ।
मार्क

@phresnel (2) अच्छी बात है। मैंने अपने जवाब को बिट्स की समान संख्या मानने के लिए अद्यतन किया।
एवरोरल

-2

मेमेंटो पैटर्न का उपयोग करें ।

अपने प्रारंभिक रन में, प्रत्येक फ्रेम, या जो भी बेंचमार्क की जरूरत होती है, पोजिशनल डेटा को सेव करें। अगर यह बहुत अधिक है, तो इसे केवल हर n फ्रेम में करें।

फिर जब आप सिमुलेशन को पुन: पेश करते हैं, तो मनमाना भौतिकी का पालन करें, लेकिन हर एन फ्रेम में स्थितीय डेटा को अपडेट करें।

अत्यधिक सरल छद्म कोड:

function Update():
    if(firstRun) then (SaveData(frame, position));
    else if(reproducedRun) then (this.position = GetData(frame));

9
मुझे नहीं लगता कि यह ओपी के मामले के लिए काम करता है। मान लीजिए कि आप और मैं दोनों विभिन्न प्रणालियों पर खेल खेल रहे हैं। हम में से प्रत्येक पहेली टुकड़ों को एक ही तरह से रखता है - एक समाधान जो डेवलपर द्वारा अग्रिम में भविष्यवाणी नहीं की गई थी। जब आप "स्टार्ट" पर क्लिक करते हैं, तो आपका पीसी भौतिक विज्ञान का अनुकरण करता है ताकि समाधान सफल हो। जब मैं ऐसा ही करता हूं, तो सिमुलेशन में कुछ छोटे अंतर से मेरा (समान) समाधान सफल होने के रूप में वर्गीकृत नहीं होता है। यहां, मुझे आपके सफल रन से स्मृति चिन्ह से परामर्श करने का अवसर नहीं है, क्योंकि यह आपकी मशीन पर हुआ, न कि देव समय पर।
DMGregory

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