Android এর জন্য Godot Engine Vulkan অপ্টিমাইজেশান

Godot ইঞ্জিন মাসকট চিত্র

ওভারভিউ

Godot Engine হল একটি জনপ্রিয় মাল্টিপ্ল্যাটফর্ম ওপেন সোর্স গেম ইঞ্জিন যা Android এর জন্য শক্তিশালী সমর্থন সহ। Godot কার্যত যে কোনও ঘরানার গেম তৈরি করতে ব্যবহার করা যেতে পারে এবং এটি 2D এবং 3D উভয় গ্রাফিক্সে সক্ষম। Godot সংস্করণ 4 হাই-ফিডেলিটি গ্রাফিক্সের জন্য উন্নত বৈশিষ্ট্য সহ একটি নতুন রেন্ডারিং সিস্টেম চালু করেছে। Godot 4 রেন্ডারার আধুনিক গ্রাফিক্স API যেমন ভলকান-এর জন্য ডিজাইন করা হয়েছে।

Godot ফাউন্ডেশন The Forge Interactive- এর গ্রাফিক্স অপ্টিমাইজেশান বিশেষজ্ঞদের নিযুক্ত করেছে এবং Godot 4 Vulkan রেন্ডারারকে বিশ্লেষণ এবং আরও উন্নত করতে এবং সেই অপ্টিমাইজেশনগুলিকে আবার প্রকল্পের সংগ্রহস্থলে একত্রিত করতে Google-এর সাথে সহযোগিতা করেছে৷ অপ্টিমাইজেশন ডেভেলপারদের Android এ কাস্টম Vulkan রেন্ডারার উন্নত করতে সাহায্য করে।

অপ্টিমাইজেশান পদ্ধতি এবং ফলাফল

অপ্টিমাইজেশন প্রক্রিয়া বেঞ্চমার্কিং লক্ষ্য হিসাবে Godot-এ দুটি ভিন্ন 3D দৃশ্য ব্যবহার করেছে। অপ্টিমাইজেশানের প্রতিটি পুনরাবৃত্তির সময় দৃশ্যগুলির রেন্ডারিং সময় একাধিক ডিভাইসে পরিমাপ করা হয়েছিল। অন্তর্ভুক্তির জন্য যোগ্যতা অর্জনের জন্য, অন্তত কিছু পরীক্ষিত ডিভাইসে কর্মক্ষমতা উন্নতি দেখানোর জন্য রেন্ডারারের পরিবর্তন প্রয়োজন এবং কোনো ডিভাইসে কর্মক্ষমতা রিগ্রেশন প্রবর্তন করতে পারেনি।

একাধিক জনপ্রিয় অ্যান্ড্রয়েড জিপিইউ আর্কিটেকচার পরীক্ষায় ব্যবহার করা হয়েছিল। যদিও অনেক অপ্টিমাইজেশান সাধারণ উন্নতি এনেছে, কিছু অপ্টিমাইজেশান নির্দিষ্ট GPU আর্কিটেকচারের উপর বেশি প্রভাব ফেলেছে। সমস্ত অপ্টিমাইজেশন কাজের সমষ্টির ফলে GPU ফ্রেমের সময় সাধারণ 10%-20% হ্রাস পেয়েছে।

সাধারণ ভলকান অপ্টিমাইজেশান

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

ডায়নামিক UBO অফসেট সমর্থন

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

রৈখিক বর্ণনাকারী সেট পুল

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

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

অপরিবর্তনীয় নমুনা সমর্থন

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

অপরিবর্তনীয় স্যাম্পলারগুলিকে আর আলাদা স্যাম্পলার অবজেক্টগুলি পরিচালনা এবং আবদ্ধ করার জন্য নমনীয়তা বন্ধ করে দেয়। Godot Vulkan রেন্ডারার অপরিবর্তনীয় নমুনার ব্যবহার সমর্থন করার জন্য আপডেট করা হয়েছিল; স্যাম্পলার ব্যবহার পরিবর্তন করা হয়েছে যেখানে ব্যবহারিক ক্ষেত্রে অপরিবর্তনীয় স্যাম্পলার ব্যবহার করা হয়েছে।

মোবাইল-কেন্দ্রিক অপ্টিমাইজেশান

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

অপ্টিমাইজেশন অন্তর্ভুক্ত:

  • বড় পুশ ধ্রুবক ব্যবহার প্রতিস্থাপন
  • অলস বাফার বরাদ্দ
  • অবিরাম বাফার সমর্থন
  • ASTC ডিকোড মোড পরিবর্তন
  • স্ক্রীন প্রি-রোটেশন

বড় পুশ ধ্রুবক ব্যবহার প্রতিস্থাপন

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

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

অলস বাফার বরাদ্দ

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

VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT উপযুক্ত রেন্ডার লক্ষ্য তৈরি করার সময় যোগ করা হয়েছিল, যেমন প্রধান রঙ এবং গভীরতা লক্ষ্যগুলি, বাফার মেমরি বরাদ্দ করা এড়াতে যা কখনই ব্যবহার করা হবে না। নমুনা দৃশ্যে অলস বরাদ্দ মেমরি সঞ্চয় প্রায় 50 মেগাবাইট RAM হিসাবে উচ্চ হতে পরিমাপ করা হয়েছিল।

অবিরাম বাফার সমর্থন

মোবাইল হার্ডওয়্যার প্রধান র‍্যাম এবং গ্রাফিক্স র‍্যামের মধ্যে হার্ডওয়্যার পার্থক্যের পরিবর্তে একটি ইউনিফাইড মেমরি আর্কিটেকচার (UMA) ব্যবহার করে। যখন প্রধান র‌্যাম এবং গ্রাফিক্স র‌্যাম আলাদা হয়, তখন জিপিইউ ব্যবহার করার জন্য মূল র‌্যাম থেকে গ্রাফিক্স র‌্যামে ডেটা স্থানান্তর করতে হবে। Godot ইতিমধ্যেই স্টেজিং বাফার ব্যবহারের মাধ্যমে তার Vulkan রেন্ডারারে এই স্থানান্তর প্রক্রিয়াটি প্রয়োগ করেছে। UMA হার্ডওয়্যারে, অনেক ধরনের ডেটার জন্য একটি স্টেজিং বাফার অপ্রয়োজনীয়; মেমরি CPU এবং GPU উভয় দ্বারা ব্যবহার করা যেতে পারে। Forge যখন সম্ভব স্টেজিং দূর করতে সমর্থিত হার্ডওয়্যারে অবিরাম ভাগ করা বাফারের জন্য সমর্থন বাস্তবায়ন করেছে।

এবং এর সাথে প্রোফাইলিং তথ্য প্রদর্শন করে একটি গডট দৃশ্যের ছবি         অবিরাম বাফার সক্রিয় ছাড়া.
চিত্র 1. একটি নমুনা দৃশ্যে সক্রিয় এবং নিষ্ক্রিয় স্থায়ী বাফারগুলির মধ্যে প্রোফাইলিং পার্থক্য।

ASTC ডিকোড মোড পরিবর্তন

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

স্ক্রীন প্রি-রোটেশন

Android-এ Vulkan ব্যবহার করার সময় সর্বোত্তম কার্যক্ষমতার জন্য, গেমগুলিকে অবশ্যই তাদের রেন্ডার পৃষ্ঠের অভিযোজনের সাথে স্ক্রীনের ডিভাইসের অভিযোজনের সাথে মিলিত হতে হবে। এই প্রক্রিয়াটিকে প্রাক-ঘূর্ণন হিসাবে উল্লেখ করা হয়। প্রি-রোটেশন সঞ্চালনে ব্যর্থতার ফলে ম্যানুয়ালি ছবি ঘোরানোর জন্য Android OS-এর একটি কম্পোজিটর পাস যোগ করার প্রয়োজনের কারণে কার্যক্ষমতা কমে যেতে পারে। অ্যান্ড্রয়েডে প্রি-রোটেশনের জন্য সমর্থন Godot রেন্ডারারে যোগ করা হয়েছিল।

ডিবাগিং উন্নতি

পারফরম্যান্স অপ্টিমাইজেশন করার পাশাপাশি, দ্য ফোর্জ নিম্নলিখিত সংযোজনগুলির সাথে Godot রেন্ডারারে গ্রাফিক্স সমস্যাগুলি ডিবাগ করার অভিজ্ঞতা উন্নত করেছে:

  • ডিভাইস ফল্ট এক্সটেনশন
  • ব্রেডক্রাম্বস
  • ডিবাগ মার্কার

ডিভাইস ফল্ট এক্সটেনশন

যখন GPU রেন্ডারিং অপারেশনের সময় একটি সমস্যার সম্মুখীন হয়, Vulkan ড্রাইভার একটি VK_ERROR_DEVICE_LOST ফলাফল একটি Vulkan API কল থেকে ফেরত দিতে পারে। ডিফল্টরূপে, ড্রাইভার কেন VK_ERROR_DEVICE_LOST ফেরত দিয়েছে সে সম্পর্কে কোনো অতিরিক্ত প্রসঙ্গ তথ্য প্রদান করা হয় না। VK_EXT_device_fault এক্সটেনশন ড্রাইভারকে ত্রুটির প্রকৃতি সম্পর্কে অতিরিক্ত তথ্য প্রদানের জন্য একটি প্রক্রিয়া প্রদান করে। Godot ডিভাইস ফল্ট এক্সটেনশন সক্রিয় করার জন্য সমর্থন যোগ করেছে (যদি পাওয়া যায়) এবং ড্রাইভার দ্বারা ফেরত তথ্য রিপোর্ট করার জন্য।

একটি GPU ক্র্যাশ বা এক্সিকিউশন স্টল ডিবাগ করা চ্যালেঞ্জিং হতে পারে। কোন ত্রুটির সময় গ্রাফিক্যাল বিষয়বস্তু রেন্ডার করা হতে পারে তা সনাক্ত করতে সাহায্য করার জন্য, Godot রেন্ডারারে ব্রেডক্রাম্ব সমর্থন যোগ করা হয়েছিল। ব্রেডক্রাম্ব হল ব্যবহারকারী-সংজ্ঞায়িত মান যা রেন্ডার গ্রাফের ড্র তালিকার বিষয়বস্তুর সাথে সংযুক্ত করা যেতে পারে। একটি নতুন রেন্ডার পাস শুরু করার আগে ব্রেডক্রাম্ব ডেটা লেখা হয়। যদি একটি ক্র্যাশ বা এক্সিকিউশন স্টল ঘটে, তাহলে বর্তমান ব্রেডক্রাম্ব মান ব্যবহার করা যেতে পারে তা নির্ধারণ করতে যে কোন ডেটা সমস্যার কারণ হতে পারে।

ডিবাগ মার্কার

ডিবাগ মার্কার, ড্রাইভার দ্বারা সমর্থিত হলে, নামকরণের জন্য ব্যবহৃত হয়। এটি ব্যবহারকারী-পাঠযোগ্য স্ট্রিংগুলিকে রেন্ডারডক-এর মতো গ্রাফিক্স টুল ব্যবহার করার সময় রেন্ডার পাস এবং বাফার এবং টেক্সচারের মতো সংস্থানগুলির সাথে যুক্ত হতে দেয়৷ Godot Vulkan রেন্ডারারে ডিবাগ মার্কার টীকা সমর্থন যোগ করা হয়েছে।

Godot Engine ব্লগ - Google এবং The Forge-এর সাথে সহযোগিতার উপর আপডেট

Godot ইঞ্জিন Vulkan সহযোগিতা টান অনুরোধ