নেটওয়ার্কযুক্ত রিয়েল-টাইম গেমগুলির জন্য কীভাবে একটি গেম-স্টেট স্ন্যাপশট সিস্টেম প্রয়োগ করা হবে?


12

আমি আমার নেটওয়ার্কিং ক্লাসের প্রকল্প হিসাবে একটি সাধারণ ক্লায়েন্ট-সার্ভার রিয়েল-টাইম মাল্টিপ্লেয়ার গেমটি তৈরি করতে চাই।

আমি রিয়েল-টাইম মাল্টিপ্লেয়ার নেটওয়ার্ক মডেলগুলি সম্পর্কে অনেক কিছু পড়েছি এবং আমি ক্লায়েন্ট এবং সার্ভার এবং ল্যাগ-ক্ষতিপূরণ কৌশলগুলির মধ্যে সম্পর্কগুলি বুঝতে পারি।

আমি যা করতে চাই তা ভূমিকম্প 3 নেটওয়ার্ক মডেলের অনুরূপ: মূলত, সার্ভারটি পুরো গেমের রাজ্যের একটি স্ন্যাপশট সংরক্ষণ করে; ক্লায়েন্টদের কাছ থেকে ইনপুট পাওয়ার পরে, সার্ভারটি পরিবর্তনগুলি প্রতিবিম্বিত করে একটি নতুন স্ন্যাপশট তৈরি করে। তারপরে, এটি নতুন স্ন্যাপশট এবং শেষের মধ্যে পার্থক্য গণনা করে এবং ক্লায়েন্টদের কাছে প্রেরণ করে, যাতে তারা সিঙ্কে থাকতে পারে।

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

তবে আমি স্ন্যাপশট সিস্টেমটি প্রয়োগের জন্য ভাল উপায় খুঁজে পাচ্ছি না। একক প্লেয়ার প্রোগ্রামিং আর্কিটেকচার থেকে সরে যাওয়া এবং আমি কীভাবে গেমের অবস্থাটি এমনভাবে সঞ্চয় করতে পারি তা ভেবে আমার পক্ষে সত্যিই কঠিন মনে হচ্ছে:

  • সমস্ত তথ্য যুক্তি থেকে পৃথক করা হয়
  • গেমের রাজ্যের স্ন্যাপশটের মধ্যে পার্থক্য গণনা করা যায়
  • গেম সংস্থাগুলি এখনও কোডের মাধ্যমে সহজেই হেরফের করা যায়

কীভাবে স্ন্যাপশট শ্রেণি প্রয়োগ করা হয়? কীভাবে সত্তা এবং তাদের ডেটা সংরক্ষণ করা হয়? প্রতিটি ক্লায়েন্ট সত্তার একটি আইডি রয়েছে যা সার্ভারে একটি আইডি মেলে?

কীভাবে স্ন্যাপশটের পার্থক্য গণনা করা হয়?

সাধারণভাবে: কীভাবে একটি গেম-স্টেট স্ন্যাপশট সিস্টেম প্রয়োগ করা হবে?


4
+1 টি। এটি একটি প্রশ্নের জন্য কিছুটা বিস্তৃত, তবে আইএমও এটি একটি আকর্ষণীয় বিষয় যা মোটামুটি উত্তরে coveredাকা যেতে পারে।
ক্রোমস্টার

আপনি কেবলমাত্র 1 টি স্ন্যাপশট (প্রকৃত বিশ্ব) সঞ্চয় করেন না, প্রতিটি নিয়মিত বিশ্ব-রাজ্যে আগত প্রতিটি পরিবর্তনগুলি সংরক্ষণ করুন এবং একটি পরিবর্তন বা কোনও কিছুতে পরিবর্তন সংরক্ষণ করুন। তারপরে, যখন সমস্ত ক্লায়েন্টকে পরিবর্তনগুলি প্রেরণ করার সময়টি কেবল তাদের সকলকে তালিকার বিষয়বস্তু প্রেরণ করুন এবং তালিকাটি সাফ করুন, শূন্য (পরিবর্তন) থেকে শুরু করুন। সম্ভবত এটি 2 টি স্ন্যাপশট সংরক্ষণ করার মতো ততটা ভাল নয় তবে এই পদ্ধতির সাথে আপনাকে কীভাবে কীভাবে 2 ডিফ स्नাপশটগুলি দ্রুততর করা যায় তা সম্পর্কে অ্যালগরিদম সম্পর্কে চিন্তা করার দরকার নেই।
tkausl

আপনি কি এটি পড়েছেন: ফ্যাবিয়েনস্যাংলার্ড.নেট / ক্যুয়েকা 3 / নেট ওয়ার্ক.এফপি - ভূমিকম্প 3 নেটওয়ার্কের মডেলটির পর্যালোচনাতে বাস্তবায়নের বিষয়ে আলোচনা অন্তর্ভুক্ত রয়েছে।
স্টিভেন

কোন ধরণের গেমটি নির্মাণের চেষ্টা করা হচ্ছে? নেটওয়ার্ক সেটআপ আপনি যে ধরণের গেম তৈরি করছেন তার উপর নির্ভর করে। একটি আরটিএস নেটওয়ার্কিংয়ের ক্ষেত্রে এফপিএসের মতো আচরণ করে না।
আতুরস্যামস

উত্তর:


3

আপনি দুটি স্ন্যাপশট দৃষ্টান্ত রেখে স্ন্যাপশট ব-দ্বীপ (তার পূর্ববর্তী সিঙ্ক হওয়া রাজ্যে পরিবর্তনগুলি) গণনা করতে পারবেন: বর্তমান একটি এবং সর্বশেষ সিঙ্ক হওয়া একটি।

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

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

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

আর একটি পদ্ধতি হ'ল নোংরা পতাকা ব্যবহার করা। প্রতিবার ক্লায়েন্ট ইনপুট আসার পরে আপনি এটি আপনার একক অনুলিপি বিশ্বব্যাপী রাষ্ট্র এবং পতাকা সম্পর্কিত ক্ষেত্রগুলিতে নোংরা হিসাবে প্রয়োগ করেন apply তারপরে যখন ক্লায়েন্টদের সিঙ্ক করার সময় আপনি একই অনন্য আইডি ব্যবহার করে নোংরা ক্ষেত্রগুলি (পুনরাবৃত্তভাবে) সিরিয়াল করুন। (গৌণ) ত্রুটিটি হ'ল কখনও কখনও আপনি কঠোরভাবে প্রয়োজনের চেয়ে বেশি ডেটা প্রেরণ করেন: উদাহরণস্বরূপ int field1প্রাথমিকভাবে 0 ছিল, তারপর 1 নির্ধারিত হয়েছিল (এবং ময়লা চিহ্নিত করা হয়েছিল) এবং এর পরে আবার 0 নির্ধারিত হয়েছে (তবে মলিন রয়ে গেছে)। সুবিধাটি হ'ল বিশাল শ্রেণিবিন্যাসের ডেটা কাঠামো থাকার কারণে ডেল্টা, কেবলমাত্র নোংরা পথগুলি গণনা করার জন্য এটি সম্পূর্ণরূপে বিশ্লেষণ করার দরকার নেই।

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


2

প্রোটোকলের অনুগত পদ্ধতিতে কীভাবে আপনার প্রাসঙ্গিক ডেটা উপস্থাপন করতে হয় তা আপনার প্রথমে জানতে হবে। এটি গেমের সাথে সম্পর্কিত ডেটার উপর নির্ভর করে। আমি উদাহরণ হিসাবে একটি আরটিএস গেম ব্যবহার করব।

নেটওয়ার্কিংয়ের উদ্দেশ্যে, গেমের সমস্ত সত্ত্বা গণনা করা হয় (যেমন পিকআপস, ইউনিট, ভবন, প্রাকৃতিক সম্পদ, ধ্বংসাত্মক)।

খেলোয়াড়দের তাদের সাথে সম্পর্কিত ডেটা থাকতে হবে (উদাহরণস্বরূপ সমস্ত দৃশ্যমান ইউনিট):

  • এরা কি জীবিত নাকি মৃত?
  • এগুলি কি ধরণের?
  • তারা কতটা স্বাস্থ্য রেখে গেছে?
  • বর্তমান অবস্থান, আবর্তন, বেগ (গতি + দিক), অদূর ভবিষ্যতে পথ ...
  • ক্রিয়াকলাপ: আক্রমণ, হাঁটা, বিল্ডিং, ফিক্সিং, নিরাময় ইত্যাদি ...
  • বাফ / ডাব স্থিতি প্রভাব
  • এবং সম্ভবত অন্যান্য পরিসংখ্যান যেমন মানা, ঝাল এবং কি না?

খেলায় প্রবেশের আগে প্রথমে প্লেয়ারকে অবশ্যই পুরো রাজ্যটি গ্রহণ করতে হবে (বা বিকল্পভাবে সেই খেলোয়াড়ের সাথে সম্পর্কিত সমস্ত তথ্য)।

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

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

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

কিছু প্রশ্ন আপনি উত্থাপন করেন নি এবং আমি মনে করি আকর্ষণীয় হ'ল:

  1. ক্লায়েন্টদের প্রথমে সমস্ত ডেটা সহ একটি স্ন্যাপশট গ্রহণ করা উচিত? তাদের দৃষ্টিভঙ্গির বাইরে আইটেমগুলি সম্পর্কে কী? আরটিএস গেমগুলিতে যুদ্ধের কুয়াশা সম্পর্কে কী? আপনি যদি সমস্ত ডেটা প্রেরণ করেন তবে ক্লায়েন্টটিকে ডেটা প্রদর্শন করতে হ্যাক করা যেতে পারে যা প্লেয়ারের জন্য উপলব্ধ না হওয়া উচিত (আপনার নেওয়া অন্যান্য সুরক্ষা ব্যবস্থাগুলির উপর নির্ভর করে)। আপনি যদি কেবল প্রাসঙ্গিক ডেটা প্রেরণ করেন তবে সমস্যাটি সমাধান হয়ে যায়।
  2. কখন সমস্ত তথ্য প্রেরণের পরিবর্তে পরিবর্তনগুলি প্রেরণ করা জরুরি? আধুনিক মেশিনগুলিতে ব্যান্ডউইদথ উপলভ্য বিবেচনা করে, আমরা কি সমস্ত তথ্য প্রেরণের পরিবর্তে একটি "ব-দ্বীপ" প্রেরণ করে কিছু লাভ করি, তা যদি হয় তবে?
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.