ভাগ্যক্রমে, আপনি চিহ্নিত হিসাবে, কমপ্যাক্ট মনো একটি প্রজন্মের জিসি ব্যবহার করে (উইনমো / উইনফোন / এক্সবক্সের মতো মাইক্রোসফ্টগুলির সাথে একেবারে বিপরীতে), যারা কেবল একটি ফ্ল্যাট তালিকা বজায় রাখে।
যদি আপনার গেমটি সহজ হয় তবে জিসি এটি ঠিকঠাকভাবে পরিচালনা করতে পারে তবে এখানে কয়েকটি পয়েন্টার রয়েছে যা আপনি দেখতে চাইতে পারেন।
অকাল অপটিমাইজেশন
প্রথমে নিশ্চিত করে নিন এটি ঠিক করার চেষ্টা করার আগে এটি আসলে আপনার জন্য সমস্যা।
পুলিং ব্যয়বহুল রেফারেন্স প্রকারগুলি
আপনার প্রায়শই তৈরি হওয়া রেফারেন্সের ধরণের আপনার উচিত, বা যার গভীর কাঠামো রয়েছে। প্রত্যেকটির উদাহরণ হ'ল:
- প্রায়ই তৈরী করা হয়েছে: একটি
Bullet
একটি বস্তুর বুলেট-জাহান্নাম খেলা ।
- গভীর কাঠামো: একটি এআই বাস্তবায়নের জন্য সিদ্ধান্ত গাছ।
Stack
আপনার পুল হিসাবে এটি ব্যবহার করা উচিত (বেশিরভাগ বাস্তবায়ন যা এ ব্যবহার করে এর বিপরীতে Queue
)। এর কারণ হ'ল Stack
যদি আপনি পুলটিতে কোনও বস্তু ফিরিয়ে দেন এবং তাৎক্ষণিকভাবে অন্য কোনও জিনিস এটি ধরে ফেলে; এটির সক্রিয় পৃষ্ঠায় থাকার অনেক বেশি সম্ভাবনা থাকবে - বা আপনি ভাগ্যবান হলে এমনকি সিপিইউ ক্যাশেও। এটা ঠিক যে সামান্য বিট দ্রুত। তদাতিরিক্ত আপনার পুলগুলি সর্বদা আকার-সীমাবদ্ধ করুন (আপনার সীমা অতিক্রম করা হলে কেবল 'চেকিনগুলি উপেক্ষা করুন)।
এগুলি সাফ করার জন্য নতুন তালিকাগুলি তৈরি করা এড়িয়ে চলুন
আপনি List
যখন Clear()
এটি বোঝাতে চেয়েছিলেন তখন কোনও নতুন তৈরি করবেন না । আপনি ব্যাকএন্ড অ্যারে পুনরায় ব্যবহার করতে পারবেন এবং অ্যারের বরাদ্দ এবং কপিগুলির একটি লোড সংরক্ষণ করতে পারেন। একইভাবে এই চেষ্টা করুন এবং একটি অর্থবহ প্রাথমিক ক্ষমতার তালিকা তৈরি করুন (মনে রাখবেন, এটি কোনও সীমা নয় - কেবল একটি শুরুর ক্ষমতা) - এটি সঠিক হওয়ার দরকার নেই, কেবল একটি অনুমানের। এটি মূলত যে কোনও সংগ্রহের ধরণের ক্ষেত্রে প্রযোজ্য - এগুলি বাদ দিয়ে LinkedList
।
সম্ভব যেখানে স্ট্রাক্ট অ্যারে (বা তালিকা) ব্যবহার করুন
আপনি যদি স্ট্র্যাটেজগুলির মধ্যে পাস করে থাকেন তবে ব্যবহারের স্ট্রাক্টগুলি (বা সাধারণভাবে মান ধরণের) থেকে আপনি কিছুটা উপকার পাবেন। উদাহরণস্বরূপ, বেশিরভাগ 'ভাল' কণার সিস্টেমে পৃথক কণাগুলি একটি বিশাল অ্যারেতে সংরক্ষণ করা হয়: কণার পরিবর্তে অ্যারে এবং সূচকটি চারপাশে চলে যায়। এটি এত ভালভাবে কাজ করার কারণ হ'ল জিসি যখন অ্যারে সংগ্রহ করার প্রয়োজন হয় তখন বিষয়গুলি সম্পূর্ণভাবে এড়িয়ে যেতে পারে (এটি একটি আদিম অ্যারে - এখানে কিছু করার নেই)। সুতরাং 10 000 বস্তুর দিকে না তাকানোর পরিবর্তে জিসিটিকে কেবল 1 টি অ্যারের দিকে নজর দেওয়া দরকার: বিশাল লাভ! আবার এটি কেবল মান ধরণের সাথে কাজ করবে ।
রায়টি এর পরে। কিছু কার্যকর এবং গঠনমূলক প্রতিক্রিয়া সরবরাহ করেছি আমার মনে হয় এর আরও আরও প্রসারিত করা আমার প্রয়োজন। আপনি কেবল তখনই এই কৌশলটি ব্যবহার করতে পারেন যখন আপনি প্রচুর পরিমাণে সত্তা (হাজার থেকে হাজার হাজার) ডিল করছেন। এছাড়াও এটি অবশ্যই এমন একটি কাঠামো হতে হবে যার কোনও রেফারেন্স ধরণের ক্ষেত্র থাকতে হবে না এবং অবশ্যই স্পষ্টভাবে টাইপ করা অ্যারেতে থাকতে হবে। তার প্রতিক্রিয়ার বিপরীতে আমরা এটিকে একটি অ্যারেতে রাখছি যা খুব সম্ভবত একটি শ্রেণীর ক্ষেত্র - যার অর্থ এটি গাদাটি অবতরণ করতে চলেছে (আমরা একটি গাদা বরাদ্দ এড়াতে চাইছি না - কেবল জিসি কাজ এড়ানো হচ্ছে)। আমরা সত্যিই যত্ন নিই এটি সত্য যে এটি প্রচুর মূল্যবোধের সাথে স্মৃতির একটি সংক্ষিপ্ত অংশ যা জিসি কেবল O(1)
অপারেশনের পরিবর্তে কোনও O(n)
অপারেশনে দেখতে পারে।
বিভাজন ঘটার সম্ভাবনা হ্রাস করতে , বা জিসি এই খণ্ডগুলিকে চারপাশে সরানোর চেষ্টা করার জন্য অতিরিক্ত কাজ করার জন্য আপনার অ্যাপ্লিকেশন প্রারম্ভের খুব কাছাকাছি এই অ্যারেগুলিও বরাদ্দ করা উচিত , (এবং বিল্ট-ইন টাইপের পরিবর্তে হাইব্রিড লিঙ্কযুক্ত তালিকার সাহায্যে বিবেচনা করুন) List
)।
GC.Collect ()
প্রজন্মের জিসির সাথে নিজেকে পায়ের মধ্যে গুলি করার জন্য এটি অবশ্যই সেরা উপায় (দেখুন: "পারফরম্যান্স বিবেচনা")। আপনি কেবল তখনই কল করতে পারেন যখন আপনি অত্যধিক পরিমাণে আবর্জনা তৈরি করেছেন - এবং এটির কারণ হ'ল একটি বিষয় হ'ল আপনি কোনও স্তরের জন্য সামগ্রী লোড করার ঠিক পরে - এবং তারপরে আপনার সম্ভবত প্রথম প্রজন্মকে সংগ্রহ করা উচিত ( ) আশা করি তৃতীয় প্রজন্মের অবজেক্টগুলিকে প্রচার করা রোধ করতে।GC.Collect(0);
আইডিস্পোজেবল এবং ফিল্ড নুলিং
যখন আপনার আর কোনও অবজেক্টের প্রয়োজন হবে না তখন ক্ষেত্রগুলি বাতিল করে দেওয়া সার্থক। জিসি কীভাবে কাজ করে তার বিশদটির কারণ: এটি কেবলমাত্র সেই বস্তুগুলি সরিয়ে দেয় যা মূল নয় (যদিও রেফারেন্স করা হয়) এমনকি যদি সেই বস্তুটি বর্তমান সংগ্রহে অন্যান্য বস্তু অপসারণের কারণে অরোট করা হত ( দ্রষ্টব্য: এটি জিসির উপর নির্ভর করে ব্যবহারে স্বাদ - কিছু আসলে চেইনগুলি পরিষ্কার করে)। এছাড়াও, যদি কোনও বস্তু কোনও সংগ্রহে বেঁচে থাকে তবে তা তাত্ক্ষণিকভাবে পরবর্তী প্রজন্মের কাছে প্রচার করা হয় - এর অর্থ হ'ল ক্ষেত্রের চারপাশে থাকা কোনও বস্তু সংগ্রহের সময় প্রচার করা হবে। প্রতিটি ধারাবাহিক প্রজন্ম সংগ্রহ করা তাত্পর্যপূর্ণভাবে আরও ব্যয়বহুল (এবং খুব কমই ঘটে)।
নিম্নলিখিত উদাহরণটি ধরুন:
MyObject (G1) -> MyNestedObject (G1) -> MyFurtherNestedObject (G1)
// G1 Collection
MyNestObject (G2) -> MyFurtherNestedObject (G2)
// G2 Collection
MyFurtherNestedObject (G3)
যদি MyFurtherNestedObject
কোনও মাল্টি-মেগাবাইট অবজেক্ট থাকে তবে আপনি গ্যারান্টিযুক্ত হতে পারেন জিসি বেশিক্ষণ এটি দেখবেন না - কারণ আপনি অজান্তেই এটি জি 3 তে প্রচার করেছেন। এই উদাহরণের সাথে এর বিপরীতে:
MyObject (G1) -> MyNestedObject (G1) -> MyFurtherNestedObject (G1)
// Dispose
MyObject (G1)
MyNestedObject (G1)
MyFurtherNestedObject (G1)
// G1 Collection
ডিসপোজার প্যাটার্ন আপনাকে অবজেক্টগুলিকে তাদের ব্যক্তিগত ক্ষেত্রগুলি সাফ করার জন্য অনুমানযোগ্য উপায় সেট আপ করতে সহায়তা করে। উদাহরণ স্বরূপ:
public class MyClass : IDisposable
{
private MyNestedType _nested;
// A finalizer is only needed IF YOU CONTROL UNMANAGED RESOURCES
// ~MyClass() { }
public void Dispose()
{
_nested = null;
}
}