একটি বড় টাইল মানচিত্রের অঞ্চলগুলি পাশাপাশি জঞ্জালগুলি d


10

আমার গেমটির মাইনক্রাফ্টের মতো একটি মানচিত্র রয়েছে, এটি সিউডোয়েন্টিফিন্ট এবং এলোমেলোভাবে উত্পন্ন হয়েছে। এবং বড়। বলুন যে ব্যবহারকারী 1000x1000 জোন (2D এখানে) অন্বেষণ করেছে, তাই এটি 1,000,000 টাইলস।

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

সুতরাং যদি আমি এটিকে অংশ বা অঞ্চলগুলিতে বিভক্ত করতে যাই বা 64৪x64৪৪ টাইল যাই বলি তবে আমাকে প্রতিটি টাইল এবং অবজেক্টের অবস্থান যেমন সংরক্ষণ করতে হবে:

খণ্ড ক, খ। অবস্থান x, y।

তবে আমি যদি আমার মানচিত্রে অন্ধকূপ এবং এর মতো চাই? সুতরাং একটি একক টালি যা সম্ভবত 40 তলা অন্ধকূপে পরিচালিত করে, প্রতিটি 40x40 এর অঞ্চল সহ। আমি ঠিক একই মানচিত্রে সংরক্ষণ করতে পারি না।

এবং স্মৃতি পক্ষ আছে; আমি একই সময়ে যুক্তিসঙ্গতভাবে মেমরিতে কতটা সঞ্চয় করতে পারি? আমি আইডি দিয়ে টাইলস খুব সহজেই করতে পারতাম এবং সেখানে সাধারণ 2 ডি অ্যারে থাকতাম। বা আবার, টাইল ধরণের একটি ডেটা ফাইল থাকার চেয়ে আরও কার্যকর সমাধান আছে ? সুতরাং একটি 64x64 এর জন্য..এটি কেবল 20 কে বা যা কিছু হতে চলেছে। আমি বাস্তবসম্মত আপডেটের জন্য যতটা সম্ভব আশেপাশের লোড হওয়া চাই। তবে আমি জানি না মেমরি হগিং না হয়ে আমি কী ধরণের সীমাবদ্ধতা আঘাত করতে পারি।

উত্তর:


9

যদিও আমি এই সংবেদনের সাথে একমত: "এটি যদি কোনও প্রমাণিত সমস্যা না হয় তবে এটি নিয়ে চিন্তা করবেন না", আমি মনে করি এটি প্রথম দিকে চিন্তা করা উপযুক্ত: আমি একটি সমাধানকে বিপরীতমুখী করে তোলা আরও বেদনাদায়ক। এবং হ্যাঁ, কেবল 'নিকটবর্তী' টাইলগুলি আপডেট করা তাদের যাওয়ার উপায়। পারফরম্যান্সের কারণে আপনার গেমের জগতের আইটেমগুলির দক্ষতার সাথে স্টোরেজ এবং ঠিকানার দক্ষতা অত্যন্ত গুরুত্বপূর্ণ important

আপনি এখানে যা ভাবছেন তা হ'ল একটি বিচ্ছিন্ন ডাটা-সেট: এমন কিছু যেখানে সম্ভাব্য সূচীগুলি বড় (বা সীমাহীন), তবে কেবলমাত্র একটি সামান্য অনুপাতই ব্যবহৃত হয়। মূল বিষয়টি হ'ল কোন অনুপাতটি সঠিকভাবে ব্যবহার করা হবে তা আপনি জানেন না।

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

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

ইন্ডিরিয়ারেশনের অতিরিক্ত স্তরগুলি চালু করে আপনি আরও বেশি স্টোরেজ দক্ষতা অর্জন করতে পারেন। ধরা যাক আপনি আপনার টাইলসকে অংশগুলিতে সাজিয়েছেন এবং খণ্ডগুলিতে 64x64x64 এর গ্রানুলারিটি রয়েছে। 125, 1, 132 এ একটি টাইল দেওয়া, আপনি জানেন যে এটি খণ্ডে রয়েছে (1,0,2)। সুতরাং আপনার কাছে একটি বিশ্ব রয়েছে যা একটি কমপ্যাক্ট খণ্ড অ্যারে এবং মাপ সূচকগুলির একটি ম্যাট্রিক্স রয়েছে (-1 যদি শঙ্কটি বিদ্যমান না থাকে)। প্রতিটি অংশের বিষয়বস্তু (উপস্থিত থাকলে) টাইল সূচকগুলির একটি 64x64x64 ম্যাট্রিক্স (-1 যদি টাইলটি উপস্থিত না থাকে), এবং ব্যবহৃত টাইলগুলির একটি কমপ্যাক্ট অ্যারে। এইভাবে, আপনি খণ্ডগুলির জন্য প্রচুর পরিমাণে টাইল সূচকগুলি পোড়াবেন না যা কখনও ব্যবহৃত হয় না। এই ধরণের পদ্ধতির অনুসরণ করে এবং খাঁটি গ্রানুলারিটির জন্য বুদ্ধিমান সংখ্যা বাছাই করে আপনি আপনার মহাবিশ্বকে ব্যাপক আকারে বাড়িয়ে তুলতে পারেন এবং আপনার স্মৃতি ব্যবহার নিয়ন্ত্রণে রাখতে পারেন। আসলে, যদি আপনি নিজের অংশগুলি 32x32x32 করেন,

আপনি ছদ্মবেশী কৌশলগুলিও করতে পারেন, যেমন বিশেষ কিছু বোঝাতে আপনার অংশ বা টাইল সূচকগুলির হাই অর্ডার বিট ব্যবহার করা। সুতরাং যদি টাইল ম্যাট্রিক্সে একটি এন্ট্রি শীর্ষ বিট সেট করে থাকে, তবে নীচের 31 টি বিট একটি টাইল সূচক বোঝায় না, পরিবর্তে এর অর্থ একটি 'ওয়ার্প সূচক' বা অনুরূপ কিছু, এবং আপনি এটি আলাদাভাবে বজায় রাখা তালিকায় দেখতে পারেন এটি যে স্থানাঙ্কগুলি বাড়ে তার সন্ধান করতে।


ভবিষ্যতে এই প্রশ্নটি যে কাউকেই আসবে আমি তাকে সাবধান করে দিচ্ছি: যদিও এই পোস্টের কোনও কিছুই ভুল নয়, মাইনক্রাফ্টের মতো খেলায় এটি সত্যই ভয়ঙ্কর, যা একটি অবিচ্ছিন্ন বিশ্ব। (এবং MrCranky যতটা বলছেন।) আপনার বিশ্বের শুধুমাত্র এই থেকে উপকারিতা যদি এটি একটি কয়েক somethings এবং প্রচুর আছে Nothings , না একটি কয়েক somethings এবং প্রচুর বাঁধিবার জিনিসপত্র

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

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

6

আপনি কেন দশ লক্ষ টাইলস স্মৃতিতে সঞ্চয় করতে পারবেন না? এমনকি আমার ফোনে 256 এমবি র‌্যাম রয়েছে; একটি মিলিয়ন খালি টাইলস কি হতে চলেছে, 4-32MB?


মনে হচ্ছে এটি এত বিশাল সংখ্যক সঞ্চয় করা হবে। পাশাপাশি এটি আপডেট করার জন্যও এটি একটি দীর্ঘ সময় নিতে চলেছে।
কম্যুনিস্ট হাঁস

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

2
@ দ্য কম্যুনিস্টডাক কেবলমাত্র টাইলগুলি সংরক্ষণ করার জন্য ব্যবহৃত মোট মেমরির বিষয়টি গুরুত্বপূর্ণ,
জাস্টিন

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