আপনি কীভাবে স্মৃতিশক্তির বাইরে যাওয়ার জন্য প্রস্তুতি নিচ্ছেন?


18

এটি ভাল সংজ্ঞায়িত স্কোপ সহ গেমগুলির পক্ষে সহজ হতে পারে, তবে প্রশ্নটি স্যান্ডবক্স গেমস সম্পর্কে, যেখানে প্লেয়ারকে কিছু তৈরি এবং তৈরি করার অনুমতি দেওয়া হয় ।

সম্ভাব্য কৌশল:

  • উপরের সীমা সহ মেমরি পুলগুলি ব্যবহার করুন।
  • পর্যায়ক্রমে আর প্রয়োজন হয় না এমন জিনিসগুলি মুছুন।
  • শুরুতে অতিরিক্ত পরিমাণ মেমরি বরাদ্দ করুন যাতে এটি পুনরুদ্ধার প্রক্রিয়া হিসাবে পরে মুক্তি দেওয়া যায়। আমি প্রায় 2-4 এমবি বলতে চাই।

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

দয়া করে মনে রাখবেন যে আমি কার্যকর সি ++ আইটেম 7 নিয়ে "মেমোরির বাইরে থাকা পরিস্থিতিগুলির জন্য প্রস্তুত থাকি " কথা বলছি না , যদিও এটি প্রাসঙ্গিক, আমি গেম বিকাশের সাথে সম্পর্কিত আরও একটি উত্তর দেখতে চাই, যেখানে সাধারণত আপনার কিসের উপর আরও নিয়ন্ত্রণ থাকে ঘটছে।

প্রশ্নের সংক্ষিপ্তসার হিসাবে, আপনি যখন সীমাবদ্ধ মেমোরি কনসোল / মোবাইলের সাথে একটি প্ল্যাটফর্ম লক্ষ্য করছেন, আপনি কীভাবে স্যান্ডবক্স গেমসের জন্য মেমরির অবস্থার বাইরে চলে যাবেন?


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

@ ফিলিপ হ্যাঁ আমি জানি। তবে আমার প্রশ্নটি কনসোল এবং মোবাইলের মতো মেমোরি সীমিত ডিভাইসের দিকে বেশি আমার মনে হয় আমি এটি উল্লেখ করেছি।
ধারনা

এটি একটি মোটামুটি বিস্তৃত প্রশ্ন (এবং এর পোষ্টের মতোভাবে পোল দেওয়ার মতো)। একক পরিস্থিতিতে আরও নির্দিষ্ট হওয়ার জন্য আপনি কি সুযোগকে কিছুটা সঙ্কুচিত করতে পারেন?
মাইকেলহাউস

@ বাইট 56 আমি প্রশ্নটি সম্পাদনা করেছি। আমি আশা করি এটির আরও সংজ্ঞাগত সুযোগ রয়েছে।
ধারণা 3d

উত্তর:


16

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

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

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

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

allocate(bytes):
  if can_allocate(bytes):
    return internal_allocate(bytes)
  else:
    warning(LOW_MEMORY)
    tell_systems_to_dump_caches()

    if can_allocate(bytes):
      return internal_allocate(bytes)
    else:
      fatal_error(OUT_OF_MEMORY)

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

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

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


এই উত্তরের জন্য +1। আমি দুটি সিস্টেম লিখেছি যা শন স্টাইল এবং বিচ্ছিন্ন মেমরি পুল ব্যবহার করে কাজ করে এবং তারা উভয়ই উত্পাদন ভাল কাজ শেষ করে। প্রথমটি এমন স্প্যানার যা আউটপুটটি সর্বাধিক সীমাতে বন্ধের দিকে ঘুরিয়ে দেয় যাতে প্লেয়ারটি কখনই হঠাৎ হ্রাস লক্ষ্য করে না (ভেবেছিল মোট সুরক্ষার ব্যবধানে মোট থ্রুটপুটটি হ্রাস পেয়েছে)। দ্বিতীয়টি খণ্ডগুলির সাথে সম্পর্কিত ছিল যে একটি ব্যর্থ বরাদ্দ পরিশোধ এবং পুনর্বাসনকে বাধ্য করবে। আমি অনুভব করি যে ** একটি অত্যন্ত সীমাবদ্ধ এবং নিয়ন্ত্রিত বিশ্ব যা সর্বদা সীমিত মেমোরিতে নিখুঁতভাবে কাজ করে ** দীর্ঘকাল ধরে চলমান কোনও ক্লায়েন্টের পক্ষে অত্যাবশ্যক।
প্যাট্রিক হিউজ 21

ডিবাগ বিল্ডগুলিতে ত্রুটি পরিচালনা করে যতটা সম্ভব আক্রমণাত্মক হওয়ার কথা উল্লেখ করার জন্য +1। মনে রাখবেন যে ডিবাগ কনসোল হার্ডওয়্যারে আপনার মাঝে মাঝে খুচরা থেকেও বেশি সংস্থান ব্যবহার করতে পারে। আপনি খুচরা ডিভাইসগুলির উপরের ঠিকানার জায়গায় কেবলমাত্র ডিবাগ অবজেক্টগুলিকে বরাদ্দ করে এবং খুচরা-সমতুল্য ঠিকানার স্থান ব্যবহার করার সময় ক্র্যাশ করে ডিভাইস হার্ডওয়্যারে এই শর্তগুলি নকল করতে চাইতে পারেন।
ফ্লিন্টজএ

5

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

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

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


1

ঠিক আছে, আপনি প্রায় 16 টি MiB বরাদ্দ করতে পারেন (কেবলমাত্র 100% নিশ্চিত হতে) .bssসংকলনের সময় এবং এমনকি একটি "নিরাপদ বরাদ্দকারী" ব্যবহার করুন, যেমন একটি স্বাক্ষর সহ inline __attribute__((force_inline)) void* alloc(size_t size)( __attribute__((force_inline))একটি জিসিসি / mingw-w64বৈশিষ্ট্য যা সমালোচনামূলক কোড বিভাগগুলির অন্তর্নিহিতকে জোর করে এমনকি অপ্টিমাইজেশন, অক্ষম করা হয়েছে যদিও তারা গেম জন্য সক্ষম করা আবশ্যক হলে) পরিবর্তে mallocযে চেষ্টা void* result = malloc(size)এবং এটি যদি ব্যর্থ হয়, তাহলে ড্রপ ক্যাশে, খুচরা মেমরি মুক্ত (অথবা ব্যবহার করতে অন্য কোড বলুন .bssজিনিস কিন্তু যে এই উত্তরের জন্য সুযোগ বাইরে) এবং সংরক্ষণ না করা ডেটা ফ্লাশ করুন (ডিস্কে বিশ্বকে বাঁচান, যদি আপনি খণ্ডগুলির একটি মাইনক্রাফ্টের মতো ধারণা ব্যবহার করেন তবে এর মতো কিছু কল করুন saveAllModifiedChunks())। তারপরে, যদি malloc(16777216)(এই 16 টি এমআইবি আবার বরাদ্দ করা হয়) ব্যর্থ হয় (আবার, এর জন্য এনালগ দিয়ে প্রতিস্থাপন করুন .bss), গেমটি বন্ধ করুন এবং প্রদর্শন করুনMessageBox(NULL, "*game name* couldn't continue because of lack of free memory, but your world was safely saved. Try closing background applications and restarting the game", "*Game name*: out of memory", MB_ICONERROR)বা প্ল্যাটফর্ম নির্দিষ্ট বিকল্প। সবগুলোকে একত্রে রাখ:

__attribute__((force_inline)) void* alloc(size_t size) {
    void* result = malloc(size); // Attempt to allocate normally
    if (!result) { // If the allocation failed...
        if (!reserveMemory) std::_Exit(); // If alloc() was called from forceFullSave() or reportOutOfMemory() and we again can't allocate, just quit, something is stealing all our memory. If we used the .bss approach, this wouldn't've been necessary.
        free(reserveMemory); // Global variable, pointer to the reserve 16 MiB allocated on startup
        forceFullSave(); // Saves the game
        reportOutOfMemory(); // Platform specific error message box code
        std::_Exit(); // Close silently
    } else return result;
}

ব্যর্থ হলে std::set_new_handler(myHandler)যেখানে ডাকা myHandlerহয় তার সাথে আপনি অনুরূপ সমাধান ব্যবহার করতে পারেন :void myHandler(void)new

void newerrhandler() {
    if (!reserveMemory) std::_Exit(); // If new was called from forceFullSave() or reportOutOfMemory() and we again can't allocate, just quit, something is stealing all our memory. If we used the .bss approach, this wouldn't've been necessary.
    free(reserveMemory); // Global variable, pointer to the reserve 16 MiB allocated on startup
    forceFullSave(); // Saves the game
    reportOutOfMemory(); // Platform specific error message box code
    std::_Exit(); // Close silently
}

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