একটি এমএমও গেমটিতে কীভাবে বিপুল সংখ্যক পিকআপগুলি পরিচালনা করবেন


26

মিনক্রাফ্টের মতো গেমস, বা সত্যিই কোনও এমএমও গেমের পিকআপগুলি কীভাবে সেগুলি হ্যান্ডেল করে?

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

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

আমার আসল প্রশ্নটি: অন্যান্য এমএমওরা কীভাবে এই সমস্যাটি সমাধান করেছেন?


9
এছাড়াও, মাইনক্রাফ্টের প্রসঙ্গে, নির্দিষ্ট সংখ্যক আইটেম একে অপরের কাছে পর্যাপ্ত পরিমাণে (একই ব্লকস্পেসে একই আইটেমের 3+) যথেষ্ট পরিমাণ পরে থাকার পরে সার্ভারটি 3 টি দৃষ্টান্তকে গ্রুপযুক্ত উদাহরণের সাথে প্রতিস্থাপন করে যাতে ব্লক টাইপ ( minecraft:dirt) এবং একটি গণনা (30), যাতে প্লেয়ার যখন এটি বাছাইয়ের জন্য পর্যাপ্ত হয় তখন প্লেয়ারের ইনভেন্টরিতে এটি যতটা সম্ভব গণনা যোগ করে। যদি খেলোয়াড়ের কাছে কেবল 6 আইটেমের জন্য জায়গা থাকে এবং 30 টি স্ট্যাক মাটিতে থাকে তবে প্লেয়ার 6 টি বেছে নেবে এবং গ্রাউন্ডের গণনার
স্ট্যাকটি

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

একটি মাধ্যমে পড়া হয়েছে en.wikipedia.org/wiki/Occlusion_culling
RJFalconer

উত্তর:


48

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

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


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

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

হ্যাঁ, এই পরিস্থিতিতে অবজেক্ট পুলিং বাধ্যতামূলক :) ঠিক আছে আপনাকে অনেক ধন্যবাদ!
আলাকানু

3
@ আলাকানু আপনি এই খেলাগুলির উত্তর কীভাবে প্রযোজ্য সে সম্পর্কে আরও তথ্যের জন্য আপনি মাইনক্রাফ্টের "লোড্ড খণ্ডগুলি" ধারণাটি পরীক্ষা করতে পারেন।
টি। সর - মনিকা

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

22

আপনার পরিচালনা করতে দুটি খুব আলাদা জিনিস রয়েছে:

  1. সার্ভারকে অবশ্যই সমগ্র বিশ্ব পরিচালনা করতে হবে , একটি রচনামূলক পদ্ধতিতে। তার জন্য, এন ক্লায়েন্টের সাথে যোগাযোগের (যেখানে এন "বিশাল") প্রয়োজনীয় necessary

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

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

সার্ভারটি জানার দরকার নেই, বা পিকআপগুলির ঘূর্ণন বা এই জাতীয় বিশদ সম্পর্কে যত্ন নেওয়া প্রয়োজন। কেন হবে?

ক্লায়েন্ট আসলে কোনওভাবেই পাত্তা দেয় না, যেহেতু এটি কেবল চোখের মিছরি যা ক্লায়েন্টটি উড়ে যাওয়ার জন্য তৈরি করতে পারে।

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

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

সুতরাং, আপনি যে কংক্রিটের ক্ষেত্রে কেবল নিকটস্থ ময়লা আবদ্ধ করতে চান, আপনি কেবলমাত্র সমস্ত অবজেক্টের সম্পর্কে যা কিছু জানেন তার উপর পরিসীমা পরীক্ষা করতে পারেন। যেহেতু ডেটা সেটটি বড় নয়, এমনকি সমস্ত কিছুতে নিষ্ঠুরতা কাজ করবে।

আপনার পার্টিশনের আকারের উপর নির্ভর করে আপনি (এবং হওয়া উচিত) তুচ্ছভাবে গ্রিড কোষগুলি খুব দূরে ছাঁটাই করতে পারেন।

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

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

আপনার একই অবস্থানের তুলনায় কয়েকশ, বা সর্বাধিক কয়েক হাজার দূরত্বের চেক কীভাবে হবে তা দেখে (স্কোয়ারড দূরত্বটি ভাল কাজ করে), কেবল এই গণনাটি করতে আসলেই আপনার খুব বেশি সমস্যা হয় না, কারণ এটি আরও বরং ক্যাশে- সংক্ষিপ্ত স্মৃতিতে বন্ধুত্বপূর্ণ পুনরাবৃত্তি, এবং শর্তাধীন পদক্ষেপের সাথে এটি ময়লা সস্তা। এর মতো কিছু (সিউডোকোড) rot = r[i] + 1; r[i] = ((dx*dx+dy*dy) < DIST_SQ) ? rot : r[i];। এটি ফ্রেম প্রতি কয়েক শতাধিক মানের অ্যারের উপরে এক পুনরাবৃত্তি। কম্পিউটার এটি করার বিষয়ে কম যত্ন নিতে পারে না, এটি নিয়মিত লোড এবং স্টোর, সরল ALU, কোনও শাখা নেই এবং কেবল কয়েক হাজার পুনরাবৃত্তি।

এটি (একাধিক থেকে এক) সমস্যাটি একই শ্রেণীর নয় (বহু-বহু-বহু) সার্ভারে রয়েছে। সত্যিই, ক্লায়েন্ট সমস্যা নয়।


আমি দুঃখিত, আমি ভেবেছিলাম এটা পরিষ্কার ছিল যে আমি যখন ক্লায়েন্টের কথা বলছিলাম তখন ফ্রেইটরেটের কথা বলছিলাম।
আলাকানু

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

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

1
@ আলাকানু এটি আমার কাছে আপনার প্রশ্নের একটি বিশদ এবং সম্পূর্ণ উত্তর বলে মনে হচ্ছে। যদি আপনি মনে করেন যে এটি কোনও উত্তর নয়, হয় আপনি এটির ভুল বুঝেছেন বা আপনার প্রশ্নটি এতটাই অস্পষ্ট যে এটি দামান, আমি এবং এই উত্তরটিকে সমর্থন করে এমন সমস্ত লোকের দ্বারা এটি ভুল বুঝে গেছে।
ডেভিড রিচার্বি

2
@ আলাকানু আপনি যে লোকেরা আপনাকে সাহায্য করার চেষ্টা করছেন তাদের কাছে অভিযোগ করার জন্য আপনি সত্যিই প্রচুর সময় ব্যয় করেন। সে জন্য শুভকামনা।
ডেভিড রিচার্বি

2

@ টি.এসআর একটি মন্তব্যে লিখেছেন যে আরও তথ্যের জন্য আপনার Minecraft "" বোঝা অংশ "ধারণাটি দেখে নেওয়া উচিত into যদি আপনি তা করেন তবে সচেতন হন যে লোকেরা গেমটিতে মেশিন তৈরির কারণে এটি মাইনক্রাফ্টের চেয়ে জটিল।

একটি খুব সরলীকৃত সংস্করণ অনুসরণ:

বিশ্বটি বর্গাকার অঞ্চলে বিভক্ত (অংশগুলি) মিনক্রাফ্টে একটি উচ্চতা বিভাগও রয়েছে তবে বেশিরভাগ মিমোদের এটির প্রয়োজন হয় না।

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

মিনক্রাফ্টে, অঞ্চলগুলি 16x16 ব্লক, এবং ক্লায়েন্টটি 9x9 অঞ্চলগুলি সম্পর্কে, প্রতিটি দিকে 4 টি অঞ্চল আউট সম্পর্কে জানে। (৪ টি অঞ্চল পূর্ব + অঞ্চলের খেলোয়াড় + ৪ টি অঞ্চলে পশ্চিম = ৯ টি অঞ্চলে রয়েছে north একই উত্তর / দক্ষিণে)

এই সংখ্যাগুলি সম্পর্কে যাদুকর কিছুই নেই, আপনার গেমটি যা বোঝায় তা ব্যবহার করুন।

ক্লায়েন্ট কেবল এই অঞ্চলের মধ্যে জিনিস অ্যানিমেট করে। সার্ভার কেবলমাত্র কিছু প্লেয়ারের কাছাকাছি অঞ্চলে ঘোরাঘুরির দানবগুলির মতো জিনিসগুলি গণনা করে ।

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

বেশ কয়েকটি নেস্টেড অ্যানিমেশন সীমা থাকাতে কোনও ভুল নেই। উদাহরণস্বরূপ, অ্যানিমেট আইটেমটি একটি 3x3 অঞ্চলে নেমে আসে, 5x5 অঞ্চলে দানবগুলি ঘুরে বেড়ায় এবং কেবল 9x9 অঞ্চলে ল্যান্ডস্কেপ দেখায়।

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


অঙ্কনের দূরত্বটি সামঞ্জস্যযোগ্য তবে এই ক্ষেত্রে 8 টি অংশ 9x9 এবং একটি ক্লায়েন্ট-পক্ষের সিদ্ধান্ত, এটি সার্ভারকে জিনিসগুলি দ্রুত করার জন্য জানাতে পারে (যাতে সার্ভারটি ক্লায়েন্টটি সরবরাহ করবে না এমন ডেটা প্রেরণ করে না)। এছাড়াও ... ডুম এবং কোপ কি কেবল রেন্ডারিংয়ের সেই সমস্যাটিকেই বোঝায় না যা বোঝায়?
স্পারক

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