এই সত্তা সিস্টেমটি কীভাবে নেটওয়ার্ক করবেন?


33

আমি একটি এফপিএসের জন্য একটি সত্তা সিস্টেম ডিজাইন করেছি। এটি মূলত এটির মতো কাজ করে:

আমাদের একটি "ওয়ার্ল্ড" -অবজেক্ট রয়েছে, যার নাম গেম ওয়ার্ল্ড। এটি গেমওজেক্টের একটি অ্যারের পাশাপাশি কম্পোনেন্টম্যানেজারের একটি অ্যারে ধারণ করে।

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

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

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

কম্পোনেন্টম্যানেজার যেমন পদার্থবিজ্ঞান উপাদান যেখানে আমি একটি বাহ্যিক গ্রন্থাগার ব্যবহার করব (যা পৃথিবীর সমস্ত কিছু একবারে করে) ব্যবহার করব সেগুলির মতো উপাদানগুলির ব্যাপক আপডেটেরও যত্ন নেয়।

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

এখন আমার সমস্যা আসে: আমি এটি মাল্টিপ্লেয়ার গেমগুলির জন্য ব্যবহার করার চেষ্টা করতে যাচ্ছি। এটি কীভাবে পৌঁছে যায় তা সম্পর্কে আমার কোনও ধারণা নেই।

প্রথমত: ক্লায়েন্টদের শুরু থেকে কোন সত্তা থাকা উচিত? আমার একক প্লেয়ার ইঞ্জিন কী কী সত্তা তৈরি করবেন তা নির্ধারণ করবে তা ব্যাখ্যা করে আমার শুরু করা উচিত।

স্তর সম্পাদকে আপনি "ব্রাশ" এবং "সত্ত্বা" তৈরি করতে পারেন। ব্রাশগুলি দেয়াল, মেঝে এবং সিলিং, মূলত সরল আকারের মতো জিনিসের জন্য। সত্ত্বা হ'ল গেম অবজেক্ট যা আমি আপনাকে বলেছি। স্তর সম্পাদকে সত্তা তৈরি করার সময়, আপনি এর প্রতিটি উপাদানগুলির জন্য বৈশিষ্ট্য নির্দিষ্ট করতে পারেন। এই বৈশিষ্ট্যগুলি সত্তার স্ক্রিপ্টে কোনও কনস্ট্রাক্টরের মতো কিছুতে সরাসরি দেওয়া হয়।

যখন আপনি ইঞ্জিনটি লোড করার জন্য স্তরটি সংরক্ষণ করেন, এটি সত্তা এবং তাদের সম্পর্কিত বৈশিষ্ট্যের তালিকায় পচে যায়। ব্রাশগুলি "ওয়ার্ল্ডস্প্যান" সত্তায় রূপান্তরিত হয়।

আপনি যখন সেই স্তরটি লোড করেন, এটি কেবলমাত্র সমস্ত সত্ত্বাকেই প্রশমিত করে। সোজা মনে হচ্ছে, তাই না?

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

আর একটি সম্ভাবনা হ'ল ক্লায়েন্ট সার্ভারের সম্পর্কে তথ্য প্রেরণের সাথে সাথে একটি সত্তা ইনস্ট্যান্সিয়েট করে এবং এর অর্থ ক্লায়েন্টের কেবল এটির প্রয়োজন সত্তা থাকবে।

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

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

এটি কাছে আসতে আমার খুব সমস্যা হচ্ছে। আপনি যদি আমাকে পথে সহায়তা করেন তবে আমি সত্যিই প্রশংসা করব। আমি কীভাবে কম্পোনেন্ট সিস্টেমের নকশাটি উন্নত করতে পারি তার টিপস উন্মুক্ত, তাই এটি সুপারিশ করতে ভয় পাবেন না।

উত্তর:


13

এটি অনেক প্রশ্নের +1 সহ একটি প্রশ্নে godশ্বরকে অভিশাপ দেওয়া (ক্ষমা করা) জন্তু। এটিতে হোঁচট খাচ্ছে এমন লোকদের অবশ্যই সহায়তা করার পক্ষে যথেষ্ট।

আমি কেবলমাত্র ফিজিক্সের ডেটা না প্রেরণের জন্য আমার 2 সেন্ট যুক্ত করতে চেয়েছিলাম !! আমি সত্যই এটাকে যথেষ্ট চাপ দিতে পারি না। এমনকি যদি আপনার এ পর্যন্ত এটি অপ্টিমাইজ করা থাকে তবে আপনি ব্যবহারিকভাবে মাইক্রো সংঘর্ষের সাথে প্রায় ৪০ টি গোলকটি প্রেরণ করতে পারেন এবং এটি কাঁপানো ঘরে পুরো গতিতে যেতে পারে যা ফ্রেমের হারও হ্রাস করে না। আমি আপনার "ব-দ্বীপ-সংক্ষেপণ / এনকোডিং" সম্পাদনের কথা উল্লেখ করছি যা আপনি আলোচনা করেছেন যে ডেটা-ডিফারেন্সিং হিসাবে পরিচিত। এটি আমি আনতে যা যা ছিল বেশ অনুরূপ।

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

ডেল্টা এনকোডিং বা ডেটা-ডিফারেন্সিং: সার্ভারটি ক্লায়েন্টরা কী জানবে তার উপর ডেটা বহন করে এবং কেবলমাত্র পুরানো ডেটা এবং ক্লায়েন্টে কী পরিবর্তন করা উচিত তার মধ্যে পার্থক্য পাঠায়। উদাহরণস্বরূপ ছদ্ম-> একটি উদাহরণে আপনি ডেটা "315 435 222 3546 33" প্রেরণ করতে পারেন যখন ডেটা ইতিমধ্যে "310 435 210 4000 40" হয় কিছু কিছু সামান্য পরিবর্তিত হয়, এবং একটিতে কোনও পরিবর্তন হয় না! এর পরিবর্তে, আপনি "ডেল্টায়)" 5 0 12 -454 -7 "প্রেরণ করবেন যা যথেষ্ট খাটো।

আরও ভাল উদাহরণগুলি এমন কিছু হতে পারে যা তার থেকে অনেক দূরে পরিবর্তিত হয় উদাহরণস্বরূপ বলা যাক যে আমি এখনই এটির সাথে 45 লিঙ্কযুক্ত বস্তুর সাথে একটি লিঙ্কযুক্ত তালিকা রেখেছি। আমি তাদের মধ্যে ৩০ জনকে হত্যা করতে চাই, তাই আমি এটি করি, তারপরে নতুন প্যাকেটের ডেটা কী তা প্রত্যেককে প্রেরণ করুন, এটি সার্ভারকে ধীর করে দিবে যদি এটি ইতিমধ্যে এরকম কিছু করার জন্য তৈরি না করা হয়েছিল, এবং এটি ঘটেছিল কারণ এটি চেষ্টা করছিল উদাহরণস্বরূপ নিজেকে সংশোধন করা। ব-দ্বীপ এনকোডিং-এ, আপনি সহজেই (সিউডো) "list.kill 30 এ 5" রেখে দিতেন এবং এটি 5 তম পরে ডেটা প্রমাণীকরণের পরে তালিকা থেকে 30 টি অবজেক্ট সরিয়ে ফেলবে, তবে সার্ভারের পরিবর্তে প্রতিটি ক্লায়েন্টের উপরে।

পেশাদাররা: (এখনই কেবলমাত্র প্রতিটিগুলির মধ্যে একটির কথা চিন্তা করতে পারেন)

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

কনস:

  1. আপনি যদি নিজের সিস্টেম আপডেট করে থাকেন এবং ব-দ্বীপের মাধ্যমে সম্পাদিত হওয়া আরও কিছু ডেটা যুক্ত করতে চান, আপনাকে সেই ডেটা পরিবর্তন করতে নতুন ফাংশন তৈরি করতে হবে! (যেমন আগের হিসাবে "list.kil 30 হিসাবে 5 এ" ওহ ছি ছি ছি ছি আমার দরকার ক্লায়েন্টে একটি পূর্বাবস্থায় যোগ করা! "list.kill পূর্বাবস্থায়")

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

মৃত গণনা যেখানে প্রতিটি ক্লায়েন্টের একটি অ্যালগরিদম থাকে যা প্রতি ক্লায়েন্টের কাছে ধ্রুবক থাকে। কোন ডেটা পরিবর্তন করা দরকার, এবং কীভাবে এটি করা যায় তা বলে ডেটা ঠিক অনেক পরিবর্তন করা হয়। ক্লায়েন্ট নিজেই ডেটা পরিবর্তন করে। একটি উদাহরণ হ'ল যদি আমার এমন একটি চরিত্র থাকে যা আমার প্লেয়ার নয়, তবে আমার সাথে খেলে থাকা অন্য ব্যক্তি দ্বারা চালিত হচ্ছে, তবে আমাকে প্রতিটি ফ্রেমে ডেটা আপডেট করতে হবে না কারণ প্রচুর পরিমাণে ডেটা সামঞ্জস্যপূর্ণ!

আসুন আমি বলি যে আমার চরিত্রটি কিছু দিক নিয়ে চলেছে, অনেক সার্ভার ক্লায়েন্টদের কাছে ডেটা প্রেরণ করবে যা জানায় (প্রায় ফ্রেম প্রতি) যেখানে প্লেয়ার রয়েছে এবং এটি (অ্যানিমেশন কারণে) চলমান রয়েছে। এতো এত অপ্রয়োজনীয় ডেটা! আমাকে কেন প্রতিটি একক ফ্রেমটি আপডেট করতে হবে, ইউনিটটি কোথায় রয়েছে এবং এটি কোন দিকে যাচ্ছে এবং এটি যে চলছে? সোজা কথায়: আমি দিই না। আপনি যখন ক্লায়েন্ট আপডেট করেন কেবল তখনই দিক পরিবর্তন হয়, যখন ক্রিয়াটি পরিবর্তিত হয় (isMoving = সত্য?) এবং অবজেক্টটি কী! তারপরে প্রতিটি ক্লায়েন্ট সেই অনুযায়ী অবজেক্টটি সরিয়ে ফেলবে।

ব্যক্তিগতভাবে এটি সাধারণ জ্ঞানের কৌশল। এটি এমন একটি বিষয় যা আমি ভেবেছিলাম যে আমি দীর্ঘ সময় আগে আসার ক্ষেত্রে চালাক হয়েছি, এটি সর্বদা ব্যবহৃত হতে পারে।

উত্তর

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

ব্যক্তিগতভাবে আমি ক্লায়েন্টের ডেটা ইনস্ট্যান্ট করব, যখন এটি সার্ভার থেকে এটি সম্পর্কে তথ্য পেয়ে থাকে (আপনার প্রস্তাবিত কিছু)।

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

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

নেটওয়ার্কে কী পরিবর্তনশীল তা এটি কীভাবে জানা উচিত, আমার কাছে এমন একটি উপাদান থাকতে পারে যা সত্যই একটি এসইউবি-অবজেক্ট এবং এটির জন্য আপনাকে নেটওয়ার্ক করতে চান এমন উপাদানগুলি দেয়। আরেকটি ধারণা মাত্র নেই হয় AddComponent("whatever")কিন্তু AddNetComponent("and what have you")মাত্র কারণ এটি দক্ষতা সহকারে ব্যক্তিগতভাবে শোনাচ্ছে।


এটি একটি হাস্যকর দীর্ঘ উত্তর! আমি এই সম্পর্কে ভয়ানক দুঃখিত। যেহেতু আমি কেবলমাত্র অল্প পরিমাণ জ্ঞান সরবরাহ করব এবং তারপরে কিছু জিনিস সম্পর্কে আমার 2 সেন্ট করব। সুতরাং আমি বুঝতে পারি যে এটির অনেকগুলি নোট করা সামান্য কিছু অপ্রয়োজনীয় হতে পারে।
জোশুয়া হেজেস

3

একটি মন্তব্য লিখতে যাচ্ছিল তবে সিদ্ধান্ত নিয়েছে এটি উত্তরের জন্য যথেষ্ট তথ্য হতে পারে।

প্রথমে, উত্তরটি বিচার করার জন্য এমন অনেক লিখিত প্রশ্নের জন্য টন বিশদ সহ +1।

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

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

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

আশাকরি এটা সাহায্য করবে.


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