নেটওয়ার্ক গেমটিতে আমি কীভাবে সত্তা আইডিগুলি দৃ a়ভাবে নির্ধারণ করতে পারি?


17

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

বর্তমানে আমি প্রতিবার কোনও সত্তা তৈরি হওয়ার সময় কেবল একটি কাউন্টার বাড়িয়ে দিচ্ছি। আমি ধারণা করি এইডস শেষ পর্যন্ত শেষ হয়ে যাবে তবে আমি 4 বিলিয়ন সত্তা পাওয়ার আশা করি না। এছাড়াও # 5 সত্তাটি নষ্ট হয়ে গেলে এবং আমরা 5 এর একটি আইডি পেয়ে গেলে সমস্যাটি এড়ানো হয় এটি কী নতুন # 5 বা পুরানো মোছা # 5 কে বোঝায়?

সমস্যাটি হ'ল সংঘর্ষগুলি কীভাবে পরিচালনা / এড়াতে হবে তা সম্পর্কে আমি নিশ্চিত নই। বর্তমানে যদি কোনও ক্লায়েন্ট কোনও "আইডি" বর্তমান "ফ্রি আইডি" এর চেয়ে উচ্চতর আইডি সহ কোনও সত্তার জন্য একটি আপডেট পান তবে এটি কেবল অতীতের ফ্রি আইডিটিকে আটকায়। তবে এটি খুব দৃust় বলে মনে হয় না।

আমি প্রতিটি ক্লায়েন্টকে রেঞ্জ নির্ধারণের বিষয়ে ভেবেছিলাম যাতে তারা বিবাদ ছাড়াই সত্তা বরাদ্দ করতে পারে (বলুন শীর্ষ এন বিটগুলি প্লেয়ার নম্বর) তবে সময়ের সাথে যদি রেঞ্জগুলি ওভারল্যাপ করা শুরু করে তবে কী হয় তা নিয়ে আমি উদ্বিগ্ন।

এটি পরিচালনা করার আরও ভাল উপায় আছে? আইডিস উপচে পড়া বা অনুমোদিত ব্যাপ্তির শেষ পেরিয়ে যাওয়ার বিষয়েও কি আমার যত্ন নেওয়া উচিত? আমি এই কেসগুলি সনাক্ত করতে কোড যুক্ত করতে পারতাম তবে ক্র্যাশ ছাড়া অন্য ঘটনা ঘটলে এটি কী করবে।

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

ধন্যবাদ!


1
কেন সমস্ত ক্লায়েন্টের সত্ত্বা একই থাকে না? ক্লায়েন্টগুলি কি সিঙ্ক্রোনাইজড নয়? বা এটি এমন কোনও এক বিশাল বিশ্ব যেখানে ক্লায়েন্টরা সকলেই একই খেলা চালায় না।
ফিলিপ

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

1
আমি মনে করি, যেমন আপনি বলেছেন, এটি কেবলমাত্র সার্ভার দ্বারা পরিচালনা করা উচিত যদি এটি আপনার প্রদত্ত স্থাপত্যের মধ্যে যথাযথভাবে সম্ভব হয়। তারপরে সত্তা তালিকা / মানচিত্রের সাথে পৃথকভাবে বিদ্যমান অস্তিত্ব আইডিগুলির একটি স্ট্যাক রাখুন, তাই আপনি কী আইডি উপলব্ধ তা জানেন। কোনও অনুমোদনযোগ্য সার্ভারের মডেল ব্যর্থ হওয়া, তারপরে আপনার পরিসীমা অবধি ঠিকঠাকভাবে কাজ করা উচিত, ব্যাপ্তির ক্ষেত্রে। চার বিলিয়ন অনেক, এমনকি একটি এমএমওতে 4000 প্লেয়ারের মধ্যে বিভক্ত হওয়াও। তারপরে কোনও লেখকের মতো উপলভ্য আইডির ট্র্যাক রাখতে একই পন্থাটি ব্যবহার করুন। সার্ভার।
ইঞ্জিনিয়ার

@ লুকাস, আপনার লিঙ্কটি বলছে "সার্ভার প্রতিটি ক্লায়েন্টের জন্য" প্রাসঙ্গিক "অভিনেতাগুলির সেট সনাক্ত করে"। এটি সূচিত করে যে সার্ভারটি সমস্ত সত্তা সম্পর্কে জানে এবং সেগুলি গণনা করার মতো অবস্থানে রয়েছে।
কাইলোটন

1
অবশ্যই, তবে যদি কোনও ক্লায়েন্ট নতুন সত্তা এ তৈরি করে তবে সার্ভারটি নতুন সত্তা বি তৈরি করার বার্তাটি পাওয়ার আগে এটি উভয়কে একই "ফ্রি" আইডি অর্পণ করা হয়।
লুকাস 21

উত্তর:


13

আমি যা করেছি তা হ'ল সার্ভারকে সবকিছু করতে । ক্লায়েন্ট (গুলি) কেবলমাত্র সার্ভারকে কিছু করার জন্য বলতে পারে তবে তারা নিজেরাই কিছু করতে পারে না। এই ক্ষেত্রে, সার্ভারটি সর্বদা এক নির্ধারিত আইডি এবং সমস্যার সমাধান হবে।

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

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


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

ক্লায়েন্ট নির্দিষ্ট আইডির জন্য (সার্ভারের জন্য অপেক্ষা করার সময় পূর্বাভাসের জন্য প্রয়োজনীয়) আপনি কেবল আইডিতে একটি উপসর্গ ব্যবহার করতে পারেন।
দানিজার

6

যখন আমি এটি একটি বাণিজ্যিক মাল্টিপ্লেয়ার গেমের জন্য করেছি, তখন আপনি যা প্রস্তাব করেছিলেন ঠিক তেমনটিই করেছি: 32-বিট জিইউইডি পূর্ণসংখ্যা ব্যবহার করুন, যেখানে শীর্ষ আটটি বিট প্লেয়ারের নম্বর এবং নীচে চব্বিশ বিটগুলিতে স্থানীয়ভাবে একটি অনন্য নম্বর রয়েছে।

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

আরও অভিনব দৃষ্টিভঙ্গি হ'ল "জিইউডির সাথে অবজেক্ট 'এন' এখন প্রতিটি বিদ্যমান অবজেক্টের জন্য জিইউডি 'এম' বার্তা সহ অবজেক্ট। তবে আমার ক্ষেত্রে, এটি আসলে কখনও ঘটে যাওয়ার সম্ভাবনা ছিল না এবং আমি মনে করি না যে লোকেরা একক নেটওয়ার্ক সেশনে পাঁচ দিনের ননস্টপ খেলার পরে, আধা সেকেন্ডের জন্য বিশ্ব থেকে দূরবর্তী বস্তুগুলি নিখরচায় মনে করবে। ;)


ওভারফ্লো পরিচালনা করার জন্য এটি একটি ভাল ধারণা। সহজ, তবে আমি এটি ভেবে দেখিনি :)। আপনার সমস্ত সত্তা "ভুলে যাওয়া" দুর্দান্ত কারণ এটি গেমটিতে যোগদানের সময় ক্লায়েন্টটি মূলত একই কোডপথটিকে পুনরায় ব্যবহার করতে পারে
লুকাস

4

যদি আপনার ক্লায়েন্টরা তাদের নিজস্ব সত্তাকে স্প্যান করতে পারে তবে আমি অনুমান করছি যে আপনার কাছে পিয়ার-টু-পিয়ার মাল্টিপ্লেয়ার গেম রয়েছে।

যদি এটি হয় তবে আপনার সম্ভবত খুব বেশি ক্লায়েন্ট নেই। অবশ্যই 256-র বেশি নয় And এবং আপনার সত্তা আইডি 24 বিটের মধ্যে ফিট করার গ্যারান্টিযুক্ত (16000000+ সত্তা প্রত্যেকের জন্য যথেষ্ট!)। সুতরাং, কেবল আপনার আইডি-র সর্বোচ্চ বাইটটি ক্লায়েন্টের আইডির সমান করুন:

entityId = clientId<<24 + (maxEntityIn++)

অথবা অন্যকিছু.

এবং যদি আমি ভুল হয়ে থাকি এবং আপনার একটি অনুমোদিত সার্ভার থাকে তবে ক্লায়েন্টগুলিতে কখনই নতুন সত্ত্বা তৈরি করবেন না


1

আমি আমার অবিচ্ছিন্ন মাল্টিপ্লেয়ার গেমটিতে 'সর্বাধিক নিষ্পাপ' পদ্ধতিটি (প্রতিটি নতুন আইডির জন্য কেবলমাত্র একটি পূর্ণসংখ্যা বৃদ্ধি) ব্যবহার করছি এবং এটি দুর্দান্ত কাজ করে কারণ আমি ক্লায়েন্টকে নতুন আইডি তৈরি করতে দিই না: গুলি।

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

সচরাচর, প্রতারণা রোধ করতে , সার্ভারের সমস্ত তৈরি এবং যাচাইকরণ করা উচিত ।

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