গতিশীল গেম অবজেক্টগুলিকে সঞ্চয় করার জন্য সবচেয়ে দক্ষ পাত্রটি কী? [বন্ধ]


20

আমি প্রথম ব্যক্তি শ্যুটার তৈরি করছি এবং আমি বিভিন্ন ধরণের কন্টেইনার ধরণের সম্পর্কে জানি তবে আমি গতিবেগের সাথে যুক্ত হওয়া এবং খেলা থেকে প্রায়শই মুছে ফেলা হবে এমন গতিশীল জিনিস সংরক্ষণের জন্য সবচেয়ে কার্যকর যে ধারকটি খুঁজে পেতে চাই। গো EX-বুলেটের।

আমি মনে করি সেক্ষেত্রে এটি একটি তালিকা হবে যাতে স্মৃতিশক্তিটি সংক্ষিপ্ত না হয় এবং কোন পুনরায় আকার পরিবর্তন হয় না যা চলছে। তবে আমি তখন মানচিত্র বা সেট ব্যবহার করেও ভাবছি la কারও কাছে যদি কোনও সহায়ক তথ্য থাকে তবে আমি এটির প্রশংসা করব।

আমি উপায় দ্বারা এটি সি ++ এ লিখছি।

এছাড়াও আমি একটি সমাধান নিয়ে এসেছি যা আমার মনে হয় কাজ করবে।

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


আপনি নির্দিষ্ট কোন ভাষা?
ফিল.জিট

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

1
প্রো টিপ, আপনি মুছে ফেলা উপাদানগুলির মেমরিতে বিনামূল্যে তালিকা সংরক্ষণ করতে পারেন (যাতে আপনার অতিরিক্ত সারি প্রয়োজন হয় না)।
জেফ গেটস

2
এই প্রশ্নে একটি প্রশ্ন আছে?
ট্রেভর পাওয়েল

মনে রাখবেন যে আপনাকে সবচেয়ে বড় সূচকের উপর নজর রাখতে হবে না বা বেশ কয়েকটি উপাদানকে পূর্বলোক করতে হবে না। std :: ভেক্টর আপনার জন্য সমস্ত কিছুর যত্ন নেয়।
এপিআই-বিস্ট

উত্তর:


33

উত্তরটি সর্বদা একটি অ্যারে বা স্টাডি :: ভেক্টর ব্যবহার করা। কোনও লিঙ্কযুক্ত তালিকার মতো বা স্ট্যান্ড :: মানচিত্রের ধরণগুলি সাধারণত গেমগুলিতে একেবারে ভয়াবহ এবং এগুলিতে অবশ্যই গেমের সামগ্রী সংগ্রহের মতো বিষয় অন্তর্ভুক্ত থাকে।

আপনার নিজের বস্তুগুলিকে অ্যারে / ভেক্টরগুলিতে (তাদের প্রতি নির্দেশক নয়) সংরক্ষণ করতে হবে।

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

আপনি মেমরির বরাদ্দ এবং অবনতি এড়াতে চান। একটি দ্রুত মেমরি বরাদ্দকারী এমনকি এগুলি খুব ধীর। আমি গেমগুলি প্রতিটি ফ্রেমকে কয়েক শ মেমরি বরাদ্দ সরিয়ে মাত্র 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


1
আপনি 'কমপ্যাক্ট' স্টোরেজটির জন্য প্রতিটি অ্যাক্সেস অতিরিক্ত ডেরিফ এবং একটি উচ্চ বরাদ্দ / নিখরচায় (অদলবদল) কেনাবেচা করছেন। ভিডিও গেমগুলির সাথে আমার অভিজ্ঞতায় এটি একটি খারাপ বাণিজ্য :) অবশ্যই ওয়াইএমএমভি।
জেফ গেটস

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

1
আমার অভিজ্ঞতায়: (1) ভিডিও গেমগুলি খারাপ কেস পারফরম্যান্সের ভিত্তিতে বিচার করা হয়, গড়ের পারফরম্যান্সের ক্ষেত্রে নয়। (২) আপনার ফ্রেম প্রতি সংগ্রহের তুলনায় সাধারণত 1 টি পুনরাবৃত্তি থাকে, সুতরাং সহজেই কমপ্যাক্ট করা আপনার 'সবচেয়ে খারাপ ক্ষেত্রে কম ঘন ঘন করে তোলে'। (3) আপনার প্রায়শই একক ফ্রেমে অনেকগুলি বরাদ্দ / বিনামূল্যে থাকে, উচ্চমূল্যের অর্থ আপনি সেই ক্ষমতা সীমাবদ্ধ করেন। (৪) আপনার প্রতি ফ্রেমে আনবাউন্ডেড ডেরিফ রয়েছে (গেমসগুলিতে আমি কাজ করেছি, ডায়াব্লো 3 সহ, প্রায়শই ডেরেফ মাঝারি অপ্টিমাইজেশনের পরে সর্বোচ্চ পারফরম্যান্স,> সার্ভারের লোডের 5%)) আমার অর্থ অন্যান্য সমাধানগুলি বরখাস্ত করার নয়, কেবল আমার অভিজ্ঞতা এবং যুক্তি দেখানো!
জেফ গেটস

3
আমি এই তথ্য কাঠামো ভালবাসি। আমি অবাক হয়েছি এটি আরও সুপরিচিত নয়। এটি সহজ এবং সমস্ত সমস্যাগুলি সমাধান করে যা কয়েক মাস ধরে আমাকে মাথা ঠাট্টা করে। ভাগ করে নেওয়ার জন্য ধন্যবাদ.
জো বেটস

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

12


অভ্যন্তরীণ ফ্রি তালিকার সাথে স্থির আকারের অ্যারে (লিনিয়ার মেমরি) (ও (1) বরাদ্দ / বিনামূল্যে, স্থিতিশীল সূচকগুলি)
দুর্বল রেফারেন্স কীগুলির সাথে (স্লট অবৈধ কীটির পুনরায় ব্যবহার)
শূন্য ওভারহেড ডি रेফারেন্স (যখন পরিচিত-বৈধ)

struct DataArray<T>
{
  void Init(int count); // allocs items (max 64k), then Clear()
  void Dispose();       // frees items
  void Clear();         // resets data members, (runs destructors* on outstanding items, *optional)

  T &Alloc();           // alloc (memclear* and/or construct*, *optional) an item from freeList or items[maxUsed++], sets id to (nextKey++ << 16) | index
  void Free(T &);       // puts entry on free list (uses id to store next)

  int GetID(T &);       // accessor to the id part if Item

  T &Get(id)            // return item[id & 0xFFFF]; 
  T *TryToGet(id);      // validates id, then returns item, returns null if invalid.  for cases like AI references and others where 'the thing might have been deleted out from under me'

  bool Next(T *&);      // return next item where id & 0xFFFF0000 != 0 (ie items not on free list)

  struct Item {
    T item;
    int id;             // (key << 16 | index) for alloced entries, (0 | nextFreeIndex) for free list entries
  };

  Item *items;
  int maxSize;          // total size
  int maxUsed;          // highest index ever alloced
  int count;            // num alloced items
  int nextKey;          // [1..2^16] (don't let == 0)
  int freeHead;         // index of first free entry
};

গুলি থেকে দানব থেকে টেক্সচার থেকে কণার মতো সবকিছু হ্যান্ডেল করে video ভিডিও গেমগুলির জন্য এটি সেরা ডেটা স্ট্রাকচার। আমি মনে করি এটি বুঙ্গি থেকে এসেছে (ম্যারাথন / পৌরাণিক দিনগুলিতে ফিরে এসেছিল), আমি ব্লিজার্ডে এটি সম্পর্কে জানতে পেরেছিলাম এবং আমি মনে করি এটি দিনের গেম প্রোগ্রামিংয়ের রত্নগুলিতে ছিল। এটি সম্ভবত এই সময়ে সমস্ত গেমস শিল্প জুড়ে।

প্রশ্ন: "কেন একটি গতিশীল অ্যারে ব্যবহার করবেন না?" উত্তর: গতিশীল অ্যারে ক্র্যাশ ঘটায়। সাধারণ উদাহরণ:

foreach(Foo *foo in array)
  if (ShouldSpawnBaby(*foo))
    Foo &baby = array.Alloc();
    foo->numBabies++; // crash!

আপনি আরও জটিলতার সাথে কেস কল্পনা করতে পারেন (গভীর কলস্ট্যাকের মতো)। পাত্রে যেমন সমস্ত অ্যারের ক্ষেত্রে এটি সত্য। গেমস তৈরি করার সময়, আমাদের পারফরম্যান্সের বিনিময়ে আকার এবং বাজেটকে বলপূর্বক চাপিয়ে দেওয়ার জন্য আমাদের সমস্যাটির যথেষ্ট বোঝাপড়া থাকে।

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


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

আমি এমন একটি অ্যারের অর্থ যা এর ব্যবহারের সময় আকার পরিবর্তন / মেমোমোভ করে (তার নির্মাণের বিপরীতে)। একটি স্টাইল ভেক্টর হ'ল আমি ডায়নামিক অ্যারে বলি তার একটি উদাহরণ।
জেফ গেটস

@ জেফগেটস সত্যিই এই উত্তর পছন্দ। সবচেয়ে খারাপ ক্ষেত্রে স্ট্যান্ডার্ড কেস রানটাইম ব্যয় হিসাবে গ্রহণ করার ক্ষেত্রে সম্পূর্ণরূপে সম্মত হন। বিদ্যমান অ্যারে ব্যবহার করে ফ্রি লিঙ্কযুক্ত তালিকার ব্যাক করা খুব মার্জিত is প্রশ্ন প্রশ্ন 1: সর্বোচ্চ ব্যবহারের উদ্দেশ্য? প্রশ্ন 2: বরাদ্দকৃত এন্ট্রিগুলির জন্য আইডির নিম্ন-অর্ডার বিটগুলিতে সূচকটি সংরক্ষণ করার উদ্দেশ্য কী? কেন 0 নয়? Q3: কীভাবে এই হ্যান্ডেলটি সত্তা প্রজন্মকে পরিচালনা করে? যদি এটি না হয় তবে আমি Q2 এর নিম্ন-অর্ডার বিটগুলি উত্তর প্রজন্মের গণনার জন্য ব্যবহার করার পরামর্শ দেব। - ধন্যবাদ
ইঞ্জিনিয়ার

1
এ 1: সর্বাধিক ব্যবহৃত আপনাকে আপনার পুনরাবৃত্তিকে ক্যাপ করার অনুমতি দেয়। এছাড়াও আপনি যে কোনও নির্মাণ ব্যয়কে এমোরিটাইজ করুন। এ 2: 1) আপনি প্রায়শই আইটেম -> আইডি থেকে যান। 2) এটি তুলনা সস্তা / সুস্পষ্ট করে তোলে। এ 3: আমি নিশ্চিত নই 'প্রজন্মের' অর্থ কী। আমি এটিকে ব্যাখ্যা করব 'আপনি 6th ষ্ঠ আইটেম থেকে স্লট 7 এ বরাদ্দ থাকা 5 ম আইটেমটি কীভাবে আলাদা করবেন?' যেখানে 5 এবং 6 প্রজন্ম। প্রস্তাবিত স্কিম সমস্ত স্লটের জন্য বিশ্বব্যাপী একটি কাউন্টার ব্যবহার করে। (প্রতিটি আইডিআর্য উদাহরণের জন্য আরও সহজেই আইডিকে আলাদা করার জন্য আমরা এই কাউন্টারটি প্রকৃতপক্ষে শুরু করি)) আমি নিশ্চিত আপনি আইটেম ট্র্যাকিংয়ের জন্য বিটগুলি পুনরায় সঞ্চারিত করতে পারেন।
জেফ গেটস

1
@ জেফগেটস - আমি জানি এটি একটি পুরানো বিষয় তবে আমি সত্যিই এই ধারণাটি পছন্দ করি, আপনি কি আমাকে শূন্য ফ্রি (টি ও) ওভার শূন্য (আইডি) এর অভ্যন্তরীণ কার্যকারিতা সম্পর্কে কিছু তথ্য দিতে পারেন?
TheStatehz

1

এর সঠিক কোনও উত্তর নেই। এটি সমস্তই আপনার অ্যালগরিদমের বাস্তবায়নের উপর নির্ভর করে। আপনি যেটিকে সবচেয়ে ভাল বলে মনে করেন কেবল তার সাথে যান। এই প্রাথমিক পর্যায়ে অনুকূলিত করার চেষ্টা করবেন না।

আপনি যদি প্রায়শই জিনিসগুলি মুছতে থাকেন এবং সেগুলি পুনরায় তৈরি করেন তবে আমি আপনাকে পরামর্শ দিচ্ছি যে কীভাবে অবজেক্ট-পুলগুলি প্রয়োগ করা হয় at

সম্পাদনা করুন: কেন স্লটগুলির সাথে জিনিসগুলিকে জটিল করুন এবং কী নয়। কেন কেবল একটি স্ট্যাক ব্যবহার করে শেষ আইটেমটি পপ করে এটিকে পুনরায় ব্যবহার করবেন না? সুতরাং আপনি যখন একটি যুক্ত করেন, আপনি ++ করবেন, যখন আপনি একটি করবেন তখন পপ করবেন - আপনার শেষ সূচকের উপর নজর রাখতে।


একটি সাধারণ স্ট্যাকের ক্ষেত্রে হ্যান্ডেল হয় না যেখানে আইটেমগুলি স্বেচ্ছামূলকভাবে মুছে ফেলা হয়।
জেফ গেটস

সত্যি কথা বলতে গেলে তার লক্ষ্য ঠিক পরিষ্কার ছিল না। কমপক্ষে আমার কাছে নয়।
সিডার

1

এটি আপনার গেমের উপর নির্ভর করে। নির্দিষ্ট উপাদানগুলিতে অ্যাক্সেস কত দ্রুত হয়, কোনও উপাদান কত দ্রুত সরানো হয় এবং কত দ্রুত কোনও উপাদান যুক্ত করা হয় তার মধ্যে পাত্রে আলাদা।


  • std :: ভেক্টর - দ্রুত অ্যাক্সেস এবং অপসারণ এবং শেষটি যুক্ত করা দ্রুত। শুরু এবং মাঝখানে থেকে সরানো ধীর is
  • স্টাড :: তালিকা - তালিকার উপরে আইট্রেটিং ভেক্টরের চেয়ে খুব ধীর নয় তবে তালিকার নির্দিষ্ট বিন্দুটি অ্যাক্সেস করা ধীর (কারণ পুনরাবৃত্তিটি কেবলমাত্র তালিকার সাথে আপনি করতে পারেন)। যে কোনও জায়গায় আইটেম যুক্ত এবং সরানো দ্রুত। বেশিরভাগ স্মৃতি ওভারহেড। অ ধারাবাহিক।
  • std :: deque - দ্রুত অ্যাক্সেস এবং অপসারণ / শেষ এবং যুক্তিতে যুক্ত করা দ্রুত কিন্তু মাঝখানে ধীর।

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

আপনার যদি সত্যিই প্রচুর সত্ত্বা থাকে তবে আপনার স্পেস পার্টিশনটি একবার দেখে নেওয়া উচিত।


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