2 ডি সাইড-স্ক্রোলারের জন্য "অনুকূল" গেম লুপ


14

2 ডি সাইড-স্ক্রোলারের গেম লুপের জন্য কোনও "অনুকূল" (পারফরম্যান্সের ক্ষেত্রে) বিন্যাসটি বর্ণনা করা সম্ভব? এই প্রসঙ্গে "গেম লুপ" ব্যবহারকারীর ইনপুট নেয়, গেমের সামগ্রীর রাজ্য আপডেট করে এবং গেমের বিষয়গুলি আঁক।

উদাহরণস্বরূপ, গভীর উত্তরাধিকারের স্তরক্রম সহ গেমঅজেক্ট বেস ক্লাস রাখা রক্ষণাবেক্ষণের পক্ষে ভাল হতে পারে ... আপনি নিম্নলিখিতগুলির মতো কিছু করতে পারেন:

foreach(GameObject g in gameObjects) g.update();

তবে আমি মনে করি এই পদ্ধতিটি পারফরম্যান্সের সমস্যা তৈরি করতে পারে।

অন্যদিকে সমস্ত গেমের সামগ্রীর ডেটা এবং ফাংশনগুলি বিশ্বব্যাপী হতে পারে। যা রক্ষণাবেক্ষণের মাথাব্যথা হতে পারে তবে সর্বোত্তমভাবে সম্পাদন করা গেম লুপের কাছাকাছি হতে পারে।

কোন চিন্তা? আমি কাছাকাছি অনুকূল গেম লুপ কাঠামোর ব্যবহারিক অ্যাপ্লিকেশনগুলিতে আগ্রহী ... এমনকি যদি আমি দুর্দান্ত পারফরম্যান্সের বিনিময়ে রক্ষণাবেক্ষণের মাথা ব্যথাও পাই।


উত্তর:


45

উদাহরণস্বরূপ, গভীর উত্তরাধিকারের স্তরক্রম সহ গেমওজেক্ট বেস ক্লাস রাখা রক্ষণাবেক্ষণের জন্য ভাল হতে পারে ...

প্রকৃতপক্ষে, গভীর অস্তিত্বগুলি অগভীর চেয়ে রক্ষণাবেক্ষণের জন্য সাধারণত খারাপ এবং গেম অবজেক্টগুলির জন্য আধুনিক স্থাপত্য শৈলীর অগভীরতা, সমষ্টি ভিত্তিক পদ্ধতির দিকে ঝোঁক

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

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

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

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

এই ধরনের সিস্টেমগুলি প্রায়শই অত্যন্ত ডিক্লোলড হয়, যা রক্ষণাবেক্ষণের জন্যও একটি वरदान।

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

ফলস্বরূপ, গেম লুপের জন্য আরও অনুকূল পন্থাটি হবে আপনার আসল পরিবর্তে

foreach(GameObject g in gameObjects) g.update();

আরও কিছু ভালো

ProcessUserInput();
UpdatePhysicsForAllObjects();
UpdateScriptsForAllObjects();
UpdateRenderDataForAllObjects();
RenderEverything();

যেমন একটি বিশ্বের প্রতিটি GameObjectনিজস্ব একটি পয়েন্টার বা রেফারেন্স থাকতে পারে PhysicsDataবা Scriptবা RenderData, মামলা যেখানে আপনি একটি পৃথক ভিত্তিতে বস্তুর সঙ্গে যোগাযোগ করার জন্য প্রয়োজন হতে পারে, কিন্তু জন্য প্রকৃত PhysicsData, Scripts, RenderData, ইত্যাদি সব তাদের নিজ নিজ সাব মালিকানাধীন হবে (পদার্থবিজ্ঞান সিমুলেটর, স্ক্রিপ্ট হোস্টিং পরিবেশ, রেন্ডারার) এবং উপরে উল্লিখিত হিসাবে বাল্কে প্রক্রিয়াজাত করা।

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

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


5
ভাল হুজুর, এটি একটি দুর্দান্ত উত্তর।
রাভলাইন

2

প্রোগ্রামিংয়ের গেম-অবজেক্ট স্টাইলটি ছোট প্রকল্পগুলির জন্য দুর্দান্ত A প্রকল্পটি সত্যই বিশাল হয়ে উঠলে আপনি গভীর উত্তরাধিকারের স্তরক্রমের সাথে শেষ হয়ে যাবেন এবং গেম-অবজেক্ট বেসটি সত্যিই ভারী হয়ে উঠবে!

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

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

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


@ জোশ পেট্রি - সত্যিই দুর্দান্ত উত্তর!
আইয়্যাপ্প

@ জোশ পেট্রি - দরকারী লিঙ্কগুলির সাথে সত্যই ভাল উত্তর! (Sry জানেন না কীভাবে এই মন্তব্যটি আপনার পোস্টের পাশে রাখবেন: পি)
আইয়্যাপ্পা

আপনি আমার উত্তরের অধীনে "মন্তব্য যুক্ত করুন" লিঙ্কটি ক্লিক করতে পারেন, সাধারণত, তবে আপনার বর্তমানের চেয়ে বেশি খ্যাতি প্রয়োজন (দেখুন গেমদেব.স্ট্যাকেক্সেক্সঞ্জ / প্রাইভেলিজ / কমেন্ট )। এবং ধন্যবাদ!
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.