এমএমওতে সার্ভারের সাথে স্বল্প ট্র্যাফিক ক্লায়েন্ট সিঙ্ক্রোনাইজেশন


22

আমি এমএমও বাস্তবায়ন করছি যেখানে প্লেয়ার তারারশীপে এটিতে তীর কী দিয়ে নিয়ন্ত্রণ করে অন্য খেলোয়াড়দের সাথে সহযোগিতা করে মহাকাশে উড়ে যায়।

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

সমস্যাটি কীভাবে বজায় রাখা যায়, উদাহরণস্বরূপ, একক মানচিত্রের মধ্যে 1000 প্লেয়ার (অন্যান্য সমস্ত গেমের অবজেক্টগুলি, ভিড়গুলি বাদ দিয়ে ...): আসুন আমি বলি যে:

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

সুতরাং, এর জন্য এই জাতীয় নেটওয়ার্ক ব্যান্ডউইথ থাকা প্রয়োজন: 1000 (ক্লায়েন্ট) * 50 (প্রতি সেকেন্ডে বার) * 100 (প্রতিটি খেলোয়াড়কে প্রেরণ করতে অবজেক্ট) * 50 (প্রতি বস্তু বাইট) = 250 000 000 বাইট প্রতি সেকেন্ড! এটা অসম্ভব!

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

যাইহোক, এই জাতীয় গেমগুলি কীভাবে সাধারণভাবে প্রোগ্রাম করা হয়? ধন্যবাদ.


1
আমি বস্তুর (বিশ্বের অবস্থান, বর্তমান অবস্থা (যা একটি বাইট) এবং এই জাতীয়) সম্পর্কে কেবল যৌক্তিক তথ্য প্রেরণ করি - কোনও গ্রাফিক্স নেই।
স্লাভ

1
@ স্লাভ: চমৎকার! সমস্ত বিট স্থানান্তর আমার ASM প্রোগ্রামিং দিনগুলির কথা মনে করিয়ে দেয়।
র‌্যান্ডল্ফ রিচার্ডসন

1
"আজকের দিন" কেন নয়? :) যখন আমি এএস 3, জাভা, লুয়া, সি # তে লিখি এবং এরকম খারাপ পারফরম্যান্সের মুখোমুখি তখন আমি সি ++ মিস করি এবং এএসএম সম্পর্কে মনে করি।
স্লাভ

1
@ স্লাভ: হেইহে, আমি সম্প্রতি খুব বেশি এএসএম করিনি। আমার কাছে বেশিরভাগ জিনিস এই দিনগুলিতে জাভা এবং পার্ল (mod_perl2) বেশিরভাগ ক্ষেত্রে, তবে আমি অবশ্যই এই ভাষাগুলি উপভোগ করি।
র্যান্ডল্ফ রিচার্ডসন

2
@ স্লাভ, আপনি লিখেছেন: "আমি যখন AS3, জাভা, লুয়া, সি # তে লিখি এবং এরকম খারাপ পারফরম্যান্সের মুখোমুখি আমি সি ++ মিস করি এবং এএসএম সম্পর্কে মনে করি"। আপনার কীভাবে লুয়া এবং সি # সঠিকভাবে ব্যবহার করতে হবে তা শিখতে হবে, সম্ভবত আপনি পারফরম্যান্সটি খুব কম অস্বস্তিকর দেখতে পাবেন। এছাড়াও, (দ্রুত) স্ক্রিপ্টিং ভাষার দ্রুততম স্ক্রিপ্টিং ভাষা সম্পর্কে অভিযোগ করা এককথায় সেরা একা আছে ... এটি কি রিয়েলটাইম মানব জিনোম বিশ্লেষণ সম্পর্কিত একটি খেলা?
রাইন

উত্তর:


20

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

তারপরে, প্রতিটি প্লেয়ার যখন সে সংযোগ স্থাপন করে কেবল তখনই একটি সম্পূর্ণ স্ন্যাপশট প্রেরণ করুন। এর পরে কেবল গেমের সামগ্রীর পরিবর্তনগুলি প্রেরণ করুন। যদি কোনও পরিবর্তন ঘটে থাকে তবে তা প্রেরণ করবেন না।

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

কীভাবে ডেটা সংকোচন করতে হবে সে সম্পর্কে লিডগ্রেনলিবারির সাথে উদাহরণের জন্য এটি দেখুন: http://code.google.com/p/lidgren-network-gen3/wiki/Optimization

পরবর্তী: খেলোয়াড়দের সরানোর সাথে সাথে তার দেখার ব্যাসার্ধকে হ্রাস করার চেষ্টা করুন এবং কেবলমাত্র সেই সময়ে গুরুত্বপূর্ণ তথ্য প্রেরণ করুন। তারপরে তারা যখন থামবে তখন আবার তাদের দর্শন ব্যাসার্ধ বাড়িয়ে দেবে। "সীমার মধ্যে" থাকা অবজেক্টগুলি দেখার জন্য ওভারহেড হ্রাস করতে আপনি একটি স্থানিক হ্যাশিং সিস্টেম বা একটি বিএসপি ট্রি ব্যবহার করতে পারেন। এটি বিষয়টির জন্য একটি ভাল পঠনযোগ্য: http://en.wikedia.org/wiki/Collision_detection

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

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

সম্পাদনা (মন্তব্যের কারণে):

প্রতিটি প্লেয়ারের প্রতি বিট গড় বিট সংখ্যা হ্রাস করার জন্য অতিরিক্ত পদ্ধতি:

  1. আপনি লিখেছেন যে আপনি "বস্তুটি পরিবর্তন হয়নি" পাঠিয়েছেন। এটি করার কোনও কারণ নেই। যদি আপনি প্যাকেট ক্ষতির বিষয়ে উদ্বেগ প্রকাশ করেন (এবং এর কারণে আপনার সিমুলেশনটি সিঙ্কের বাইরে চলেছে) নিম্নলিখিত বিষয়গুলি বিবেচনা করুন: প্রতিটি নির্দিষ্ট সময়সীমায় (উদা। 100, 200, 300, 400 ...) হ্যাশ সিমুলেশন স্টেট এবং সার্ভারে প্রেরণ করুন । সার্ভারটি নিশ্চিত করে বা সমস্ত ডেটার সম্পূর্ণ স্ন্যাপশট প্রেরণ করে।

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

  3. এক বার্তায় একাধিক কমান্ড একত্রিত করুন এবং 16-20 বাইটের চেয়ে ছোট বার্তাগুলি কখনও প্রেরণ করবেন না কারণ udp শিরোনাম ম্যাসেজের চেয়ে বড় হবে। আপনার প্রোটোকলের এমটিইউর চেয়ে বড় প্যাকেজগুলি প্রেরণ করবেন না কারণ খণ্ডিতকরণ সংক্রমণের গতি কমিয়ে দেবে।


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

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

5

এখানে দুটি পদ্ধতির রয়েছে:

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

ক্লায়েন্টকে অবশ্যই দুটি বা তিনটি যুগপত সিমুলেশন চালাতে হবে।
1: পরবর্তী পদক্ষেপের জন্য যখনই ডেটা নিখোঁজ হয় ts
2: অনুমানের ডেটা ব্যবহার করা চালিয়ে যান এবং রেন্ডারিংয়ের জন্য ব্যবহৃত রাষ্ট্র সরবরাহ করুন। 3: যখনই কোনও 1 টি থামতে আসে এই সিমুলেশনটি 1 নম্বরের অবস্থা অনুলিপি করে, বর্তমান সময়টি ধরে ধরুন এবং 2 নম্বরের জন্য গ্রহণ করুন যা পরে বাদ দেওয়া হয়।

যদি ক্যাচআপটি দ্রুত পর্যাপ্ত হয় তবে আপনি 2 ও 3 নংয়ের মধ্যে পার্থক্য রেখে কেবল পুরানো ডেটা অবিলম্বে ফেলে দিতে পারেন।

দ্বিতীয়:
ডিটারমিনিস্টিক পদার্থবিজ্ঞান ব্যবহার করবেন না, উপরের মতো একই কাজ করুন, তবে প্রতি কয়েক সেকেন্ডে একবার "পূর্ণ ফ্রেম" প্রেরণ করুন। বুলেটের মতো অস্থায়ী জিনিস স্থানান্তর করতে আপনি সহজেই পুরোপুরি ছেড়ে যেতে পারেন।

উভয় ক্ষেত্রেই আপনি যে ক্লায়েন্টকে মারা যাবেন তার পূর্বাভাস দেওয়ার বিষয়ে সতর্ক থাকতে চাইতে পারেন, এটি প্রতিপক্ষকে অপ্রচলিত অবস্থায় দেখার মতো বোকা।

এবং গণিতগুলি করার জন্য +1, খুব বেশি লোক সহজ সংস্থান ব্যবহারের অনুমান করতে ব্যর্থ হয়।


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

3
এর অর্থ পূর্ণসংখ্যা এবং নির্দিষ্ট সময়ের পদক্ষেপ। তাত্ত্বিকভাবে আপনি আচরণ করার জন্য ভাসমান পয়েন্টগুলি উপহাস করতে পারেন, তবে পূর্ণসংখ্যা ব্যবহার করা সহজ উপায়। হারিয়ে যাওয়া ক্ষেপণাস্ত্রের উদাহরণটির সাথে আপনি একটি পয়েন্ট পেয়ে গেছেন, যদি আপনি অ-সংজ্ঞাবহ পদার্থবিজ্ঞান ব্যবহার করেন তবে সম্ভবত সার্ভারকে সম্পূর্ণরূপে মৃত্যু পরিচালনা করতে দেওয়া, এবং মৃত্যুর / ধ্বংসের ঘটনাগুলি দ্রুত সংক্রমণ করা ভাল।
aaaaaaaaaaaa

5

প্রথম কয়েকটি প্রশ্ন।

'রকেট বা অন্য কিছু' বুদ্ধিমান বা বোবা কি? যদি সেগুলি বোবা হয় তবে আপনার প্রয়োজন অনুসারে আগুনের সূত্রপাত, উত্স এবং ভেক্টর sim তারা যদি বুদ্ধিমান হয় তবে তারা কত বুদ্ধিমান? আগুনের সময় আপনি কি সেগুলি আঘাত বা মিস করতে চলেছেন তা গণনা করতে পারেন? যদি তাই হয় তবে আপনি ক্লায়েন্টের পুরো পথটি অনুকরণ করতে পারেন। ("টি 13 এ ক্ষেপণাস্ত্রটি জাহাজটিকে আঘাত করবে কারণ নাটকটি ডজ রোলটি হারিয়েছে / শ্যুটার একটি সমালোচনা করেছে scored")

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

পূর্বাভাস এবং বিরক্তি দিয়ে সময় ব্যয় করুন এবং আপনি আপনার ব্যান্ডউইথ প্লামমেট দেখতে পাবেন। আমি যে প্রকল্পে কাজ করেছি তার আপডেট হার ছিল 10Hz এবং আমি মনে করি 14 বাইটের একটি অবজেক্টের রাষ্ট্রের প্রতিনিধিত্ব। (আপনি যা কিছু করতে পারেন তা সঙ্কুচিত করুন! আমি বিশ্বাস করি যে আমরা এক্স প্লেনের চারপাশে ঘূর্ণনটি সংজ্ঞায়িত করতে 6 টি বিট এবং তারপরে সেই বিমানের উপরে / নীচে একটি নলটির জন্য আরও 6 টি বিট ব্যবহার করেছি, এটি একটি আসল ঘূর্ণমান ম্যাট্রিক্স / কোয়ার্টারন পাঠানো থেকে পৃথক বলে মনে হয়েছে looked)

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

সাধারণ ধারণাটি ক্লায়েন্টের উপর নিখুঁত সিমুলেশন করা নয়, এটি অসম্ভব, ধারণাটি এমন একটি মজাদার খেলা করা যেখানে খেলোয়াড়রা খেয়াল করবেন না যে এটি কোনও নিখুঁত সিমুলেশন নয়।

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