একা তালিকায় সমস্ত গেমের বিষয়বস্তু সংরক্ষণ করা কি একটি গ্রহণযোগ্য ডিজাইন?


24

আমি যে প্রতিটি গেম তৈরি করেছি তার জন্য আমি আমার সমস্ত গেমের অবজেক্ট (বুলেট, গাড়ি, খেলোয়াড়) একক অ্যারে তালিকায় রেখেছি, যা আমি আঁকতে এবং আপডেট করার জন্য লুপ করছি। প্রতিটি সত্তার জন্য আপডেট কোডটি এটি শ্রেণীর মধ্যে সংরক্ষণ করা হয়।

আমি ভাবছিলাম, জিনিসগুলি নিয়ে যাওয়ার জন্য এটিই কি সঠিক উপায়, না একটি দ্রুততর দক্ষ উপায়?


4
আমি লক্ষ্য করেছি আপনি এটি বলে ধরেছেন "অ্যারে তালিকা" this নেট, আপনার পরিবর্তে কোনও তালিকায় <T> আপগ্রেড করা উচিত। এটি প্রায় অভিন্ন, একটি তালিকা <T> টাইপ-স্ট্রং ব্যতীত এবং আপনাকে যখনই কোনও উপাদান অ্যাক্সেস করতে হবে তখনই আপনাকে কাস্ট টাইপ করতে হবে না। এখানে দস্তাবেজটি রয়েছে: এমএসডিএন.মাইক্রোসফটকম /en-us/library/6sh2ey19.aspx
জন ম্যাকডোনাল্ড

উত্তর:


26

সঠিক উপায় নেই। আপনি যা কাজ করছেন তা বর্ণনা করছেন এবং সম্ভবত এটি যথেষ্ট দ্রুত যা আপনার নকশা সম্পর্কে উদ্বিগ্ন বলে মনে হচ্ছে কারণ আপনি এটি জিজ্ঞাসা করছেন বলে মনে হয় না কারণ এটি আপনার কার্য সম্পাদনের সমস্যাগুলির কারণ। সুতরাং এটি একটি সঠিক উপায়, নিশ্চিত।

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

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

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


16

অন্যরা যেমন বলেছে, এটি যদি দ্রুত পর্যাপ্ত হয় তবে তা যথেষ্ট দ্রুত। আপনি যদি ভাবছেন যে এর থেকে আরও ভাল উপায় আছে কিনা, নিজেকে জিজ্ঞাসা করার প্রশ্নটি

আমি কি নিজেকে সমস্ত অবজেক্টের মধ্য দিয়ে পুনরাবৃত্তি করতে দেখি তবে কেবল সেগুলির একটি উপসেটে কাজ করছি?

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

এটি আপনাকে যে সমস্ত অবজেক্টগুলি লুপ করবে তার সংখ্যা হ্রাস করবে এবং অপ্রয়োজনীয় চেকগুলি এড়িয়ে যাবে কারণ আপনি ইতিমধ্যে জানেন যে তালিকার সমস্ত অবজেক্টকে প্রক্রিয়াজাত করা হবে।

আপনি অনেক বেশি পারফরম্যান্স লাভ করছেন কিনা তা দেখতে আপনাকে এটির প্রোফাইল দিতে হবে।


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

8

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

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

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

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

গেমের বিষয়গুলি আপডেট করা হচ্ছে

গেম ইঞ্জিন আর্কিটেকচারের একটি অংশ এখানে দেওয়া যা আমি পড়ার পরামর্শ দেব:

আন্তঃ-অবজেক্ট নির্ভরতার উপস্থিতিতে, উপরে বর্ণিত পর্যায়ক্রমিক আপডেট কৌশলটি কিছুটা সামঞ্জস্য করতে হবে। এর কারণ আন্ত-অবজেক্ট নির্ভরতা আপডেটের ক্রম নিয়ন্ত্রক বিরোধী নিয়ম হতে পারে।

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

এখানে চিত্র বর্ণনা লিখুন

গেম অবজেক্টস রেন্ডারিং

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

এখানে চিত্র বর্ণনা লিখুন

অন্যান্য কারণগুলি উদাহরণস্বরূপ হতে পারে, আপনার অবজেক্টগুলিকে এমনভাবে সাজানোর জন্য একটি স্থানিক পার্টিশনিং ডেটা কাঠামো ব্যবহার করে যা ভিউ হতাশায় কুলিংয়ের দক্ষতার উন্নতি করে।


4

উত্তরটি "হ্যাঁ, এটি ঠিক আছে" fine যখন আমি বড় লোহার সিমুলেশনগুলিতে কাজ করি যেখানে পারফরম্যান্সটি অ-আলোচনাযোগ্য হয়, তখন আমি এক বিরাট ফ্যাট (বিআইজি এবং FAT) বৈশ্বিক অ্যারেতে সমস্ত কিছু দেখে অবাক হয়ে যাই। পরে আমি একটি ওও সিস্টেমে কাজ করেছি এবং দুটির তুলনা করতে পেরেছি। এটি অত্যন্ত কুৎসিত হলেও, ডিবাগ-এ সংকলিত সিঙ্গল-থ্রেডযুক্ত সমতল পুরাতন সি-র সংস্করণ "তাদের সকলের শাসন করার জন্য একটি অ্যারে " সি ++ তে "সুন্দরী" মাল্টিথ্রেডেড ওও সিস্টেম সংকলন -O2 এর চেয়ে কয়েকগুণ দ্রুত ছিল । আমি মনে করি এটির কিছুটা বিগ ফ্যাট-অ্যারে সংস্করণে দুর্দান্ত ক্যাশে লোকাল (স্থান এবং সময় উভয় ক্ষেত্রেই) করতে হয়েছিল।

আপনি যদি পারফরম্যান্স চান, একটি বড় ফ্যাট গ্লোবাল সি অ্যারে উপরের আবদ্ধ হতে চলেছে (অভিজ্ঞতা থেকে)।


2

মূলত আপনি যা করতে চান তা আপনার প্রয়োজন অনুসারে তালিকা তৈরি করা need আপনি যদি একসাথে সমস্ত অঞ্চলের অবজেক্টগুলিকে পুনরায় আঁকেন, কেবল সেগুলির একটি তালিকা কার্যকর হতে পারে। তবে এটির পক্ষে মূল্যবান হওয়ার জন্য আপনার দশ হাজার হাজার এবং ভূখণ্ড নয় এমন অনেকগুলি 10,000 টি জিনিস দরকার । অন্যথায় আপনার সমস্ত কিছু তালিকাভুক্ত করা এবং ভূখণ্ডের জিনিসগুলি খুঁজে বের করতে "যদি" ব্যবহার করা যথেষ্ট দ্রুত যথেষ্ট।

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

অ্যারে সম্পর্কিত একটি শব্দ: তারা অবিশ্বাস্যভাবে দ্রুত। কিন্তু যখন তারা প্রায় 100,000 উপাদানগুলি পেয়ে যায় তারা জঞ্জাল সংগ্রহকারীদের ফিট দিতে শুরু করে। আপনি যদি একবার জায়গা বরাদ্দ করতে পারেন এবং এটির পরে এটি স্পর্শ না করেন তবে ঠিক আছে। তবে আপনি যদি ক্রমাগত অ্যারে প্রসারিত করে থাকেন তবে আপনি ক্রমাগত বড় মাপের স্মৃতি বরাদ্দ এবং মুক্ত করছেন এবং আপনার গেমটি একবারে কয়েক সেকেন্ডের জন্য স্থির রাখতে এবং মেমরির ত্রুটির সাথে ব্যর্থ হওয়ার জন্যও প্রস্তুত।

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

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

অন্য কথায়, আপনি যা করছেন তা কেবল চালিয়ে যান। আপনার বৃহত্তম সীমা সম্ভবত আপনার নিজের সময় এবং আপনি এটির সর্বোত্তম ব্যবহার করতে চলেছেন।


আমি সত্যিই ভাবি না যে একটি লিঙ্কযুক্ত তালিকা কোনও আকারে একটি অ্যারেকে ছাড়িয়ে যাবে, যতক্ষণ না আপনি প্রায়শই মাঝারি থেকে স্টাফ যোগ করেন বা সরিয়ে না দেন।
Zan Lynx

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

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

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

1

আমি সাধারণ গেমগুলির জন্য কিছুটা অনুরূপ পদ্ধতি ব্যবহার করেছি। নিম্নলিখিত শর্তগুলি সত্য হলে এক অ্যারেতে সমস্ত সংরক্ষণ করা খুব কার্যকর is

  1. আপনার কাছে অল্প সংখ্যক বা সর্বাধিক গেমের অবজেক্ট রয়েছে
  2. আপনি পারফরমেন্সের তুলনায় সরলতার পক্ষে (যেমন: গাছের মতো আরও অনুকূলিত হওয়া ডেটা স্ট্রাকচারগুলি সমস্যার পক্ষে মূল্যহীন নয়)

যাই হোক না কেন, আমি এই সমাধানটি একটি স্থির আকারের অ্যারে হিসাবে প্রয়োগ করি যাতে একটি gameObject_ptrস্ট্রাক্ট থাকে। এই স্ট্রাক্টটিতে গেম অবজেক্টের নিজেই একটি পয়েন্টার রয়েছে এবং বস্তুটি "জীবিত" কিনা তা উপস্থাপন করে এমন একটি বুলিয়ান মান।

বুলিয়ান এর উদ্দেশ্য হ'ল সৃষ্টি এবং মোছার ক্রিয়াকলাপ। গেম অবজেক্টগুলি সিমুলেশন থেকে সরানো হলে ধ্বংস করার পরিবর্তে, আমি কেবল "জীবন্ত" পতাকাটি সেট করব false

বস্তুগুলিতে গণনা করার সময়, কোডটি অ্যারে দিয়ে লুপ করত, "জীবিত" হিসাবে চিহ্নিত বস্তুর উপর গণনা সম্পাদন করত এবং কেবল "জীবিত" চিহ্নিত চিহ্নগুলিকে রেন্ডার করা হত।

আর একটি সাধারণ অপ্টিমাইজেশান হ'ল অবজেক্ট টাইপ করে অ্যারে সাজানো। উদাহরণস্বরূপ, সমস্ত বুলেট অ্যারের শেষ এন কোষে থাকতে পারে । তারপরে, সূচকের মান বা অ্যারের উপাদানটিতে একটি পয়েন্টার সহ একটি int সংরক্ষণ করে, নির্দিষ্ট প্রকারগুলি হ্রাস ব্যয়ে রেফারেন্স করা যেতে পারে।

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

এটা আমার প্রথম পোস্ট! আমি আশা করি এটি আপনার প্রশ্নের জবাব দিয়েছে!


প্রথম পোস্ট! হ্যাঁ!
টিলি

0

এটি গ্রহণযোগ্য, যদিও অস্বাভাবিক। "দ্রুত" এবং "আরও দক্ষ" এর মতো পদগুলি আপেক্ষিক; প্রোগ্রামিংয়ের কাজটিকে আরও সুসংহত করার জন্য সাধারণত আপনি গেমের বিষয়গুলি পৃথক বিভাগে (তাই বুলেটের জন্য একটি তালিকা, শত্রুদের জন্য একটি তালিকা ইত্যাদি) সংগঠিত করবেন তবে কম্পিউটারের মতো সমস্ত বস্তুর দ্রুত লুপ হবে না like ।


2
সবচেয়ে XNA গেম পরিপ্রেক্ষিতে সত্য যথেষ্ট, কিন্তু আপনার বস্তু সংগঠিত করতে আসলে তাদের মাধ্যমে iterating করা দ্রুততর: একই ধরণের বস্তু আরো অনেক কিছু আপনার CPU- র নির্দেশিকা ও ডেটা ক্যাসে আঘাত করার সম্ভাবনা বেশি। ক্যাশে মিস করা ব্যয়বহুল, বিশেষত কনসোলগুলিতে। উদাহরণস্বরূপ Xbox 360 এ, একটি এল 2 ক্যাশে মিস আপনার জন্য ~ 600 চক্রের দাম পড়বে। এটি টেবিলে প্রচুর পারফরম্যান্স রেখে চলেছে। এটি এমন এক স্থানে যেখানে পরিচালিত কোডের স্থানীয় কোডের তুলনায় একটি সুবিধা রয়েছে: সময় মতো একসাথে বরাদ্দ করা অবজেক্টগুলি স্মৃতিতেও ঘনিষ্ঠ হবে এবং আবর্জনা সংগ্রহের সাথে পরিস্থিতি উন্নতি হয় (সংযোগ)।
ক্রনিক গেম প্রোগ্রামার

0

আপনি একক অ্যারে এবং অবজেক্ট বলেন।

সুতরাং (আপনার কোডটি না দেখে) আমি অনুমান করছি যে তারা সবাই 'uberGameObject' এর সাথে সম্পর্কিত।

তাই হয়ত দুটো সমস্যা।

1) আপনার কাছে কোনও ''শ্বর' অবজেক্ট থাকতে পারে - টন স্টাফ করে না, এটি যা করে তা আসলে ভাগ করে না।

2) আপনি এই তালিকাটি পুনরাবৃত্তি এবং টাইপ করতে কাস্টিং? বা প্রতিটি আনবক্সিং। এটির একটি বড় পারফরম্যান্স পেনাল্টি রয়েছে।

তাদের নিজস্ব দৃ strongly়ভাবে টাইপ করা তালিকায় বিভিন্ন ধরণের (বুলেট, খারাপ লোক ইত্যাদি) ভাঙ্গার কথা বিবেচনা করুন।

List<BadGuyObj> BadGuys = new List<BadGuyObj>();
List<BulletsObj> Bullets = new List<BulletObj>();

 //Game 
OnUpdate(gameticks gt)
{  foreach (BulletObj thisbullet in Bullets) {thisbullet.Update();}  // much quicker.

যদি কিছু সাধারণ বেস-ক্লাস বা ইন্টারফেস থাকে যেখানে এমন সমস্ত পদ্ধতি রয়েছে যা আপডেট লুপে ডাকা হবে (যেমন। update()) যদি টাইপ কাস্টিং করার দরকার হয় না ।
bummzack

0

আমি সাধারণ একক তালিকা এবং প্রতিটি বস্তুর প্রকারের জন্য পৃথক তালিকার মধ্যে কিছু সমঝোতার প্রস্তাব দিতে পারি।

একাধিক তালিকায় একটি অবজেক্টের রেফারেন্স রাখুন। এই তালিকা বেস আচরণ দ্বারা সংজ্ঞায়িত করা হয়। উদাহরণস্বরূপ, MarineSoldierবস্তু রেফারেন্সড করা হবে PhysicalObjList, GraphicalObjList, UserControlObjList, HumanObjList। সুতরাং, যখন আপনি পদার্থবিজ্ঞান প্রক্রিয়া করেন, আপনি পুনরাবৃত্তি করেন PhysicalObjList, যখন প্রক্রিয়াটি বিষ থেকে ক্ষতিকারক হয় - HumanObjList, যদি সোলাইজার মারা যায় - এটিকে সরিয়ে ফেলুন HumanObjListতবে প্রবেশ করুন PhysicalObjList। এই প্রক্রিয়াটি কাজ করার জন্য আপনাকে যখন স্বয়ংক্রিয় সন্নিবেশ / অপসারণ অবজেক্ট তৈরি করা / মুছে ফেলা হয় তখন তাকে সংগঠিত করতে হবে।

পদ্ধতির সুবিধা:

  • বস্তুর টাইপ করা সংস্থা ( AllObjectsListআপডেটে কাস্টিংয়ের সাথে নেই )
  • তালিকাগুলি লজিকের উপর ভিত্তি করে, অবজেক্ট ক্লাসে নয়
  • সম্মিলিত দক্ষতার সাথে অবজেক্টগুলির সাথে কোনও সমস্যা নেই ( MegaAirHumanUnderwaterObjectএর ধরণের জন্য নতুন তালিকা তৈরি করার পরিবর্তে সংশ্লিষ্ট তালিকায় beোকানো হবে)

পিএস: স্ব-আপডেট করার ক্ষেত্রে, আপনি যখন একাধিক অবজেক্টগুলি ইন্টারঅ্যাক্ট করছেন এবং তাদের প্রত্যেকটি অন্যের উপর নির্ভর করে তখন আপনি সমস্যার মুখোমুখি হবেন। এটি সমাধানের জন্য আমাদের স্ব-আপডেটের ভিতরে নয়, বাহ্যিকভাবে বস্তুকে প্রভাবিত করতে হবে।

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