মাইনক্রাফ্টের মতো ব্লক ওয়ার্ল্ড কীভাবে পরিচালনা করবেন


9

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

কোনও ফাইল থেকে প্রয়োজনীয় ব্লকের তথ্য লোড করা এবং মেমরির মধ্যে কেবল প্রয়োজনীয়গুলির হোল্ডিং আমি কীভাবে পরিচালনা করতে পারি?


2
মাইনক্রাফ্ট বিশ্বকে বেশ বড় আকারের চুনস নামে বোঝায়, এটি একবারে নয়। আমি সঠিক বিবরণ সম্পর্কে নিশ্চিত নই। আপনি কীভাবে কীভাবে চলেছেন তা একবার দেখতে চাইলে মাইনক্রাফ্ট উত্সটি ধরে রাখা বেশ সহজ।
রতবুম

মাইনক্রাফ্ট উইকিতে একবার দেখুন: minecraftwiki.net/wiki/Chunk
টম ভ্যান সবুজ

আমি মিনক্রাফ্টের অংশগুলি সম্পর্কে ইতিমধ্যে জানতাম, তবে যাইহোক ধন্যবাদ thanks
দানিজার

এটি একটি জটিল প্রশ্ন যা এই ব্লগের সুযোগের জন্য উপযুক্ত নয়।

উত্তর:


9

মিনক্রাফ্টের মতো ব্লক সহ একটি গেমের জন্য ডেটা সঞ্চয় করার কয়েকটি ভিন্ন উপায় রয়েছে।

আমি বিশ্বাস করি যেভাবে মিনক্রাফট এটি করে তা 16x16x256 খণ্ডগুলিতে বিশ্বকে ভেঙে ফেলে। প্লেয়ার যখন খেলা শুরু করে তখন প্লেয়ারের চারপাশের অংশগুলি স্মৃতিতে লোড হয়, তারপরে আপনি যখন হাঁটেন তখন একটি পটভূমি থ্রেড আরও লোড হয়। এখানে এমন একটি ভিডিও রয়েছে যা এটি দেখায়: http://www.youtube.com/watch?v=oR_ZdJH9eho

এটি করার আরেকটি উপায় হ'ল বিশ্বকে একটি অক্টোবরে পরিণত করা। মাইকেল গুডফেলো এই ডেটা স্ট্রাকচার সহ কিউব ওয়ার্ল্ড বাস্তবায়নের বিষয়ে একটি ব্লগ লিখেছেন: http://www.sea-of-memes.com/LetsCode1/LetsCode1.html । অক্ট্রিটি দুর্দান্ত কারণ এটি আপনাকে সংক্ষেপে কিছুটা বিল্ট দেয়, তবে কোনও অ্যারের সাথে কাজ করা সম্ভবত সামান্য কঠিন হবে be

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

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

আমার পরামর্শটি হবে 16x16x256 খণ্ডগুলি নিয়ে যেতে। এগুলিকে একটি অ্যারেতে সঞ্চয় করুন যেহেতু আপনার জাল এবং গেম যুক্তি (সংঘর্ষ সনাক্তকরণ, ব্লকগুলি যোগ / অপসারণ, ect) তৈরির কারণে দ্রুত পুনরাবৃত্তি এবং সম্পাদনা প্রয়োজন। তারপরে প্লেয়ারের আশেপাশে একটি বৃত্তে যতগুলি অংশ লোড করুন load উন্নত বা খারাপ কম্পিউটারের জন্য খণ্ডগুলির সংখ্যা উপরে বা নীচে স্কেল করুন।

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


ধন্যবাদ! এআই সম্পর্কে কিছুই নেই কারণ আমি একটি এমএমওর জন্য ক্লায়েন্ট লিখছি। সার্ভার দ্বারা এনপিসি গণনা করা হয়। একটি সংযোজন: গ্রাফিক্স ইঞ্জিন দ্বারা "প্রতিটি ব্লক পুরোপুরি অন্যান্য অপ-স্বচ্ছ ব্লক দ্বারা পরিবেষ্টিত নয়" নয়। যদি সেখানে গুহা থাকে তবে প্লেয়ার দেখতে পাবে না যে তারা গুরুত্বহীন। ;-)
দানিজার

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

3

এটি ব্যাখ্যা করার সর্বোত্তম উপায় আমার কাছে নাও থাকতে পারে তবে আমি চেষ্টা করব।

আমি মনে করি কীভাবে এটি আরও কার্যকর করা যায় তা বোঝার সর্বোত্তম উপায় হ'ল ভক্সেলগুলি বোঝা। মাইনক্রাফ্টটি ভক্সেল ভিত্তিক, এটি গোলক ইত্যাদির পরিবর্তে কেবল কিউব ব্যবহার করে etc.

মূলত একটি ভক্সেল একটি 3D আকৃতি যা পরিবর্তনশীল পরিবর্তিত ভলিউম থাকতে পারে এবং যখন ভলিউম পরিবর্তন হয়, তেমনি আকারটিও ঘটে। এ চুনক হ'ল এক্স এক্স বাই বাই এক্স ভক্সেলের সেট। সুতরাং উদাহরণস্বরূপ, আপনার কাছে একটি অংশ থাকতে পারে যাতে 16x16x16 ভক্সেল রয়েছে এবং তারপরে আপনার এক্স সংখ্যা হতে পারে। আপনার একটি দূরত্ব নির্ধারণ করা হবে যে প্লেয়ার যদি কোনও অংশ থেকে N এর চেয়ে বেশি দূরে থাকে তবে সেগুলি আপনার গণনায় অন্তর্ভুক্ত করবেন না। এটি ক্লিপিং দূরত্বের মতোই তবে এটি প্রতিটি খণ্ডেও প্রয়োগ করা দরকার। এইভাবে, আপনার এটি থাকতে পারে যাতে আপনি সর্বদা আপনার প্লেয়ারকে চঞ্চের সেট, বলুন, 3x3 সেট এর কেন্দ্র অংশে রাখতে পারেন।

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

সুতরাং এখন সমস্ত কিছুর বিশাল অ্যারের পরিবর্তে আপনার যে কোনও সময় 9 টি অংশ হতে পারে এবং খণ্ড শ্রেণিতে আপনার কাছে 4096 ভক্সেলের অ্যারে থাকবে।

দয়া করে মনে রাখবেন এটি খুব সহজ ব্যাখ্যা। আমি বর্তমানে ভক্সেল ব্যবহার করে কিছু নিয়ে কাজ করছি যাতে আমি বুঝতে পারি যে আমি আমার ইনপুটটিতে ফেলে ফেলব = -)

ভক্সেলগুলিতে আরও কিছু তথ্যের জন্য http://en.wikedia.org/wiki/Marching_cubes দেখুন


3
মার্চিং কিউবগুলি ভক্সেলগুলি ভিজ্যুয়ালাইজ করা সম্পর্কে। এবং মাইনক্রাফ্ট এমনকি এটি ব্যবহার করে না; এটি কেবল কিউবগুলিকে আঁকবে, যা মার্চিং কিউবগুলি না করানোর বিষয়ে ঠিক তাই।
নিকল বোলাস

তোমার ব্যাখ্যার জন্য ধন্যবাদ! আমি ভক্সেল এর আগে কখনও শুনিনি এবং এটি আমার প্রকল্পের জন্য খুব গুরুত্বপূর্ণ বলে মনে হচ্ছে। তবে আমার এখন একটি প্রশ্ন বাকি আছে।
দানিজার

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

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

1

আপনি কেবল দৃশ্যমান পৃষ্ঠতলকে রেন্ডার করার চেষ্টা করতে পারেন, কম্পিউটার ব্যাকগ্রাউন্ডে ব্লক ডেটা পরিচালনা করে, যখন রেন্ডারার কেবল যা দেখেন তার সাথেই কাজ করে। 8x8 খণ্ডগুলি এটি পরিচালনা করা সহজ হবে।

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