কার্যকরভাবে কোনও গেমটিতে মৃত বস্তু থেকে মুক্তি পাচ্ছেন?


10

আমি যখন লুপ বা ফোরচ লুপ ব্যবহার করি তখন আমার সমস্ত বস্তুগুলিকে লুপ করার জন্য যখন সেগুলি আপডেট করতে বা আঁকতে হবে। যাইহোক, যখন কোনও জিনিস মারা যায়, আমি এটি আবার সংগ্রহ থেকে সরিয়ে ফেলা চাই।

আমি বস্তুটিকে একটি মৃত-অবজেক্টের তালিকায় যুক্ত করে এটি করি এবং তারপরে, যখন সমস্ত কিছু আঁকতে এবং আপডেট করা হয়, তখন আমি তালিকার সমস্ত বস্তুগুলিকেও মূল উত্স থেকে সরিয়ে ফেলি।

এটি করার আরও ভাল উপায় আছে?



2
শিরোনামে "আবর্জনা" শব্দের ব্যবহার এবং এখনও পর্যন্ত উত্তরগুলিতে .NET আবর্জনা সংগ্রাহকের উল্লেখ থাকা সত্ত্বেও আবর্জনা সংগ্রহের সাথে এর আসলেই কোনও সম্পর্ক নেই।
অ্যান্ড্রু রাসেল

.NET আবর্জনা সংগ্রাহকের সাথে বিভ্রান্তি রোধ করতে আমি আসলে "আবর্জনা" শব্দটি "মৃত" হিসাবে পরিবর্তন করার জন্য স্বাধীনতা নিয়েছিলাম।
কিছু মনে করবেন না

ওহ আমি এটি সম্পর্কে সচেতন। আবর্জনা সংগ্রহের নিবন্ধটি এখনও প্রাসঙ্গিক কারণ এটি dead মৃত বস্তুগুলির সাথে আপনি কী করেন তা খেলতে পারে। যেমন মৃত ধ্বংসাবশেষ? এটিকে সবকিছু থেকে লিঙ্কযুক্ত করুন, এটিকে ডিফল্টগুলিতে পুনরায় সেট করুন, ধ্বংসস্তূপের বালতিতে আবার রাখুন।
ডপপেলগ্রিনিয়ার

উত্তর:


11

সবার আগে: পরিভাষা। আপনি যদি "আবর্জনা তালিকা" বলে থাকেন, লোকেরা ভাববে আপনি আবর্জনা সংগ্রহকারী সম্পর্কে কথা বলছেন। একে "মৃত তালিকা" বলি।

আপনি সম্ভবত আবিষ্কার করেছেন যেহেতু আপনার প্রশ্ন হিসাবে আপনি কোনও সংগ্রহের মাধ্যমে পুনরাবৃত্তি করার সময় কোনও সংগ্রহ থেকে আইটেমগুলি সরাতে পারবেন না। যদি আপনার সংগ্রহটি হয় List<>তবে এটি থেকে আইটেমগুলি সরিয়ে ফেলার সহজ উপায় হ'ল:

for(int i = list.Count-1; i >= 0; --i)
{
    if(list[i].IsDead)
        list.RemoveAt(i);
}

আপনি পিছনে পুনরাবৃত্তি নোট করুন । আপনি পূর্বে পুনরাবৃত্তি করার সময় আইটেমগুলি সরিয়ে ফেলতে পারেন, তবে এটি মেসরিয়র এবং এর প্রয়োজন একটি goto। আপনি এটি দিয়ে করতে পারবেন না foreach

আপনি হয় আপনার আপডেট লুপ থেকে আলাদা করে অপসারণ করতে পারেন। অথবা আপনি এটিকে আপনার আপডেট লুপের সাথে একীভূত করতে পারেন। RemoveAtলুপের শেষে সর্বদা করুন - লুপের সেই বিন্দুটির পরে, list[i]বৈধ হিসাবে বিবেচনা করা যায় না (এটি পরবর্তী পুনরাবৃত্তিতে আবার বৈধ হয়ে যায়)।

নোট, এছাড়াও, প্রতিটি বস্তুর নিজস্ব IsDeadপতাকা রয়েছে (যদি আপনি নিষ্পত্তির প্যাটার্নটি ব্যবহার করেন তবে আপনি এটি তৈরি করতে পারেন IsDisposed) - আপনাকে আসলে "মৃত তালিকা" বজায় রাখার দরকার নেই।

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

আপনার যদি একটি ব্যতীত অন্য কোনও সংগ্রহ থাকে List<>, তবে সেই সংগ্রহ থেকে মৃত আইটেমগুলি সরিয়ে ফেলতে এখনও একটি মৃত তালিকা তৈরি করা জড়িত থাকতে পারে (কারণ পুনরাবৃত্তির সময় অপসারণ সম্ভব নয়)। আমার মতে, নিখুঁত, নকশা-বুদ্ধিমান, মৃত তালিকাটি ব্যবহারের ঠিক আগে তৈরি করা, সংগ্রহগুলি পুনরুদ্ধার করে ফ্ল্যাশগুলির সন্ধানের IsDeadপরিবর্তে বস্তুগুলিকে হত্যা করার কারণে তালিকাটি বজায় রাখার চেষ্টা না করে।

একবার আপনি একটি মৃত তালিকার সাথে সমাপ্ত হয়ে গেলে, আপনার Clear()এটি করা উচিত এবং পরে এটিকে পুনরায় ব্যবহারের জন্য এটিকে প্রায় রাখুন।


তাহলে ডিসপোজেবল প্যাটার্নটিকে আরও 'কার্যকর' মনে করা হয়?
জোনাথন কনেল

@ জোনাথন: আমি আপনার প্রশ্নটি বুঝতে পারি না। IsDeadপ্যাটার্ন বৈশিষ্ট্যগুলি অভিন্ন IsDisposed। শব্দার্থগতভাবে ব্যবহার করে IsDeadবোঝা যাচ্ছে যে আপনি এই বিষয়গুলির একটি অঙ্কন / আপডেট তালিকা বজায় রেখেছেন যা পরে এটির থেকে মৃত আইটেমগুলি সরিয়ে ফেলবে। নিষ্পত্তি প্যাটার্ন যে বোঝায় না। অধিকন্তু, নিষ্পত্তি প্যাটার্ন নেই পরোক্ষভাবে আপনি যে বস্তু দ্বারা অনুষ্ঠিত অপরিচালিত সম্পদ থাকতে পারে (যা সাধারণত গেমপ্লের অবজেক্টের জন্য উপযুক্ত নয়)।
অ্যান্ড্রু রাসেল

বিপরীত ব্যবহার করে আপনি ভবিষ্যদ্বাণী দিয়ে এটি করতে পারেন।
shinzou

0

99.9% সময়ের মধ্যে, আবর্জনা সংগ্রহকারী (জিসি) কোনও ঝামেলা ছাড়াই সবকিছুর যত্ন নেবে। একবার আপনি those অবজেক্টগুলি মুছে / নিল করার পরে কেবল এটির কাজটি করতে দিন। ক্লিনআপে একটি বিলম্ব রয়েছে যা বিভিন্ন কারণের উপর নির্ভর করে (উদাহরণস্বরূপ মেমরির কতগুলি ব্লক বরাদ্দ করা হয়েছে) তবে আপনাকে সাধারণত এটি সম্পর্কেও জানতে হবে না, এটি সম্পর্কে কেবল উদ্বিগ্ন হওয়া উচিত। এটি শুধু কাজ করার জন্য ডিজাইন করা হয়েছে। কোনটি কারণে আপনি সি # ব্যবহার করছেন না এবং সি নয় is

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


সুতরাং আমি যদি আমার আপডেট () কলটিতে প্রতিবার ব্যবহার করছি এমন একটি তালিকা আমার কাছে থাকে, তবে উপাদানটি "নাল" রয়েছে এমন সমস্ত উপাদান স্বয়ংক্রিয়ভাবে পরিষ্কার হয়ে যাবে এবং সরানো হবে?
ম্যাথিয়াস লাইককেগার্ড লরেনজেন

@ ম্যাথিয়াস নং আপনার প্রশ্নে আমার মন্তব্য দেখুন। আবর্জনা সংগ্রহকারী আপনার সংগ্রহ এবং এর সামগ্রীগুলি সহ - আপনি এখনও অ্যাক্সেস করতে পারবেন এমন কোনও কিছুই সংশোধন করবে না।
অ্যান্ড্রু রাসেল

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