আমি কীভাবে মাল্টিপ্লেয়ার গেমের স্থিতি পূর্ণ-রাষ্ট্রের আপডেটের চেয়ে আরও দক্ষতার সাথে সিঙ্ক করব?


10

আমি এর আগে কিছু গেম নেটওয়ার্ক কোডিং করেছি, তবে মূলত রিয়েল-টাইম প্রয়োজন ছাড়া গেমগুলির জন্য টিসিপি দিয়ে with আমি নেটওয়ার্কযুক্ত মাল্টিপ্লেয়ারের সাথে 2 ডি জাভা গেমটিতে কাজ করছি। শেখার জন্য, আমি বিদ্যমান নেটওয়ার্ক এপিআই ছাড়াই নিজেই এটি করতে চাই।

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

কেবলমাত্র রাজ্যে পরিবর্তনগুলি প্রেরণ করার জন্য কি আপনার মধ্যে দৃ way়পদ ব্যবহার করা হয়েছে এবং কার্য সম্পাদনের ক্ষেত্রেও কি এত বড় বৈষম্য রয়েছে যে এটি অতিরিক্ত কাজের জন্য মূল্যবান?


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

উত্তর:


10

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

নিম্নলিখিত মডেলটি সহ আমি ব্যক্তিগতভাবে অনেক বেশি সাফল্য পেয়েছি:

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

এটি আমার জন্য বেশ বড় গেম ওয়ার্ল্ড সহ ভাল পারফরম্যান্স সরবরাহ করেছে।

আর একটি টিপ, ক্লায়েন্টটিকে অ্যানিমেশন, কণার প্রভাব ইত্যাদি সার্ভারের উল্লেখ ছাড়াই যত্ন নিতে দিন take এগুলি সংক্রমণ করার কোনও অর্থ নেই - উপযুক্ত গেম ইভেন্টগুলির দ্বারা তাদের কেবল "ট্রিগার" করা দরকার।


6

সিঙ্ক্রোনাইজেশন সাধারণত দুটি ভাগে বিভক্ত হয়: ইনক্রিমেন্টাল এবং পরম।

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

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

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

ডেটা প্যাকিং এছাড়াও গুরুত্বপূর্ণ। আপনি একটি ইউডিপি প্যাকেজে প্রায় 1400 বাইট (কনফিগারেশন নির্ভর, এটি ডিফল্ট) প্রেরণ করতে পারেন, সাধারণত কয়েকটি শিরোলেখ থাকে। সুতরাং আপনি সহজেই একটি প্যাকেজে 50-100 ইউনিট অবস্থান আপডেট করতে পারেন।


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

আপনাকে শুভকামনা! ;)
মাতজি

1

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

এই # অল্টদেবব্লগএড পোস্টে একটি আধুনিক আরটিএসে এই পদ্ধতির কিছু দিক রয়েছে (বিশেষত কীভাবে আপনার ক্লায়েন্টরা "বিভিন্ন" গেমগুলি চালানো শুরু করবেন তা সনাক্ত করতে হবে))

অন্যথায় প্রমাণিত হওয়া পর্যন্ত এটিকে সহজ রাখার কথা মনে রাখবেন, যদিও। :)


1
এগুলি ফ্যাক্টোরিওর ডিভ থেকে ভাল পড়েছে যা এই পদ্ধতির ব্যবহার করে এবং এই পদ্ধতির জটিলতায় ইঙ্গিত দেয় তবে এটি কার্যকরও হয় তা দেখায়: factorio.com/blog/post/fff-76 factorio.com/blog/post/fff -147 factorio.com/blog/post/fff-188
આરોনলএস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.