উত্তরটি সর্বদা একটি অ্যারে বা স্টাডি :: ভেক্টর ব্যবহার করা। কোনও লিঙ্কযুক্ত তালিকার মতো বা স্ট্যান্ড :: মানচিত্রের ধরণগুলি সাধারণত গেমগুলিতে একেবারে ভয়াবহ এবং এগুলিতে অবশ্যই গেমের সামগ্রী সংগ্রহের মতো বিষয় অন্তর্ভুক্ত থাকে।
আপনার নিজের বস্তুগুলিকে অ্যারে / ভেক্টরগুলিতে (তাদের প্রতি নির্দেশক নয়) সংরক্ষণ করতে হবে।
আপনি নিখুঁত স্মৃতি চান । আপনি সত্যিই এটি চান। অ-সংগতিপূর্ণ মেমরির কোনও ডেটা নিয়ে আইট্রেট করা সাধারণভাবে প্রচুর পরিমাণে ক্যাশে মিস করে এবং কম্পাইলার এবং সিপিইউকে কার্যকর ক্যাশে প্রিফেচিং করার ক্ষমতা সরিয়ে দেয়। এটি একা পারফরম্যান্সকে হত্যা করতে পারে।
আপনি মেমরির বরাদ্দ এবং অবনতি এড়াতে চান। একটি দ্রুত মেমরি বরাদ্দকারী এমনকি এগুলি খুব ধীর। আমি গেমগুলি প্রতিটি ফ্রেমকে কয়েক শ মেমরি বরাদ্দ সরিয়ে মাত্র 10x এফপিএস বাম্প পেতে দেখেছি। এটি খারাপ হওয়া উচিত বলে মনে হয় না তবে এটি হতে পারে।
সবশেষে, গেমের বিষয়বস্তু পরিচালনার জন্য আপনি যে বেশিরভাগ ডেটা স্ট্রাকচারের যত্ন নেবেন সেগুলি গাছ বা কোনও তালিকার চেয়ে আরে বা কোনও ভেক্টরের চেয়ে আরও কার্যকরভাবে প্রয়োগ করা যেতে পারে।
উদাহরণস্বরূপ, গেমের বিষয়গুলি অপসারণের জন্য, আপনি স্যুপ এবং পপ ব্যবহার করতে পারেন। এরকম কিছু দিয়ে সহজেই প্রয়োগ করা হয়:
std::swap(objects[index], objects.back());
objects.pop_back();
আপনি কেবল মুছে ফেলা হিসাবে বস্তুগুলি চিহ্নিত করতে পারেন এবং পরবর্তী বারের জন্য আপনাকে নতুন অবজেক্ট তৈরি করার প্রয়োজন হলে তাদের সূচকটি একটি ফ্রি তালিকায় রাখতে পারেন, তবে সোয়াপ-এবং-পপ করা আরও ভাল। এটি আপনাকে লুপের বাইরে কোনও শাখা ছাড়াই সমস্ত লাইভ অবজেক্টের উপর লুপের জন্য সহজ করতে দেয়। বুলেট পদার্থবিজ্ঞানের একীকরণ এবং এর মতো, এটি একটি উল্লেখযোগ্য পারফরম্যান্সের উত্সাহ হতে পারে।
আরও গুরুত্বপূর্ণ, স্লট মানচিত্রের কাঠামোটি ব্যবহার করে আপনি একটি স্থিতিশীল অনন্য থেকে টেবিল লুপের একটি সহজ জুড়িযুক্ত অবজেক্টগুলি সন্ধান করতে পারেন।
আপনার গেম অবজেক্টগুলির প্রধান অ্যারেতে একটি সূচক রয়েছে। এগুলি কেবলমাত্র এই সূচক (মানচিত্র বা এমনকি একটি হ্যাশ টেবিলের চেয়ে অনেক দ্রুত) দিয়ে খুব দক্ষতার সাথে দেখা যেতে পারে। যাইহোক, অবজেক্টগুলি সরানোর সময় অদলবদল এবং পপের কারণে সূচকটি স্থিতিশীল নয়।
একটি স্লট মানচিত্রের জন্য দুটি দিকের দিকনির্দেশ প্রয়োজন, তবে উভয়ই ধ্রুবক সূচকগুলির সাথে সাধারণ অ্যারে লুকআপ। তারা দ্রুত । সত্যিই দ্রুত.
প্রাথমিক ধারণাটি হ'ল আপনার তিনটি অ্যারে রয়েছে: আপনার মূল অবজেক্টের তালিকা, আপনার ইন্ডিরিশনের তালিকা এবং ইন্ডিরিয়েশন তালিকার জন্য একটি বিনামূল্যে তালিকা। আপনার প্রধান অবজেক্টের তালিকায় আপনার প্রকৃত অবজেক্ট রয়েছে, যেখানে প্রতিটি বস্তু তার নিজস্ব অনন্য আইডি জানে। অনন্য আইডি একটি সূচক এবং একটি সংস্করণ ট্যাগ দিয়ে তৈরি। ইন্ডিরিশনের তালিকাটি মূল অবজেক্ট তালিকার সূচকগুলির একটি অ্যারে। বিনামূল্যে তালিকাটি ইন্ডিয়ারেশন তালিকায় সূচকগুলির একটি স্ট্যাক।
আপনি যখন মুখ্য তালিকায় কোনও অবজেক্ট তৈরি করেন, আপনি ইন্ডিয়ারেশন তালিকায় একটি অব্যবহৃত এন্ট্রি পাবেন (বিনামূল্যে তালিকা ব্যবহার করে)। ইন্ডিয়ারেশন তালিকার এন্ট্রি মূল তালিকার অব্যবহৃত প্রবেশের দিকে নির্দেশ করে। আপনি সেই অবস্থানটিতে আপনার অবজেক্টটি আরম্ভ করুন, এবং আপনি নির্বাচিত ইন্ডিয়ারেশন তালিকার এন্ট্রি এবং মূল তালিকা উপাদানের বিদ্যমান সংস্করণ ট্যাগের প্লাস একের সূচকে এর অনন্য আইডি সেট করে।
আপনি যখন কোনও বস্তুটি ধ্বংস করেন, আপনি স্বাভাবিক হিসাবে অদলবদল এবং পপ করেন তবে সংস্করণ সংখ্যাটিও বৃদ্ধি করেন। এরপরে আপনি নিখরচায় তালিকাতে সূচক (বস্তুর অনন্য আইডির অংশ) যুক্ত করুন add কোনও বস্তুকে অদলবদল এবং পপ অংশ হিসাবে স্থানান্তরিত করার সময়, আপনি ইন্ডিরিশন তালিকায় এর এন্ট্রিটিকে তার নতুন অবস্থানে আপডেট করেন।
সিউডো কোড উদাহরণ:
Object:
int index
int version
other data
SlotMap:
Object objects[]
int slots[]
int freelist[]
int count
Get(id):
index = indirection[id.index]
if objects[index].version = id.version:
return &objects[index]
else:
return null
CreateObject():
index = freelist.pop()
objects[count].index = id
objects[count].version += 1
indirection[index] = count
Object* object = &objects[count].object
object.initialize()
count += 1
return object
Remove(id):
index = indirection[id.index]
if objects[index].version = id.version:
objects[index].version += 1
objects[count - 1].version += 1
swap(objects[index].data, objects[count - 1].data)
ইন্ডিরেশন লেয়ারটি আপনাকে সংস্থার (মূল অবজেক্টের তালিকা) চলতে পারে এমন একটি সংস্থার জন্য আপনাকে একটি স্থিতিশীল শনাক্তকারী (ইন্ডিরেশন লেয়ারে সূচক, যেখানে প্রবেশগুলি সরানো হয় না) রাখতে দেয়।
সংস্করণ ট্যাগ আপনাকে মুছে ফেলা হতে পারে এমন কোনও সামগ্রীর জন্য একটি আইডি সঞ্চয় করতে দেয়। উদাহরণস্বরূপ, আপনার আইডি (10,1) রয়েছে। সূচী 10 সহ অবজেক্টটি মুছে ফেলা হয়েছে (বলুন, আপনার বুলেট কোনও জিনিসকে আঘাত করে এবং ধ্বংস হয়ে যায়)। মূল অবজেক্ট তালিকার মেমরির সেই অবস্থানের অবজেক্টটির তার সংস্করণ নম্বরটি ধাক্কা মেরে এটি প্রদান করে (10,2)। যদি আপনি কোনও বাসি আইডি থেকে আবার (10,1) সন্ধান করার চেষ্টা করেন, সন্ধান 10 সূচক 10 এর মাধ্যমে সেই বস্তুটি ফেরত দেয় তবে দেখতে পাবে যে সংস্করণ নম্বরটি পরিবর্তিত হয়েছে, তাই ID আর বৈধ নয়।
এটি আপনার কাছে স্থিতিশীল আইডি সহ পরম দ্রুততম ডেটা স্ট্রাকচার হতে পারে যা বস্তুগুলিকে মেমরিতে স্থানান্তরিত করতে দেয়, যা ডেটা লোকালাইজ এবং ক্যাশে সুসংগততার জন্য গুরুত্বপূর্ণ। এটি হ্যাশ টেবিলের যে কোনও বাস্তবায়নের চেয়ে দ্রুততর; খুব কমপক্ষে একটি হ্যাশ টেবিলের একটি হ্যাশ গণনা করতে হবে (টেবিল দেখার চেয়ে আরও নির্দেশাবলী) এবং তারপরে হ্যাশ চেইনটি অনুসরণ করতে হবে (হয় স্ট্যান্ডার্ড :: আনর্ডার্ড_ম্যাপের ভয়াবহ ক্ষেত্রে লিঙ্কযুক্ত তালিকা, বা একটি খোলা-ঠিকানা তালিকা কোনও হ্যাশ টেবিলের কোনও নির্বোধ বাস্তবায়ন নয়) এবং তারপরে প্রতিটি কীটির সাথে তুলনা করে একটি মান করতে হবে (সংস্করণ ট্যাগ চেকের চেয়ে কোনও ব্যয়বহুল নয়, তবে কম ব্যয়বহুল)। একটি খুব ভাল হ্যাশ টেবিল (এসটিএল কোনও প্রয়োগের ক্ষেত্রে এটি নয়, কারণ এসটিএল হ্যাশ টেবিলকে আদেশ দেয় যে কোনও গেম অবজেক্টের তালিকার চেয়ে আপনি যে গেমের চেয়ে বেশি ব্যবহার করতে পারেন তার চেয়ে বেশি ব্যবহার করে) এটি কোনও দিকনির্দেশে সঞ্চয় করতে পারে,
বেস অ্যালগরিদমে আপনি করতে পারেন বিভিন্ন উন্নতি। উদাহরণস্বরূপ, প্রধান অবজেক্ট তালিকার জন্য একটি স্টাডি :: ডেকের মতো কিছু ব্যবহার করা; ইন্ডিরিশনের একটি অতিরিক্ত স্তর, তবে স্লটম্যাপ থেকে আপনি যে কোনও অস্থায়ী পয়েন্টার অর্জন করেছেন তা অবৈধ না করে সামগ্রিকে পুরো তালিকায় beোকানোর অনুমতি দেয়।
আপনি বস্তুর ভিতরে সূচকটি সংরক্ষণও এড়াতে পারবেন, কারণ সূচকটি অবজেক্টের মেমরি ঠিকানা (এটি - অবজেক্টস) থেকে গণনা করা যেতে পারে, এবং আরও ভাল কেবল তখনই প্রয়োজন যখন আপনার কাছে ইতিমধ্যে বস্তুর আইডি রয়েছে সেই ক্ষেত্রে অবজেক্টটি সরিয়ে ফেলতে হবে ( সূচক) প্যারামিটার হিসাবে।
লেখার জন্য ক্ষমা চাইছি; আমি এটি স্পষ্ট বর্ণনা হতে পারে না। এটি দেরি হয়ে গেছে এবং কোডের নমুনায় আমার চেয়ে বেশি সময় ব্যয় না করে ব্যাখ্যা করা কঠিন to