ভাসমান-বিন্দু অ-নির্ধারণবাদের মুখে কীভাবে নির্বিচারবাদী গেমগুলি সম্ভব?


52

আরটিএস নেটওয়ার্কের মতো একটি গেমটি তৈরি করতে, আমি এখানে বেশ কয়েকটি উত্তর দেখেছি যে গেমটি সম্পূর্ণ নির্মূল করার পরামর্শ দেয়; তারপরে আপনাকে কেবল ব্যবহারকারীদের ক্রিয়া একে অপরের কাছে স্থানান্তর করতে হবে এবং পরের ফ্রেমটি রেন্ডার হওয়ার আগে প্রত্যেকের ইনপুট "লক ইন" করতে কিছুটা পিছিয়ে থাকতে হবে la তারপরে ইউনিটের অবস্থান, স্বাস্থ্য ইত্যাদির মতো জিনিসগুলিকে নেটওয়ার্কের মাধ্যমে ক্রমাগত আপডেট করার প্রয়োজন হয় না, কারণ প্রতিটি খেলোয়াড়ের সিমুলেশন হুবহু একই রকম হবে। আমি পুনরায় পুনর্নির্মাণের জন্য প্রস্তাবিত একই জিনিসটি শুনেছি।

যাইহোক, যেহেতু ভাসমান-পয়েন্ট গণনাগুলি মেশিনগুলির মধ্যে বা একই মেশিনে একই প্রোগ্রামের বিভিন্ন সংকলনের মধ্যে অ-নির্ধারক , তাই কি এটি করা সত্যিই সম্ভব? আমরা কীভাবে সেই খেলাকে (বা পুনরায় সঞ্চালনকারী) খেলাগুলির মধ্যে ছোট পার্থক্য সৃষ্টি করতে বাধা দিতে পারি যা পুরো খেলা জুড়েই ? েউ ফেলা হয় ?

আমি শুনেছি কিছু লোক পুরোপুরি ভাসমান-পয়েন্ট সংখ্যা এড়ানো এবং intভগ্নাংশের ভাগফলকে উপস্থাপন করার জন্য ব্যবহার করার পরামর্শ দিচ্ছেন, তবে এটি আমার কাছে ব্যবহারিক মনে হয় না - উদাহরণস্বরূপ, যদি আমি একটি কোণের কোসাইন নেওয়ার প্রয়োজন হয় তবে কী হবে? আমার কি পুরো গাণিতিক গ্রন্থাগারটি নতুন করে লিখতে হবে?

নোট করুন যে আমি মূলত সি # তে আগ্রহী, যা আমি যতদূর বলতে পারি, এই বিষয়ে সি ++ এর মতো একই সমস্যা রয়েছে।


5
এটি আপনার প্রশ্নের উত্তর নয়, তবে আরটিএস নেটওয়ার্কিং সমস্যাটি সমাধান করার জন্য আমি মাঝে মাঝে ইউনিট পজিশন এবং স্বাস্থ্য সমন্বয় করার পরামর্শ দিচ্ছি যাতে কোনও প্রবাহের সংশোধন করতে পারে। ঠিক কী তথ্য সিঙ্ক করতে হবে তা নির্ভর করবে গেমের উপর; আপনি স্ট্যাটাস এফেক্টের মতো জিনিসগুলি সিঙ্ক আপ করতে বিরক্ত না করে ব্যান্ডউইথের ব্যবহারটি অনুকূল করতে পারেন।
12:44 এ ঝাঁকুনি দেওয়া

@ ঝক্কিং তবুও এটি সম্ভবত সেরা উত্তর।
জোনাথন কনেল

স্টারক্রাফ্ট II ইনফ্যাক্টি ঠিক ঠিক প্রতিটি সময় সিঙ্ক করে, আমি প্রতিটি কম্পিউটারের সাথে আমার কম্পিউটারের সাথে গেমপ্লে রিপ্লেটি দেখেছিলাম এবং সেখানে পার্থক্য (এছাড়াও তাৎপর্যপূর্ণ) বিশেষত উচ্চ ল্যাগ (1 সেকেন্ড) এর সাথে। আমার কিছু ইউনিট ছিল যেখানে আমার স্ক্রিনে
ares

উত্তর:


15

ভাসমান-পয়েন্টগুলি নির্বিচারক?

কয়েক বছর আগে যখন আমি আপনার মতো একই লকস্টেপ আর্কিটেকচারটি ব্যবহার করে আরটিএস লিখতে চেয়েছিলাম তখন আমি এই ইস্যুতে প্রচুর পঠন করেছি।

হার্ডওয়্যার ভাসমান-পয়েন্ট সম্পর্কে আমার সিদ্ধান্তগুলি হ'ল:

  • আপনি যদি ভাসমান পয়েন্টের পতাকা এবং সংকলক সেটিংসের বিষয়ে সতর্ক হন তবে একই দেশীয় অ্যাসেমব্লিং কোডটি সম্ভবত নির্ধারক deter
  • একটি ওপেন সোর্স আরটিএস প্রকল্প দাবি করেছিল যে তারা একটি মোড়ক লাইব্রেরি ব্যবহার করে বিভিন্ন সংকলক জুড়ে ডিটারমিনিস্টিক সি / সি ++ সংকলন পেয়েছে। আমি সেই দাবিটি যাচাই করিনি। (আমি যদি সঠিকভাবে স্মরণ করি তবে এটি STREFLOPগ্রন্থাগারটি সম্পর্কে ছিল )
  • .NET JIT কে বেশ কিছুটা দূরে যাওয়ার অনুমতি দেওয়া হয়েছে। বিশেষত এটি প্রয়োজনের চেয়ে উচ্চতর নির্ভুলতা ব্যবহারের অনুমতিপ্রাপ্ত। এছাড়াও এটি x86 এবং এএমডি 64 এ বিভিন্ন নির্দেশাবলী সেট ব্যবহার করে (আমি মনে করি যে x86 এর উপর এটি x87 ব্যবহার করে, এএমডি 64 এটি কিছু এসএসই নির্দেশাবলীর ব্যবহার করে যার আচরণটি ডেনরমের জন্য পৃথক)।
  • জটিল নির্দেশাবলী (ত্রিকোণমিত্রিক ফাংশন, এক্সফোনেন্টালস, লগারিদম সহ) বিশেষত সমস্যাযুক্ত।

আমি উপসংহারে পৌঁছেছি যে। নেট নির্বিচারে ফ্লোটিং পয়েন্ট ধরণে বিল্টটি ব্যবহার করা অসম্ভব।

সম্ভাব্য ওয়ারকআরউন্ডস

এইভাবে আমার কাজের সীমা দরকার। আমি ভেবেছিলাম:

  1. FixedPoint32সি # তে প্রয়োগ করুন । যদিও এটি খুব কঠিন নয় (আমার অর্ধেক সমাপ্তি বাস্তবায়ন হয়েছে) মানগুলির খুব অল্প পরিসীমা এটিকে ব্যবহার করতে বিরক্তিকর করে তোলে। আপনাকে সর্বদা সতর্কতা অবলম্বন করতে হবে যাতে আপনি না উপচে পড়ে যান, না খুব বেশি নির্ভুলতা হারাবেন। শেষ পর্যন্ত আমি সরাসরি পূর্ণসংখ্যার ব্যবহারের চেয়ে সহজ এটি দেখতে পেলাম।
  2. FixedPoint64সি # তে প্রয়োগ করুন । আমি এটি করতে চেয়ে বরং কঠিন পেয়েছি। কিছু ক্রিয়াকলাপের জন্য 128 বিটের মধ্যবর্তী পূর্ণসংখ্যা কার্যকর হবে। কিন্তু। নেট এই ধরণের প্রস্তাব দেয় না।
  3. একটি প্ল্যাটফর্মে ডিস্ট্রিমেন্টিক এমন গণিত ক্রিয়াকলাপের জন্য নেটিভ কোড ব্যবহার করুন। প্রতিটি গণিতের অপারেশনে ডেলিগেট কলের ওভারহেড অন্তর্ভুক্ত। ক্রস প্ল্যাটফর্ম চালানোর ক্ষমতা হারায়।
  4. ব্যবহার Decimal। তবে এটি ধীর গতির, প্রচুর স্মৃতি গ্রহণ করে এবং সহজেই ব্যতিক্রম ছোঁড়ে (0 দ্বারা বিভাজন, ওভারফ্লো)। এটি আর্থিক ব্যবহারের জন্য খুব সুন্দর তবে গেমসের জন্য উপযুক্ত নয়।
  5. একটি কাস্টম 32 বিট ভাসমান-পয়েন্ট কার্যকর করুন। প্রথমে কঠিন মনে হয়েছিল। বিটস্ক্যানরাইভার্স অন্তর্নিহিতের অভাব যখন এটি প্রয়োগ করা হয় তখন কয়েকটি বিরক্তির কারণ হয়।

আমার সফটফ্লোট

স্ট্যাকওভারফ্লোতে আপনার পোস্ট থেকে অনুপ্রাণিত হয়ে , আমি এখনই সফ্টওয়্যারটিতে 32 বিট ফ্লোটিং-পয়েন্ট টাইপ প্রয়োগ করা শুরু করেছি এবং ফলাফল আশাব্যঞ্জক।

  • মেমরি উপস্থাপনা আইইইই ফ্লোটের সাথে বাইনারি সামঞ্জস্যপূর্ণ, তাই গ্রাফিক্স কোডে আউটপুট দেওয়ার সময় আমি কাস্ট পুনরায় ব্যাখ্যা করতে পারি।
  • এটি সাব-নরমস, ইনফিনিটিস এবং এনএএনএস সমর্থন করে।
  • সঠিক ফলাফল আইইইই ফলাফলের মতো নয়, তবে এটি সাধারণত গেমগুলির জন্য গুরুত্বপূর্ণ নয় matter এই ধরণের কোডে এটি কেবল গুরুত্বপূর্ণ যে ফলাফলটি সমস্ত ব্যবহারকারীর জন্য একই, এটি শেষ অঙ্কের ক্ষেত্রে সঠিক নয়।
  • পারফরম্যান্স শালীন। একটি তুচ্ছ পরীক্ষা দেখিয়েছে যে এটি floatসংযোজন / গুণনের জন্য 220-260MFLOPS এর তুলনায় প্রায় 75MFLOPS করতে পারে (একটি 2.66GHz i3 এর একক থ্রেড)। কারও কাছে। নেট এর জন্য ভাল ফ্লোটিং পয়েন্ট বেঞ্চমার্কস থাকলে দয়া করে সেগুলি আমার কাছে প্রেরণ করুন, যেহেতু আমার বর্তমান পরীক্ষাটি অত্যন্ত প্রাথমিক।
  • রাউন্ডিং উন্নত করা যেতে পারে। বর্তমানে এটি কেটে যায়, যা প্রায় শূন্যের দিকে গোল করার সাথে মিল করে।
  • এটি এখনও খুব অসম্পূর্ণ। বর্তমানে বিভাগ, কাস্ট এবং জটিল গণিত ক্রিয়াকলাপ অনুপস্থিত।

যদি কেউ পরীক্ষার অবদান রাখতে বা কোডটি উন্নত করতে চায় তবে কেবল আমার সাথে যোগাযোগ করুন, বা গিথুব এ একটি টান অনুরোধ জারি করুন। https://github.com/CodesInChaos/SoftFloat

অনির্দিষ্টত্বের অন্যান্য উত্স

। নেট-এ অন্যান্য অনির্দিষ্টকালের উত্সও রয়েছে।

  • একটির উপর পুনরাবৃত্তি Dictionary<TKey,TValue>বা HashSet<T>উপাদানগুলি একটি অনির্ধারিত ক্রমে প্রদান করে।
  • object.GetHashCode() রান থেকে রান পৃথক।
  • অন্তর্নির্মিত Randomশ্রেণিতে বাস্তবায়ন অনির্দিষ্ট, আপনার নিজের ব্যবহার করুন।
  • নিষ্পাপ লকিংয়ের সাথে মাল্টিথ্রেডিংয়ের ফলে পুনরায় ক্রম এবং ভিন্ন ফলাফল হয়। থ্রেডগুলি সঠিকভাবে ব্যবহার করতে খুব সাবধান হন।
  • WeakReferenceগুলি হারাতে গেলে তাদের লক্ষ্য নির্বিচারবাদী হয় কারণ জিসি যে কোনও সময় চলতে পারে।

23

এই প্রশ্নের উত্তরটি আপনার পোস্ট করা লিঙ্ক থেকে। বিশেষত আপনার গ্যাস চালিত গেমসের উদ্ধৃতিটি পড়তে হবে:

আমি গ্যাস চালিত গেমগুলিতে কাজ করি এবং আমি আপনাকে প্রথম হাত বলতে পারি যে ভাসমান পয়েন্ট গণিতটি হ'ল ডিস্ট্রিমেন্টিক। আপনার কেবল একই নির্দেশ সেট এবং সংকলক প্রয়োজন এবং অবশ্যই ব্যবহারকারীর প্রসেসর আইইইই 754 মানকে অনুসরণ করে, এতে আমাদের পিসি এবং 360 গ্রাহকরা সবাই অন্তর্ভুক্ত। ডেমিগড, সুপ্রিম কমান্ডার 1 এবং 2 চালিত ইঞ্জিনটি আইইইই 754 স্ট্যান্ডার্ডের উপর নির্ভর করে। সম্ভবত বাজারে পিয়ার টু পিয়ারের সমস্ত আরটিএসের উল্লেখ না করা।

এবং তারপরে একটি নীচে এটি:

আপনি যদি নিয়ামক ইনপুট হিসাবে রিপ্লে সংরক্ষণ করেন তবে সেগুলি বিভিন্ন সিপিইউ আর্কিটেকচার, সংকলক, বা অপ্টিমাইজেশন সেটিংস সহ মেশিনে খেলানো যাবে না। মোটোজিপিতে, এর অর্থ আমরা এক্সবক্স এবং পিসির মধ্যে সংরক্ষিত রিপ্লেগুলি ভাগ করতে পারিনি।

আইটিইই স্ট্যান্ডার্ডগুলিকে মেনে চলার অনুরূপ সংকলিত ফাইলগুলি ব্যবহার করে এবং সিস্টেমে চালিত হওয়ার সময় একটি ডিস্ট্রিমেন্টিক গেমটি কেবলমাত্র ডিস্ট্রিমেন্টিক হবে। ক্রস প্ল্যাটফর্ম সিঙ্ক্রোনাইজ করা নেটওয়ার্ক সিমুলেশন বা পুনরায় প্রদর্শন সম্ভব হবে না।


2
যেমনটি আমি উল্লেখ করেছি, আমি প্রাথমিকভাবে সি # তে আগ্রহী; যেহেতু জেআইটি প্রকৃত সংকলন করে, আমি একই গ্যারান্টি দিতে পারি না যে একই মেশিনে একই এক্সিকিউটেবল চলার সময়ও এটি "একই অপটিমাইজেশন সেটিংসের সাথে সংকলিত হয়েছে" !
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

2
কখনও কখনও এফপিইউতে রাউন্ডিং মোডটি আলাদাভাবে সেট করা হয়, কিছু স্থাপত্যে fpu গণনার জন্য একটি বৃহত্তর-নির্ভুল অভ্যন্তরীণ রেজিস্টার থাকে ... যখন আইইইই 754 এফপি অপারেশনগুলি যেভাবে কাজ করা উচিত তার সাথে সামঞ্জস্য করে না, এটি করে না ' কোন নির্দিষ্ট গাণিতিক ফাংশন কীভাবে প্রয়োগ করা উচিত তা নির্দিষ্ট করে না, যা স্থাপত্যের পার্থক্যগুলি প্রকাশ করতে পারে।
স্টিফেন

4
@ 3nixios এই ধরণের সেটআপের সাথে, খেলাটি নির্বিচারবাদী নয়। শুধুমাত্র একটি নির্দিষ্ট টাইমস্টেপযুক্ত গেমগুলি ডিস্ট্রিমেন্টিক করতে পারে। আপনি কোনও একটি মেশিনে সিমুলেশন পিছনে চলার সময় ইতিমধ্যে কিছু বিতর্ক করছেন নিরঙ্কুশ নয়।
অ্যাটাকিংহোব

4
@ 3nixios, "আমি উল্লেখ করেছিলাম যে একটি নির্দিষ্ট টাইমস্টেপ থাকলেও কিছুই নিশ্চিত করে না যে টাইমস্টেপ সর্বদা স্থির থাকবে" " আপনি সম্পূর্ণ ভুল। একটি স্থির টাইমস্টেপের মূল বিষয় হ'ল আপডেটের ক্ষেত্রে প্রতিটি টিকের জন্য সর্বদা একই বদ্বীপ সময় থাকা উচিত
অ্যাটাকিংহোব

3
@ 3nixios একটি নির্দিষ্ট টাইমস্টেপ ব্যবহার করে টাইমস্টেপ ঠিক করা হবে তা নিশ্চিত করে কারণ আমরা বিকাশকারীরা অন্যথায় অনুমতি দেয় না। আপনি একটি ভুল সময় ব্যাখ্যা করছেন যে একটি নির্দিষ্ট সময় পদক্ষেপটি ব্যবহার করার সময় কীভাবে পিছিয়ে পড়তে হবে। প্রতিটি গেম আপডেটে একই আপডেট সময় ব্যবহার করতে হবে ; অতএব, যখন কোনও পিয়ারের সংযোগটি পিছিয়ে যায় তখনও এটি অবশ্যই পৃথক আপডেটগুলি যে এটি মিস করেছে তা গণনা করতে হবে।
কেবেলব্রক্স

3

নির্দিষ্ট পয়েন্ট গণিত ব্যবহার করুন। অথবা কোনও অনুমোদনযোগ্য সার্ভার চয়ন করুন এবং এটি একবারে গেমের অবস্থা সিঙ্ক করুন - এমএমআরটিএস এটিই করে। (কমপক্ষে, যুদ্ধের উপাদানসমূহ এ জাতীয়ভাবে কাজ করে It's এটি সি # তেও লেখা আছে)) ত্রুটিগুলি এইভাবে জমে থাকার সুযোগ পায় না।


হ্যাঁ, আমি এটিকে ক্লায়েন্ট-সার্ভার হিসাবে তৈরি করতে এবং ক্লায়েন্ট-পার্শ্বের পূর্বাভাস এবং এক্সট্রাপোলেশনের মাথাব্যথা মোকাবেলা করতে পারি। এই প্রশ্নটি পিয়ার-টু-পিয়ার আর্কিটেকচার সম্পর্কে, যা সহজ বলে মনে করা হচ্ছে ...
ব্লুরাজা - ড্যানি ফ্লুঘুফুট

ঠিক আছে, "একটি সমস্ত কোড একই কোড চালায়" দৃশ্যে আপনার ভবিষ্যদ্বাণী করার দরকার নেই need সার্ভারের ভূমিকাটি কেবল সিঙ্ক্রোনাইজেশনের উপর কর্তৃত্ব হওয়া উচিত।
কিছু মনে রাখবেন না

সার্ভার / ক্লায়েন্ট একটি নেটওয়ার্ক গেম তৈরি করার একমাত্র পদ্ধতি। আরেকটি জনপ্রিয় পদ্ধতি (বিশেষত যেমন। আরটিএস গেম, ক & C অথবা Starcraft মত জন্য) পিয়ার টু পিয়ার, যা সেখানে হয় কোন প্রামাণিক সার্ভার। এটি সম্ভব হওয়ার জন্য, সমস্ত গণনা অবশ্যই সম্পূর্ণ ক্লায়েন্ট জুড়ে নির্বিচারে এবং সামঞ্জস্যপূর্ণ - তাই আমার প্রশ্ন।
ব্লুরাজা - ড্যানি পিফ্লুঘিওফট

ভাল এটি আপনার পছন্দ মতো নয় যে কোনও সার্ভার / উন্নত ক্লায়েন্ট সহ গেমটি কঠোরভাবে পি 2 পি করুন। আপনার যদি একেবারে করতে হয়, তবে - তবে নির্দিষ্ট পয়েন্ট ব্যবহার করুন।
কিছু মনে রাখবেন না

3

সম্পাদনা করুন: একটি নির্দিষ্ট পয়েন্ট শ্রেণীর একটি লিঙ্ক (ক্রেতা সাবধান! - আমি এটি ব্যবহার করি নি ...)

আপনি সবসময় স্থির পয়েন্ট পাটিগণিতের পিছনে পড়তে পারেন । কেউ (একটি আরটি তৈরি, কম নয়) ইতিমধ্যে স্ট্যাকওভারফ্লোতে পায়ের কাজ শেষ করেছেন ।

আপনি একটি পারফরম্যান্স জরিমানা প্রদান করবেন, তবে এটি সমস্যা বা নাও হতে পারে, কারণ নেট এখানে বিশেষত পারফরম্যান্ট হবে না কারণ এটি সিমড নির্দেশাবলী ব্যবহার করবে না। মাপকাঠি!

এনবি স্পষ্টতই ইন্টেল- এ থাকা কারও কাছে এমন সমাধান রয়েছে যা আপনাকে সি # থেকে ইন্টেল পারফরম্যান্স আদিম লাইব্রেরি ব্যবহার করতে দেয় to এটি ধীর পারফরম্যান্সের জন্য ক্ষতিপূরণ দিতে স্থির পয়েন্ট কোড ভেক্টরাইজিংয়ে সহায়তা করতে পারে।


decimalতার জন্য ভাল কাজ করবে; তবে, এটির এখনও ব্যবহারের মতো একই সমস্যা রয়েছে int- এটির সাথে আমি কীভাবে ট্রিগ করব?
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

1
সবচেয়ে সহজ উপায় হ'ল একটি দেখার টেবিল তৈরি করা এবং অ্যাপ্লিকেশনের পাশাপাশি এটি প্রেরণ করা। নির্ভুলতা যদি সমস্যা হয় তবে আপনি মানটির মধ্যে বিভক্ত করতে পারেন।
লুকএন

বিকল্পভাবে, আপনি কল্পিত নম্বর বা কোয়ার্টেরিয়নের (3 ডি থাকলে) ট্রিগ কলগুলি প্রতিস্থাপন করতে সক্ষম হতে পারেন। এটি একটি দুর্দান্ত ব্যাখ্যা
লুকন

এই এছাড়াও সাহায্য করতে পারে।
লুকএন

আমি যে সংস্থার জন্য কাজ করতাম, আমরা ফিক্স পয়েন্ট গণিত ব্যবহার করে একটি আল্ট্রাসাউন্ড মেশিন তৈরি করেছিলাম, সুতরাং এটি অবশ্যই আপনার জন্য কাজ করবে।
লুকএন

3

আমি বেশ কয়েকটি বড় শিরোনামে কাজ করেছি।

সংক্ষিপ্ত উত্তর: আপনি যদি কঠোরভাবে কঠোর হন তবে এটি সম্ভবত উপযুক্ত নয় তবে এটি সম্ভব। আপনি যদি স্থির আর্কিটেকচারে না পড়েন (পড়ুন: কনসোল) এটি চতুর, ভঙ্গুর এবং দেরিতে যোগদানের মতো গৌণ সমস্যাগুলির হোস্ট সহ আসে না।

যদি আপনি উল্লিখিত কয়েকটি নিবন্ধ পড়ে থাকেন তবে আপনি নোট করবেন যে আপনি সিপিইউ মোড সেট করতে গিয়ে এমন উদ্ভট ঘটনা রয়েছে যেমন কোনও মুদ্রক ড্রাইভার সিপিইউ মোড পরিবর্তন করে কারণ এটি একই ঠিকানার জায়গাতেই ছিল। আমার একটি কেস হয়েছে যেখানে কোনও অ্যাপ্লিকেশনটি কোনও বাহ্যিক ডিভাইসে ফ্রেম-লক করা ছিল, তবে একটি ত্রুটিযুক্ত উপাদান সিপিইউকে উত্তাপের কারণে গলা ফাটাতে এবং সকালে এবং বিকেলে বিভিন্নভাবে রিপোর্ট করে, লাঞ্চের পরে এটি কার্যকরভাবে একটি আলাদা মেশিন তৈরি করে।

এই প্ল্যাটফর্মের পার্থক্যগুলি সিলিকনে রয়েছে, সফ্টওয়্যার নয়, তাই আপনার প্রশ্নের উত্তর দিতে সি #ও প্রভাবিত। ফিউজড মাল্টিপল-অ্যাড (এফএমএ) বনাম এডিডি + এমএলও-র মতো নির্দেশাবলী ফলাফল পরিবর্তন করে কারণ এটি অভ্যন্তরীণভাবে দু'বার পরিবর্তে একবারে গোল হয়। সি আপনাকে CPU- র মত কাজগুলিকে "স্ট্যান্ডার্ড" তৈরি করতে মূলত বাদ দিয়ে মূলত যা করতে বাধ্য করতে আরও নিয়ন্ত্রণ দেয় - তবে গতির ব্যয়ে। অন্তর্নির্ভরগুলি পৃথক হওয়ার ক্ষেত্রে সবচেয়ে প্রবণ বলে মনে হয়। কোন প্রকল্পে আমাকে সিপিইউ "সঠিক" ছিল তা নির্ধারণের জন্য মান পেতে একোস টেবিলগুলির 150 বছরের পুরানো বইটি খনন করতে হয়েছিল। অনেক সিপিইউ ট্রিগ ফাংশনগুলির জন্য বহুবচনীয় অনুমানগুলি ব্যবহার করে তবে সর্বদা একই সহগের সাথে হয় না।

আমার সুপারিশ:

আপনি পূর্ণসংখ্যার লক-স্টেপ বা সিঙ্কে যান না কেন, উপস্থাপনা থেকে মূল গেম মেকানিক্সকে আলাদাভাবে পরিচালনা করুন। গেমটি নির্ভুলভাবে খেলুন, তবে উপস্থাপনা স্তরটিতে নির্ভুলতার বিষয়ে চিন্তা করবেন না। এছাড়াও মনে রাখবেন আপনার একই নেটওয়ার্ক ফ্রেমের হারে সমস্ত নেটওয়ার্ক ওয়ার্ল্ড ডেটা প্রেরণের দরকার নেই। আপনি আপনার বার্তাগুলিকে অগ্রাধিকার দিতে পারেন। যদি আপনার সিমুলেশনটি 99.999% এর সাথে মিলে যায় তবে আপনাকে জুটিবদ্ধ থাকার জন্য প্রায়শই সংক্রমণের প্রয়োজন হবে না। (ঠকানো প্রতিরোধ একদিকে।)

সোর্স ইঞ্জিন সম্পর্কে একটি দুর্দান্ত নিবন্ধ রয়েছে যা সিঙ্ক সম্পর্কে একটি উপায় ব্যাখ্যা করে: https://developer.valvesoftware.com/wiki/Source_M মাল্টিপ্লেয়ার_ নেটওয়ার্কিং

মনে রাখবেন, আপনি যদি দেরিতে যোগদান করতে আগ্রহী হন তবে আপনাকে বুলেটটি কামড়তে হবে এবং যে কোনও উপায়ে সিঙ্ক করতে হবে।


1

নোট করুন যে আমি মূলত সি # তে আগ্রহী, যা আমি যতদূর বলতে পারি, এই বিষয়ে সি ++ এর মতো একই সমস্যা রয়েছে।

হ্যাঁ, সি # এর সি ++ এর মতোই সমস্যা রয়েছে। তবে এর আরও অনেক কিছু রয়েছে।

উদাহরণস্বরূপ, শন হাগ্রগ্রেসের কাছ থেকে এই বিবৃতিটি নিন:

আপনি যদি নিয়ামক ইনপুট হিসাবে রিপ্লে সংরক্ষণ করেন তবে সেগুলি বিভিন্ন সিপিইউ আর্কিটেকচার, সংকলক, বা অপ্টিমাইজেশন সেটিংস সহ মেশিনে খেলানো যাবে না।

এটি C ++ এ ঘটে তা নিশ্চিত করার পক্ষে "যথেষ্ট সহজ"। ইন সি # , তবে, যে অনেক সঙ্গে মোকাবিলা করার জন্য কঠিন হতে যাচ্ছে। এটি JIT এর জন্য ধন্যবাদ।

আপনি যদি মনে করেন যে দোভাষী যদি আপনার কোডটি একবার ব্যাখ্যা করে দৌড়ে যায় তবে কী হবে? অথবা এটি অন্য কারও মেশিনে এটি দু'বার ব্যাখ্যা করে, কিন্তু এর পরে জেআইটি এর কি?

জেআইটি হতাশাবোধমূলক নয়, কারণ এটির উপরে আপনার খুব কম নিয়ন্ত্রণ রয়েছে। এটি সিএলআর ব্যবহার করতে আপনি যে জিনিস ছেড়ে দেন তার মধ্যে একটি।

আপনার গেমটি চালানোর জন্য যদি কোনও ব্যক্তি .NET 4.0 ব্যবহার করে থাকে তবে Godশ্বর আপনাকে সাহায্য করুন, অন্য কেউ মনো সিএলআর ব্যবহার করছে (অবশ্যই নেট নেট লাইব্রেরি ব্যবহার করছে)। এমনকি। নেট 4.0 বনাম। নেট 5.0 আলাদা হতে পারে। এই ধরণের জিনিসটির গ্যারান্টি দেওয়ার জন্য আপনার প্ল্যাটফর্মের নিম্ন-স্তরের বিশদের উপর আরও নিয়ন্ত্রণের প্রয়োজন ।

আপনার অবশ্যই স্থির-পয়েন্ট গণিত নিয়ে সরে যেতে সক্ষম হওয়া উচিত। কিন্তু এটি সম্পর্কে।


গণিতকে বাদ দিলে, আলাদা হওয়ার জন্য আর কী দায়বদ্ধ? সম্ভবত, "ইনপুট" ক্রিয়াগুলি আরটিএসে যৌক্তিক ক্রিয়া হিসাবে প্রেরণ করা হচ্ছে। উদাহরণস্বরূপ ইউনিট "ক" অবস্থানে "বি" স্থানান্তর করুন। আমি এলোমেলো সংখ্যা জেনারেশনে সমস্যা দেখতে পাচ্ছি, তবে এটি অবশ্যই একটি সিমুলেশন ইনপুট হিসাবে প্রেরণ করা দরকার।
লুকএন

@ লুকেন: সমস্যাটি হ'ল শানের অবস্থান দৃ .়ভাবে প্রস্তাব দেয় যে সংকলক পার্থক্যগুলি ভাসমান-পয়েন্ট গণিতে সত্যিকারের প্রভাব ফেলতে পারে। আমার চেয়ে তিনি আরও জানতেন; আমি কেবল তার সতর্কতা জেআইটি এবং সি # সংকলন / ব্যাখ্যার ক্ষেত্রের বাইরে বের করে দিচ্ছি।
নিকল বোলাস

সি # এর অপারেটর ওভারলোডিং রয়েছে এবং ফিক্স-পয়েন্ট গণিতের জন্য বিল্ট-ইন টাইপও রয়েছে। তবে এটির ব্যবহারের মতো একই সমস্যা রয়েছে int- এটির সাথে আমি কীভাবে ট্রিগ করব?
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

1
> আপনি কী মনে করেন যে দোভাষী যদি আপনার কোড> দোহাই দিয়ে দিতেন তবে কি হবে তবে দ্বিতীয়বার এটি জেআইটি'র হবে না? অথবা হতে পারে> এটি অন্য কারও মেশিনে দু'বার ব্যাখ্যা করে, কিন্তু এর পরে জেআইটি এর>? 1. সিএলআর কোড কার্যকর করার আগে সর্বদা jitted হয়। 2. নেট অবশ্যই ফ্লোটগুলির জন্য আইইইই 754 ব্যবহার করে। > জেআইটি হতাশাবোধমূলক নয়, কারণ এটির উপরে আপনার খুব কম নিয়ন্ত্রণ রয়েছে। আপনার উপসংহারটি মিথ্যা মিথ্যা বক্তব্যগুলির বেশ দুর্বল কারণ। > এবং একজন ব্যক্তি আপনার গেমটি চালানোর জন্য .NET 4.0 ব্যবহার করছে, এবং অন্য কেউ মনো সিএলআর ব্যবহার করছে (>। কোর্সের নেট নেট লাইব্রেরি ব্যবহার করছে) তবে youশ্বর আপনাকে সাহায্য করুন। এমনকি। নেট
রোমানেনকোভ আন্দ্রে

@ রোমানেনকোভ: "আপনারা উপসংহারটি মিথ্যা মিথ্যা বক্তব্যের যথেষ্ট দুর্বল কারণ" " দয়া করে আমাকে বলুন কোন বিবৃতিগুলি মিথ্যা এবং কেন, যাতে সেগুলি সংশোধন করা যায়।
নিকোল বোলাস

1

আমি এই উত্তরটি লেখার পরে বুঝতে পেরেছিলাম যে এটি আসলে প্রশ্নের উত্তর দেয় না, যা বিশেষত ভাসমান-বিন্দু অবিচ্ছিন্নতাবাদ সম্পর্কে ছিল। তবে তিনি যদি এই পদ্ধতিতে কোনও নেটওয়ার্ক গেম তৈরি করতে চলে যান তবে এটি তার পক্ষে সহায়ক।

আপনি সমস্ত খেলোয়াড়ের কাছে যে ইনপুট ভাগ করে নিচ্ছেন তা বরাবর, গুরুত্বপূর্ণ গেমের অবস্থা যেমন প্লেয়ার পজিশন, স্বাস্থ্য ইত্যাদির চেকসাম তৈরি করা এবং সম্প্রচার করা খুব কার্যকর হতে পারে ইনপুট প্রক্রিয়াকরণের সময়, জোর দিয়ে নিন যে গেমের রাজ্যের চেকসামগুলি সমস্ত দূরবর্তী খেলোয়াড় সিঙ্কে রয়েছে। আপনার সিঙ্কের বাইরে যাওয়ার (OOS) বাগগুলি ঠিক করার গ্যারান্টি রয়েছে এবং এটি আরও সহজ করে তুলবে - আপনার একটি পূর্ববর্তী বিজ্ঞপ্তি হবে যে কিছু ভুল হয়েছে (যা আপনাকে পুনরুত্পাদন পদক্ষেপগুলি সনাক্ত করতে সহায়তা করবে), এবং আপনি আরও যুক্ত করতে সক্ষম হবেন সন্দেহজনক কোডে গেম স্টেট লগইন করা যা আপনাকে ওওসের কারণ হিসাবে ঘটছে তা ব্র্যাকেট করার অনুমতি দেয়।


0

আমি মনে করি যে ব্লগের সাথে লিঙ্ক করা ধারণাটি এখনও কার্যকর হওয়ার জন্য পর্যায়ক্রমিক সিঙ্ক্রোনাইজেশন প্রয়োজন - আমি নেটওয়র্কযুক্ত আরটিএস গেমগুলিতে পর্যাপ্ত বাগ দেখতে পেয়েছি যা এ পদ্ধতি গ্রহণ করে না।

নেটওয়ার্কগুলি ক্ষতিকারক, ধীর, বিলম্বিত এবং আপনার ডেটা দূষিত করতে পারে। "ফ্লোটিং পয়েন্ট নির্ধারণবাদ", (যা আমাকে সন্দেহবাদী করার পক্ষে যথেষ্ট শব্দ বলে মনে হচ্ছে) বাস্তবে আপনার উদ্বেগের মধ্যে সবচেয়ে কম ... esp আপনি যদি একটি নির্দিষ্ট সময়ের পদক্ষেপ ব্যবহার করেন। পরিবর্তনশীল সময়ের পদক্ষেপগুলির সাথে আপনাকে নির্ধারিত সমস্যাগুলি এড়াতে নির্দিষ্ট সময় ধাপগুলির মধ্যে বিভক্ত করতে হবে। আমি মনে করি এটি সাধারণত অ-নিরস্তক "ভাসমান বিন্দু" আচরণ দ্বারা বোঝানো হয় - কেবলমাত্র চলক সময়ের পদক্ষেপগুলি ইন্টিগ্রেশনগুলি ডাইর্জ করার কারণ করে - গণিতের গ্রন্থাগারগুলি বা নিম্ন স্তরের ফাংশনগুলির সাথে কিছুই করার নয়।

সিঙ্ক্রোনাইজেশন যদিও কী।


-2

আপনি তাদের নির্বিচারে করেন। একটি দুর্দান্ত উদাহরণের জন্য, তারা কীভাবে বিশ্বের অবস্থানগুলিকে নেটওয়ার্কযোগ্য করে তুলেছিল , ডানজিওন সিজ জিডিসি উপস্থাপনা দেখুন

এছাড়াও মনে রাখবেন যে নির্ধারণবাদটি 'এলোমেলো' ইভেন্টগুলিতেও প্রযোজ্য!


1
ভাসমান পয়েন্ট সহ ওপি কীভাবে এটি করতে চায় তা জানতে চায়।
কমিউনিস্ট হাঁস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.