फ्लोटिंग-पॉइंट नॉन-निर्धारणवाद के सामने निर्धारक खेल कैसे संभव हैं?


52

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

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

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

ध्यान दें कि मुझे मुख्य रूप से C # में दिलचस्पी है, जो कि जहां तक ​​मैं बता सकता हूं, इस संबंध में C ++ जैसी ही समस्याएं हैं।


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

@ हॉकिंग फिर भी यह शायद सबसे अच्छा जवाब है।
जोनाथन कॉनेल

Starcraft II infacti वास्तव में केवल हर बार सिंक करता है, मैंने अपने दोस्तों के साथ गेमप्ले रीप्ले को प्रत्येक कंप्यूटर साइड से देखा और जहां विशेष रूप से उच्च अंतराल (1 सेकंड) के साथ मतभेद थे। मेरे पास कुछ इकाइयाँ थीं, जहाँ 6/7 मानचित्र स्क्रीन पर मेरे स्वयं के सम्मान के लिए बहुत दूर हैं
GameDeveloper

जवाबों:


15

क्या फ्लोटिंग-पॉइंट निर्धारक हैं?

मैंने कुछ साल पहले इस मुद्दे पर बहुत कुछ पढ़ा था जब मैं उसी लॉकस्टेप आर्किटेक्चर का उपयोग करके आरटीएस लिखना चाहता था।

हार्डवेयर फ्लोटिंग-पॉइंट के बारे में मेरे निष्कर्ष थे:

  • एक ही मूल विधानसभा कोड सबसे अधिक संभावना निर्धारक है बशर्ते आप फ्लोटिंग पॉइंट फ्लैग और कंपाइलर सेटिंग्स के साथ सावधान रहें।
  • एक खुला स्रोत आरटीएस प्रोजेक्ट था जिसमें दावा किया गया था कि वे एक आवरण लाइब्रेरी का उपयोग करके विभिन्न कंपाइलरों में निर्धारक सी / सी ++ प्राप्त करते हैं। मैंने उस दावे को सत्यापित नहीं किया। (यदि मुझे सही ढंग से याद है तो यह STREFLOPपुस्तकालय के बारे में था )
  • .Net JIT को काफी हद तक छूट दी गई है। विशेष रूप से इसे आवश्यकता से अधिक सटीकता का उपयोग करने की अनुमति है। इसके अलावा यह x86 और AMD64 पर अलग-अलग निर्देश सेट का उपयोग करता है (मुझे लगता है कि x86 पर यह x87 का उपयोग करता है, एएमडी 64 यह कुछ एसएसई निर्देशों का उपयोग करता है जिसका व्यवहार मानदंड के लिए भिन्न होता है)।
  • जटिल निर्देश (त्रिकोणमितीय फ़ंक्शन, घातांक, लघुगणक सहित) विशेष रूप से समस्याग्रस्त हैं।

मैंने निष्कर्ष निकाला है कि अंतर्निहित अस्थायी प्रकारों में निर्मित नेट का उपयोग करना असंभव है।

संभव समाधान

इस प्रकार मुझे वर्कआर्ड की जरूरत थी। मैंने माना:

  1. FixedPoint32C # में लागू करें । हालांकि यह बहुत कठिन नहीं है (मेरे पास आधा तैयार कार्यान्वयन है) मूल्यों की बहुत छोटी श्रृंखला इसका उपयोग करने के लिए कष्टप्रद बनाती है। आपको हर समय सावधान रहना होगा ताकि आप न तो अतिप्रवाह करें, न ही बहुत अधिक सटीकता खोएं। अंत में मैंने पाया कि यह सीधे पूर्णांक का उपयोग करने से आसान नहीं है।
  2. FixedPoint64C # में लागू करें । मुझे ऐसा करने में मुश्किल हुई। कुछ परिचालनों के लिए 128bit का मध्यवर्ती पूर्णांक उपयोगी होगा। लेकिन .net ऐसे प्रकार की पेशकश नहीं करता है।
  3. गणित के संचालन के लिए मूल कोड का उपयोग करें जो एक मंच पर नियतात्मक है। प्रत्येक गणित ऑपरेशन पर एक प्रतिनिधि कॉल के ओवरहेड को जोड़ता है। पार मंच चलाने की क्षमता खो देता है।
  4. का उपयोग करें Decimal। लेकिन यह धीमा है, बहुत सारी मेमोरी लेता है और आसानी से अपवादों को फेंकता है (0 से अधिक भाग, ओवरफ्लो)। यह वित्तीय उपयोग के लिए बहुत अच्छा है, लेकिन खेलों के लिए कोई अच्छा फिट नहीं है।
  5. एक कस्टम 32 बिट फ़्लोटिंग पॉइंट लागू करें। पहली बार में मुश्किल लग रहा था। BitScanReverse आंतरिक की कमी इसे लागू करते समय कुछ झुंझलाहट का कारण बनती है।

माय सॉफ्टफ्लोट

StackOverflow पर आपकी पोस्ट से प्रेरित होकर , मैंने अभी सॉफ़्टवेयर में 32 बिट फ़्लोटिंग-पॉइंट प्रकार लागू करना शुरू किया है और परिणाम आशाजनक हैं।

  • मेमोरी प्रतिनिधित्व आईईईई फ्लोट्स के साथ द्विआधारी संगत है, इसलिए मैं उन्हें ग्राफिक्स कोड में आउटपुट करते समय कास्ट को फिर से व्याख्या कर सकता हूं।
  • यह SubNorms, infinities और NaN का समर्थन करता है।
  • सटीक परिणाम IEEE परिणामों के समान नहीं हैं, लेकिन यह आमतौर पर खेलों के लिए कोई मायने नहीं रखता है। इस तरह के कोड में यह केवल मायने रखता है कि परिणाम सभी उपयोगकर्ताओं के लिए समान है, न कि यह अंतिम अंक के लिए सटीक है।
  • प्रदर्शन सभ्य है। एक तुच्छ परीक्षण से पता चला कि यह 220-260MFLOPS की तुलना में floatजोड़ / गुणा (2.66GHz i3 पर एकल धागा) की तुलना में 75MFLOPS कर सकता है । यदि किसी के पास अच्छा फ्लोटिंग पॉइंट बेंचमार्क है तो .net कृपया उन्हें मेरे पास भेजें, क्योंकि मेरा वर्तमान परीक्षण बहुत अल्पविकसित है।
  • गोलाई में सुधार किया जा सकता है। वर्तमान में यह छोटा है, जो लगभग शून्य की ओर गोलाई से मेल खाता है।
  • यह अभी भी बहुत अधूरा है। वर्तमान में डिवीजन, कास्ट और जटिल गणित संचालन गायब हैं।

यदि कोई परीक्षण में योगदान देना चाहता है या कोड में सुधार करना चाहता है, तो बस मुझसे संपर्क करें, या जीथब पर एक अनुरोध जारी करें। https://github.com/CodesInChaos/SoftFloat

अनिश्चितता के अन्य स्रोत

.Net में अनिश्चितता के अन्य स्रोत भी हैं।

  • तत्वों पर पुनरावृति Dictionary<TKey,TValue>या HashSet<T>अपरिभाषित क्रम में तत्वों को लौटाता है।
  • object.GetHashCode() चलाने के लिए अलग है।
  • Randomवर्ग में निर्मित का कार्यान्वयन अनिर्दिष्ट है, अपने स्वयं के उपयोग करें।
  • भोली लॉकिंग के साथ मल्टीथ्रेडिंग के परिणामस्वरूप पुन: व्यवस्थित और भिन्न परिणाम होते हैं। धागे का सही उपयोग करने के लिए बहुत सावधान रहें।
  • जब WeakReferenceअपना लक्ष्य खो देते हैं तो अनिश्चितकालीन होता है क्योंकि जीसी किसी भी समय चल सकता है।

23

इस सवाल का जवाब आपके द्वारा पोस्ट किए गए लिंक से है। विशेष रूप से आपको गैस पावर्ड गेम्स के उद्धरण को पढ़ना चाहिए:

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

और फिर नीचे है कि यह एक है:

यदि आप रिप्ले को कंट्रोलर इनपुट के रूप में स्टोर करते हैं, तो उन्हें अलग-अलग सीपीयू आर्किटेक्चर, कंपाइलर या ऑप्टिमाइज़ेशन सेटिंग्स के साथ मशीनों पर वापस नहीं खेला जा सकता है। MotoGP में, इसका मतलब है कि हम Xbox और PC के बीच सहेजी गई रिप्ले साझा नहीं कर सकते।

एक नियतात्मक खेल केवल नियतात्मक होगा जब पहचान की गई संकलित फ़ाइलों का उपयोग करना और IEEE मानकों का पालन करने वाले सिस्टम पर चलना। क्रॉस प्लेटफ़ॉर्म सिंक्रनाइज़ नेटवर्क सिमुलेशन या रिप्ले संभव नहीं होगा।


2
जैसा कि मैंने उल्लेख किया है, मुझे मुख्य रूप से C # में दिलचस्पी है; चूँकि JIT वास्तविक संकलन करता है, इसलिए मैं यह गारंटी नहीं दे सकता कि यह "समान अनुकूलन सेटिंग्स के साथ संकलित" है जब एक ही मशीन पर एक ही निष्पादन योग्य चल रहा हो!
ब्लूराजा - डैनी पफ्लुघोटे

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

4
@ 3nixios इस तरह के सेटअप के साथ, गेम नियतात्मक नहीं है। केवल एक निश्चित टाइमस्टेप के साथ खेल नियतात्मक हो सकते हैं। जब आप एक मशीन पर एक सिमुलेशन वापस चल रहे हैं तो आप पहले से ही कुछ निर्धारित कर रहे हैं।
अटैकिंगहोबो

4
@ 3nixios, "मैं यह कह रहा था कि एक निश्चित टाइमस्टेप के साथ भी, कुछ भी सुनिश्चित नहीं करता है कि टाइमस्टेप हमेशा निश्चित रहेगा।" आप पूरी तरह से गलत हैं। एक निश्चित timestep की बात हमेशा अद्यतन करने में प्रत्येक के लिए एक ही टिक डेल्टा समय है
AttackingHobo

3
@ 3nixios एक निश्चित टाइमस्टेप का उपयोग करते हुए सुनिश्चित करता है कि टाइमपास निश्चित हो जाएगा क्योंकि हम डेवलपर्स अन्यथा अनुमति नहीं देते हैं। आप निश्चित समय चरण का उपयोग करते समय लैग की भरपाई कैसे की जानी चाहिए, इसका गलत अनुमान लगा रहे हैं। प्रत्येक गेम अपडेट को उसी अपडेट समय का उपयोग करना चाहिए ; इसलिए, जब एक सहकर्मी का कनेक्शन पिछड़ जाता है, तब भी उसे प्रत्येक व्यक्तिगत अपडेट की गणना करनी चाहिए जो वह चूक गया।
कीबलब्रोक्स

3

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


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

ठीक है, आपको "सभी क्लाइंट समान कोड चलाते हैं" परिदृश्य में भविष्यवाणी करने की आवश्यकता नहीं है। सर्वर की भूमिका केवल सिंक्रोनाइज़ेशन पर प्राधिकरण होना है।
नेवरमाइंड

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

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

3

संपादित करें: एक निश्चित बिंदु वर्ग का लिंक (क्रेता सावधान! - मैंने इसका उपयोग नहीं किया है ...)

आप हमेशा निश्चित बिंदु अंकगणित पर वापस आ सकते हैं । कोई (एक RTS बनाने, कम नहीं) पहले से ही पर पैर काम किया है stackoverflow

आप एक प्रदर्शन दंड का भुगतान करेंगे, लेकिन यह एक समस्या हो सकती है या नहीं भी हो सकती है, क्योंकि यह विशेष रूप से यहाँ पर प्रदर्शन करने वाला नहीं होगा क्योंकि यह सिमड निर्देशों का उपयोग नहीं करेगा। आकलन के लिये केंद्रीय बिंदु!

एनबी जाहिर तौर पर इंटेल में कोई व्यक्ति आपको सी # से इंटेल के प्रदर्शन प्राइमेटिव लाइब्रेरी का उपयोग करने की अनुमति देने के लिए एक समाधान है। यह धीमे प्रदर्शन के लिए क्षतिपूर्ति करने के लिए निश्चित बिंदु कोड को वेक्टर करने में मदद कर सकता है।


decimalउसके लिए भी ठीक काम करेगा; लेकिन, यह अभी भी उपयोग के रूप में एक ही समस्या है int- मैं इसके साथ कैसे ट्रिगर करूं?
ब्लूराजा - डैनी पफ्लुगुएफ्ट

1
सबसे आसान तरीका होगा लुकअप टेबल बनाना और एप्लिकेशन के साथ भेजना। यदि मूल्य एक समस्या है तो आप मूल्य के बीच अंतर कर सकते हैं।
ल्यूकएन

वैकल्पिक रूप से, आप काल्पनिक संख्याओं या चतुष्कोणों (यदि 3 डी) के साथ ट्रिगर कॉल को बदलने में सक्षम हो सकते हैं। यह एक उत्कृष्ट व्याख्या है
ल्यूक एनएल

इससे भी मदद मिल सकती है।
ल्यूकएन

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

3

मैंने कई बड़े खिताबों पर काम किया है।

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

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

ये प्लेटफ़ॉर्म अंतर सिलिकॉन में हैं, सॉफ़्टवेयर नहीं, इसलिए आपके प्रश्न का उत्तर देने के लिए C # प्रभावित है। फ़्यूज्ड मल्टीप्ल-ऐड (FMA) बनाम ADD + MUL जैसे निर्देश परिणाम को बदलते हैं क्योंकि यह दो बार के बजाय केवल एक बार आंतरिक रूप से गोल होता है। सी आपको सीपीयू को बाध्य करने के लिए और अधिक नियंत्रण प्रदान करता है जो आप मूल रूप से चीजों को "मानक" बनाने के लिए एफएमए जैसे ऑपरेशनों को छोड़कर चाहते हैं - लेकिन गति की कीमत पर। अंतर को सबसे अलग होने का खतरा लगता है। एक परियोजना पर, मुझे यह निर्धारित करने के लिए कि सीपीयू "सही" था, की तुलना के लिए मान प्राप्त करने के लिए एक 150 साल पुरानी एको टेबल की किताब खोदनी पड़ी। कई सीपीयू ट्रिगर कार्यों के लिए बहुपद सन्निकटन का उपयोग करते हैं लेकिन हमेशा एक ही गुणांक के साथ नहीं।

मेरी सिफारिश:

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

स्रोत इंजन के बारे में एक अच्छा लेख है जो सिंक के बारे में जाने का एक तरीका बताता है: https://developer.valvesoftware.com/wiki/Source_Multeps_Networking

याद रखें, यदि आप देर से जुड़ने में रुचि रखते हैं, तो आपको वैसे भी बुलेट और सिंक को काटने जाना होगा।


1

ध्यान दें कि मुझे मुख्य रूप से C # में दिलचस्पी है, जो कि जहां तक ​​मैं बता सकता हूं, इस संबंध में C ++ जैसी ही समस्याएं हैं।

हां, C # में C ++ जैसी ही समस्याएं हैं। लेकिन इसमें और भी बहुत कुछ है।

उदाहरण के लिए, शॉन हॉग्राव्स के इस कथन को लें:

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

यह सुनिश्चित करने के लिए "आसान पर्याप्त" है कि यह C ++ में होता है। में सी # , तथापि, कि एक बहुत से निपटने के लिए कठिन हो रहा है। यह जेआईटी के लिए धन्यवाद है।

यदि आपको लगता है कि दुभाषिया आपके कोड को एक बार व्याख्यायित करता है, तो क्या होगा, लेकिन तब यह दूसरी बार होगा? या हो सकता है कि यह किसी और की मशीन पर दो बार व्याख्या करता है, लेकिन उसके बाद जेआईटी है?

JIT नियतात्मक नहीं है, क्योंकि आपका इस पर बहुत कम नियंत्रण है। यह उन चीजों में से एक है जो आप सीएलआर का उपयोग करने के लिए देते हैं।

और अगर कोई व्यक्ति आपके खेल को चलाने के लिए .NET 4.0 का उपयोग कर रहा है, तो भगवान आपकी मदद करते हैं, जबकि कोई और मोनो सीएलआर (.NET पुस्तकालयों का उपयोग करके) का उपयोग कर रहा है। यहां तक ​​कि .NET 4.0 बनाम .NET 5.0 भी अलग हो सकता है। इस प्रकार की गारंटी देने के लिए आपको बस एक प्लेटफॉर्म के निम्न-स्तरीय विवरण पर अधिक नियंत्रण की आवश्यकता है।

आपको निश्चित-बिंदु गणित के साथ दूर जाने में सक्षम होना चाहिए। इसके बारे में बस इतना ही।


गणित के अलावा, अलग होने के लिए क्या उत्तरदायी है? संभवतया, "इनपुट" क्रियाओं को तर्कसंगत क्रियाओं के रूप में एक आरटीएस में भेजा जा रहा है। ईजी मूव यूनिट "ए" टू पोजीशन "बी"। मैं यादृच्छिक संख्या पीढ़ी के साथ एक समस्या देख सकता हूं, लेकिन यह स्पष्ट रूप से सिमुलेशन इनपुट के रूप में भी भेजा जाना चाहिए।
ल्यूकएन

@ ल्यूक: समस्या यह है कि शॉन की स्थिति दृढ़ता से बताती है कि संकलक अंतर का फ्लोटिंग-पॉइंट गणित पर वास्तविक प्रभाव हो सकता है। वह मुझसे ज्यादा जानता है; मैं बस उसकी चेतावनी को JIT और C # संकलन / व्याख्या के दायरे में निकाल रहा हूं।
निकोल बोलस ३३'११

सी # में ऑपरेटर ओवरलोडिंग है , और फिक्स्ड-पॉइंट गणित के लिए एक अंतर्निहित प्रकार भी है । हालाँकि, इसका उपयोग करने में समान समस्याएं हैं int- मैं इसके साथ कैसे ट्रिगर करूं?
ब्लूराजा - डैनी पफ्लुगुएफ्ट

1
> अगर आप दुभाषिया के कोड को एक बार व्याख्यायित करते हैं, तो आप क्या सोचते हैं कि क्या होगा, लेकिन फिर दूसरी बार JIT'd? या शायद यह> किसी और की मशीन पर दो बार इसकी व्याख्या करता है, लेकिन JIT के बाद> यह? 1. CLR कोड को हमेशा निष्पादन से पहले जिप किया जाता है। 2. .net बेशक तैरने के लिए IEEE 754 का उपयोग करता है। > JIT नियतात्मक नहीं है, क्योंकि आपका इस पर बहुत कम नियंत्रण है। आप निष्कर्ष झूठे गलत बयानों का काफी कमजोर कारण हैं। > और यदि कोई व्यक्ति आपके खेल को चलाने के लिए .NET 4.0 का उपयोग कर रहा है, तो भगवान आपकी मदद करता है,> जबकि कोई और मोनो सीएलआर का उपयोग कर रहा है (.NET लैब्स के> कोर्स का उपयोग करके)। यहां तक ​​कि .NET
रोमननकोव एंड्री

@ रोमेनकोव: "आप निष्कर्ष गलत झूठे बयानों का काफी कमजोर कारण हैं।" कृपया, मुझे बताएं कि कौन से कथन गलत हैं और क्यों, ताकि उन्हें सही किया जा सके।
निकोल बोलस

1

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

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


0

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

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

हालांकि सिंक्रनाइज़ेशन कुंजी है।


-2

आप उन्हें निर्धारक बनाते हैं। एक महान उदाहरण के लिए, कालकोठरी घेराबंदी जीडीसी प्रस्तुति को देखें कि कैसे उन्होंने विश्व में स्थान बनाए।

यह भी याद रखें कि निर्धारणवाद 'यादृच्छिक' घटनाओं पर भी लागू होता है!


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