রিয়েল টাইম কৌশল গেমগুলির জন্য নেটওয়ার্কিং


16

আমি যে কম্পিউটার বিজ্ঞানের কোর্স নিচ্ছি তার জন্য আমি একটি বাস্তব সময়ের কৌশল গেমটি বিকাশ করছি developing এর একটি শক্ত দিক মনে হয় ক্লায়েন্ট-সার্ভার নেটওয়ার্কিং এবং সিঙ্ক্রোনাইজেশন। আমি এই বিষয়ে পড়েছি ( 1500 তীরন্দাজ সহ ) তবে আমি অন্য মডেলের বিপরীতে ক্লায়েন্ট-সার্ভারের পদ্ধতি গ্রহণ করার সিদ্ধান্ত নিয়েছি (উদাহরণস্বরূপ ল্যানের উপরে)।

এই বাস্তব সময় কৌশল গেমটি কিছু সমস্যা নিয়ে আসে। ধন্যবাদ, প্লেয়ারটি গ্রহণ করে এমন প্রতিটি ক্রিয়া হ'ল নির্দোষ। তবে, এমন ইভেন্ট রয়েছে যা নির্ধারিত বিরতিতে ঘটে। উদাহরণস্বরূপ, গেমটি টাইলগুলি নিয়ে গঠিত এবং কোনও খেলোয়াড় যখন কোনও টাইল নেন, তখন 'শক্তি স্তর', সেই টাইলের একটি মান, তা নেওয়ার পরে প্রতি সেকেন্ডে বাড়তে হবে। এটি খুব দ্রুত ব্যাখ্যা যা আমার ব্যবহারের ক্ষেত্রে ন্যায়সঙ্গত হওয়া উচিত।

এখনই আমি পাতলা ক্লায়েন্ট করছি, যা সার্ভারে কেবল প্যাকেট প্রেরণ করে এবং প্রতিক্রিয়ার জন্য অপেক্ষা করে। তবে বেশ কয়েকটি সমস্যা রয়েছে।

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

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

টিএল; ডিআর>> প্রতি সেকেন্ডে 50 টি ইভেন্ট দিয়ে আরটিএস তৈরি করছে, আমি কীভাবে ক্লায়েন্টগুলিকে সিঙ্ক্রোনাইজ করব?


আপনি সম্ভবত প্রাক-প্রাকৃতিক অনলাইন কী কার্যকর করেন এবং সবকিছুকে সঠিকভাবে প্রক্রিয়াজাত করার জন্য "ধীরগতি" সময় প্রয়োগ করতে পারেন।
রায়ান এরব

3
প্ল্যানেটারি অ্যানিহিলেশন এর ক্লায়েন্ট / সার্ভার মডেলের একটি বাধ্যতামূলক লিঙ্ক এখানে রয়েছে: forrestthewoods.ghost.io/… এটি লকস্টেপ মডেলের একটি বিকল্প যা তাদের জন্য খুব ভালভাবে কাজ করছে বলে মনে হচ্ছে।
ডালনএফ

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

উত্তর:


12

রিয়েল-টাইম শোনায় আপনার প্রতি সেকেন্ডে 50 টি ইভেন্ট সিঙ্ক্রোনাইজ করার লক্ষ্যটি বাস্তবের মতো নয় like এই কারণেই লক-স্টেপ পদ্ধতির 1500 তীরন্দাজ নিবন্ধে আলোচনা হয়েছে, ভাল, সম্পর্কে কথা বলা হয়েছে!

একটি বাক্যে: খুব ধীর নেটওয়ার্কের মাধ্যমে খুব অল্প সময়ে খুব বেশি আইটেম সিঙ্ক্রোনাইজ করার একমাত্র উপায় হ'ল খুব ধীরে ধীরে নেটওয়ার্কের মাধ্যমে খুব অল্প সময়ে খুব বেশি আইটেম সিঙ্ক্রোনাইজ না করা, পরিবর্তে সমস্ত ক্লায়েন্টের উপর নির্ধারিত রাষ্ট্রের অগ্রগতি এবং কেবল সিঙ্ক্রোনাইজ করা খালি প্রয়োজনীয়তা (ব্যবহারকারীর ইনপুট)।


6

খেলোয়াড়ের প্রতিটি পদক্ষেপ নিরোধক হয়, তবে, এমন ঘটনা রয়েছে যা নির্ধারিত বিরতিতে ঘটে

আমি মনে করি আপনার সমস্যা আছে; আপনার গেমটিতে কেবল একটি সময়রেখা থাকা উচিত (গেমপ্লে-প্রভাবিত জিনিসগুলির জন্য)। আপনি বলছেন যে নির্দিষ্ট কিছু প্রতি সেকেন্ডে এক্স হারে বৃদ্ধি পায় ; এক সেকেন্ডে কত গেমের পদক্ষেপ রয়েছে তা সন্ধান করুন এবং এটিকে প্রতি ওয়াই গেম পদক্ষেপে X হারে রূপান্তর করুন । তারপরেও গেমটি ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে থাকতে পারে everything

গেমটি রিয়েল টাইমে স্বতন্ত্রভাবে চালানো থাকার অন্যান্য সুবিধা রয়েছে:

  • আপনি যত তাড়াতাড়ি এটি চালিয়ে বেঞ্চমার্ক করতে পারেন
  • আপনি সাময়িক ঘটনাগুলি দেখতে গেমের গতি কমিয়ে, এবং উল্লিখিত হিসাবে ডিবাগ করতে পারেন
  • গেমটি ডিটারমিনিস্টিক থাকে যা মাল্টিপ্লেয়ারের জন্য খুব গুরুত্বপূর্ণ।

আপনি এটিও উল্লেখ করেছেন যে> 50 টি ইভেন্ট থাকলে বা সেকেন্ড পর্যন্ত বিলম্ব হয় you এটি 1500 তীরন্দাজদের বর্ণিত দৃশ্যের তুলনায় স্কেলের তুলনায় অনেক ছোট , সুতরাং আপনি যদি নিজের খেলাটি প্রোফাইল করতে পারেন এবং মন্দাটি কোথায় তা খুঁজে বের করতে পারেন কিনা তা দেখুন।


1
+1: ফ্রেম-ভিত্তিক সঠিক পছন্দ, সময় ভিত্তিক নয়। অবশ্যই প্রতি সেকেন্ডে এন ফ্রেম রাখার চেষ্টা করতে পারেন। একটি সামান্য এইচইচিক্রি সম্পূর্ণ অন-ডিজাইনকের চেয়ে ভাল।
প্যাট্রিকবি

@ পেট্রিকবি: আমি দেখতে পাচ্ছি যে অনেক গেম একটি "সিমুলেটেড" সময় ব্যবহার করে যা ভিডিও ফ্রেমের সাথে আবদ্ধ নয় । ওয়ারক্রাফ্টের ওয়ার্ল্ড কেবল প্রতি 100 মিটারে মানার মতো জিনিস আপডেট করে এবং বামন ফোর্ট্রেস ডিফল্ট ভিডিও ফ্রেম প্রতি 10 টি টিকিটে।
মাকিং হাঁস

@ মুভিং হাঁস: আমার মন্তব্যটি আরটিএস-এর জন্য নির্দিষ্ট ছিল। কোনও কিছুর জন্য যেখানে ছোট ত্রুটিগুলি সহ্য করা যায় এবং পরে সংশোধন করা যায় (যেমন এমএমওআরপিজি, এফপিএস), তারপরে অবিচ্ছিন্ন মানগুলি কেবলমাত্র তাত্পর্যপূর্ণ নয়, তবে সমালোচনামূলক। তবে, ডিটারমিনিস্টিক সিমুলেশনগুলি যে একাধিক মেশিনে সিঙ্ক করতে হবে? ফ্রেমে আটকা
প্যাট্রিকবি 22'14

4

প্রথমত, তফসিলযুক্ত ইভেন্টগুলির সাথে সমস্যাটি সমাধান করার জন্য, ইভেন্টগুলি যখন ঘটে সেগুলি সম্প্রচার করবেন না , তবে যখন তারা প্রাথমিকভাবে নির্ধারিত হবে। অর্থাৎ প্রতি সেকেন্ডে " টাইলের শক্তি বৃদ্ধি ( x , y )" বার্তা প্রেরণের পরিবর্তে কেবলমাত্র একটি বার্তা প্রেরণ করুন " প্রতি সেকেন্ডে টাইলের শক্তি বৃদ্ধি ( x , y ) একবার পূর্ণ না হওয়া অবধি, বা অবধি বিঘ্নিত "। প্রতিটি ক্লায়েন্ট তারপরে স্থানীয়ভাবে আপডেটগুলি নির্ধারণ করার জন্য দায়বদ্ধ।

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

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


দ্বিতীয়ত, ক্লায়েন্টদের সিঙ্ক্রোনাইজ করার জন্য, নিশ্চিত করুন যে আপনার গেমটি নির্বিচারক is অন্যান্য উত্তর ইতিমধ্যে এর জন্য ভাল পরামর্শ সরবরাহ করেছে, তবে আমাকে কী করা উচিত তার একটি সংক্ষিপ্তসার অন্তর্ভুক্ত করুন:

  • আপনার খেলাটি অভ্যন্তরীণভাবে টার্ন-ভিত্তিক করুন, প্রতিটি পালা বা "টিক" নেওয়ার সাথে বলুন, 1/50 সেকেন্ড। (আসলে, আপনি সম্ভবত 1-10 সেকেন্ড বা তার বেশি সময় নিয়ে পালিয়ে যেতে পারেন)) একক পালা চলাকালীন যে কোনও খেলোয়াড়ের ক্রিয়াকলাপকে যুগপত হিসাবে বিবেচনা করা উচিত। কমপক্ষে সার্ভার থেকে ক্লায়েন্টদের সমস্ত বার্তা, টার্ন নম্বর সহ ট্যাগ করা উচিত, যাতে প্রতিটি ক্লায়েন্ট জানে যে প্রতিটি ইভেন্টটি কী ঘটবে turn

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

  • একই টার্নে ঘটে যাওয়া "যুগপত" ইভেন্টগুলির জন্য একটি ধারাবাহিক অর্ডার সংজ্ঞায়িত করুন, যাতে প্রতিটি ক্লায়েন্ট তাদের একই ক্রমে চালিত করে। এই অর্ডারটি যে কোনও কিছু হতে পারে, যতক্ষণ না এটি নির্ধারক এবং সমস্ত ক্লায়েন্টের (এবং সার্ভার) জন্য একই।

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

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


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

1
@ মুভিংডাক: ভালো কথা। প্রকৃতপক্ষে, আমি বর্তমান আরএনজি বীজকে প্রতিটি মোড়ের মধ্যে সঞ্চারিত করার পরামর্শ দেব, যাতে আরএনজি বিসর্জন তাত্ক্ষণিকভাবে সনাক্ত করা যায়। এছাড়াও, যদি আপনার ইউআই কোড কোন যদৃচ্ছতা প্রয়োজন, না এটি একই RNG উদাহরণস্বরূপ থেকে খেলা যুক্তিবিজ্ঞান জন্য ব্যবহৃত টান।
ইলমারি করোনেন

3

আপনার গেমসের যুক্তিকে আসল সময় থেকে সম্পূর্ণ স্বতন্ত্র করা উচিত এবং মূলত এটিকে টার্ন ভিত্তিক করা উচিত। "টাইলসের শক্তি পরিবর্তন ঘটে" তার ঠিক আপনি কীভাবে জানেন know আপনার ক্ষেত্রে, প্রতিটি পালা সেকেন্ডের 1/50 তম হয়।

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


1

সবার আগে আপনাকে বুঝতে হবে যে পিসি ফ্লোট / ডাবল ম্যাথ নির্ণায়ক নয়, যদি না আপনি আপনার গণনার জন্য আইইইই-75৫৪ কঠোরভাবে ব্যবহার না করেন (ধীর হয়ে যাবে)

তারপরে আমি এটি কীভাবে বাস্তবায়ন করব: ক্লায়েন্টটি সার্ভারের সাথে সংযোগ স্থাপন করবে এবং সময়কে সিনক্রোনাইজ করবে (পিং লেটেন্সিটি যত্ন নেবে!) (দীর্ঘ গেমপ্লে জন্য টাইমস্ট্যাম্প / টার্ন পুনরায় সংযোগের প্রয়োজন হতে পারে)

এখন, প্রতিবার যখন ক্লায়েন্ট কোনও ক্রিয়া করেন, এতে একটি টাইমস্ট্যাম্প / টার্ন অন্তর্ভুক্ত থাকে এবং খারাপ টাইমস্ট্যাম্প / টার্ন প্রত্যাখ্যান করার জন্য সার্ভারের উপর নির্ভর করে। তারপরে সার্ভার ক্লায়েন্টগুলিকে ক্রিয়াকলাপটি প্রেরণ করে এবং প্রতিটি বার "ক্লোজড" হয়ে গেলে (ওরফে সার্ভারটি এত পুরানো টার্ন / টাইমস্ট্যাম্প গ্রহণ করবে না), সার্ভার ক্লায়েন্টগুলিকে প্রেরণ এবং শেষ-টার্ন ক্রিয়াকলাপ দেয়।

ক্লায়েন্টদের 2 টি "ওয়ার্ল্ড" থাকবে: একটি এন্ড-টার্নের সাথে সিঙ্কে রয়েছে, অন্যটি এন্ড-টার্ন থেকে শুরু করে গণনা করা হয়, বর্তমান ক্লায়েন্টের টার্ন / টাইমস্ট্যাম্প না হওয়া অবধি ক্রিয়ায় ক্রিয়ার উপস্থিতিটি যোগ করা হবে।

কারণ সার্ভারটি কিছুটা পুরানো ক্রিয়া গ্রহণ করবে, ক্লায়েন্ট সরাসরি নিজের ক্রিয়াটি কাতারে যুক্ত করতে পারে, তাই নেটওয়ার্কের মাধ্যমে বৃত্তাকার ট্রিপের সময়টি লুকিয়ে রাখা হবে, অন্তত আপনার নিজের ক্রিয়াকলাপের জন্য।

শেষটি হ'ল আরও ক্রিয়া সারি করা যাতে আপনি এমটিইউ প্যাকেটটি পূরণ করতে পারেন যার ফলে কম প্রোটোকল ওভারহেড হয়; সার্ভারে এটি করা একটি দুর্দান্ত ধারণা, তাই প্রতিটি শেষ-টার্ন ইভেন্টে কাতারে ক্রিয়া থাকে।

আমি এই অ্যালগরিটমটি রিয়েল-টাইম-শ্যুটিং গেমটিতে ব্যবহার করি এবং ভাল কাজ করে (ক্লায়েন্টের নিজস্ব ক্রিয়াকলাপ না করে তবে সার্ভারের পিং কম 20/50 মিমি কম), এছাড়াও প্রতিটি এক্স-টার্ন সার্ভার একটি বিশেষ "সমস্ত পাঠায়" ক্লায়েন্ট মানচিত্র "প্যাকেট, প্রবাহিত মান সংশোধন করতে।


ফ্লোটিং পয়েন্টের গণিত সম্পর্কিত সমস্যাগুলি সাধারণত এড়ানো যায় - কোনও আরটিএসে আপনি সাধারণত সহজেই পূর্ণসংখ্যা / নির্দিষ্ট পয়েন্ট সহ সিমুলেশন এবং চলন করতে পারেন এবং কেবলমাত্র খেলার স্তরটির জন্য ভাসমান পয়েন্ট ব্যবহার করতে পারেন যা গেমের আচরণকে প্রভাবিত করে না।
পিটারিস 26'14

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