আরটিএস গেম প্রোটোকল


18

আমি একাধিক প্লেয়ার আরটিএস গেমটি নিয়ে ভাবছিলাম। যে অংশটি আমি দেখতে পাচ্ছি না তা হ'ল ইউনিট আন্দোলন সিঙ্ক করে রাখা keeping আমি যদি ইউনিট এটিকে এক্সওয়াই স্পটে স্থানান্তরিত করি তবে আমাকে অন্য ক্লায়েন্টের সাথে সম্পর্কিত যে সার্ভারে তা আবার যোগাযোগ করতে হবে।

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

সম্পাদনা

এটি স্ট্যাকওভারফ্লো থেকে পুনরায় পোস্ট করা প্রশ্ন । আমি দেখতে পেয়েছি যে এই সাইটটি সম্ভবত প্রশ্নের উত্তম জায়গা ছিল।

এই পোস্ট থেকে আরও ভাল উত্তর:

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


2
উত্তরটি নির্ভর করে আপনি কোন পদ্ধতিটি ব্যবহার করতে চান তা নির্ভর করে। ক্লায়েন্ট - ক্লায়েন্ট বা ক্লায়েন্ট - সার্ভার। সার্ভারে ক্লায়েন্ট সহজ কিন্তু এটি একটি প্রয়োজন trustable সার্ভার
Cem Kalyoncu

উত্তর:


25

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

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

নেতিবাচক দিকটি হ'ল প্রতিটি খেলোয়াড় ধীর গতির খেলোয়াড়ের মতো ধীরে ধীরে - যদি কেউ কমান্ড প্রেরণে পিছিয়ে পড়ে তবে প্রত্যেককেই তাকে ধীর করতে হবে এবং তার ধরার জন্য অপেক্ষা করতে হবে (স্টারক্র্যাফ্ট 2 এ, এটি " এক্সএক্সএক্স গেমটি কমিয়ে দিচ্ছে " কথোপকথন)।


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

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


এই সেটআপটি (পি 2 পি ব্যবহার করে কেবল কমান্ড প্রেরণ করা) কীভাবে স্টারক্রাফ্ট, সিঅ্যান্ডসি, এবং এওই সহ বেশিরভাগ আরটিএস কাজ করে এবং এওই সম্ভবত 28.8kbps সংযোগে 1500 ইউনিটকে সমর্থন করতে পারে এমন একমাত্র উপায় ।

(এওই-তে নেটওয়ার্কিংয়ের চিত্র)

পি 2 পি আরটিএস লেখার জন্য আরও কয়েকটি টিপস এখানে রইল:

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

ভাল পোস্ট। সংযুক্ত করার জন্য ছোট জিনিস, এমনকি একই সংকলকগুলি অপ্টিমাইজ করে, ডিবাগ / রিলিজ এবং অন্যান্য পতাকাগুলি ফলাফল পরিবর্তন করতে পারে। সতর্ক হোন!
পিটার

14

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

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

সার্ভারটি একটি 'টিক' নম্বর প্রেরণ করে যাতে কমান্ডটি কার্যকর করতে এছাড়াও 'কারেন্ট' টিকের আগে কয়েক টিক থাকে। এইভাবে সমস্ত কমান্ড সমস্ত মেশিনে একই 'টিক' এ কার্যকর করা যায়।

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

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

বার্তাগুলি দেখতে কেমন হতে পারে তা হিসাবে। এটি আমার প্রথম নেটওয়ার্ক গেম হিসাবে আমি অতি দক্ষতার সাথে উদ্বিগ্ন ছিলাম না। কমান্ডগুলি স্ট্রিং হিসাবে পাস করেছি। কমান্ডগুলি এভাবে বিন্যাস করা হবে:"<player_id>:<command>:<parameters>"

একটি কল্পিত উদাহরণস্বরূপ, একটি সরানো কমান্ড ভালো চেহারা পারে: "3:move:522:100:200"। এর অর্থ প্লেয়ার ( , ) এ ইউনিট করতে 3চায় । move522100200

সার্ভার যিনি এটা পাঠিয়ে একটি টিক্ টিক্ শব্দ ভালো সংযুক্ত নম্বর দিয়ে সহ সব ক্লায়েন্ট, উপর কমান্ড পাস: "153238:3:move:522:100:200"

153238 টিকটি কার্যকর করা হলে ক্লায়েন্টরা সকলেই এই কমান্ডটি কার্যকর করতে পারে।


আমি প্রশ্নের সাথে আরও কিছু তথ্য যুক্ত করেছি। এসও থেকে উত্তর আপনি যা বলেছিলেন তার বিপরীত বলে মনে হচ্ছে এবং আমি সূক্ষ্ম বিবরণ নিয়ে আলোচনা করতে চাই।
ডার্থজি 8

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