VkQuality ইউনিটি ইঞ্জিন প্লাগইন

ইউনিটি ইঞ্জিনের জন্য VkQuality প্লাগইন নির্দিষ্ট ডিভাইসে আপনার গেমের জন্য ব্যবহার করার জন্য গ্রাফিক্স API-Vulkan বা OpenGL ES-এর লঞ্চ-টাইম সুপারিশ প্রদান করে।

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

আপনার ইউনিটি ইঞ্জিন গেমে ভলকান সক্ষম করুন

VkQuality-এর জন্য আপনার গেমের Unity প্রোজেক্ট সেটিংসে OpenGL ES এবং Vulkan রেন্ডারার উভয়ই সক্ষম করা প্রয়োজন। অটো গ্রাফিক্স API বিকল্প ব্যবহার করে বা গ্রাফিক্স API গুলি ম্যানুয়ালি সেট করে রেন্ডারারগুলিকে সক্ষম করুন৷

ইউনিটি ইঞ্জিনের জন্য VkQuality প্লাগইন পান

GitHub থেকে VkQuality প্লাগইন ডাউনলোড করুন। প্লাগইনটি ইউনিটি 2021 এবং উচ্চতর সাথে সামঞ্জস্যপূর্ণ। Android-এ Vulkan চালু করতে Unity 2021 LTS বা উচ্চতর ব্যবহার করুন। প্লাগইন প্যাকেজটিতে একটি মৌলিক নমুনা প্রকল্প রয়েছে যা স্টার্টআপে গ্রাফিক্স API সেট করতে প্লাগইন ব্যবহার করে এবং তারপর ডিভাইসের সক্রিয় গ্রাফিক্স API-এ একটি স্ট্রিং সেট প্রদর্শন করে।

VkQuality Vulkan সুপারিশ তালিকা পরিচালনা করুন

VkQuality সমর্থিত ডিভাইসগুলির একটি ডিফল্ট সুপারিশ তালিকা অন্তর্ভুক্ত করে। একটি কাস্টম সুপারিশ তালিকা ব্যবহার সম্পর্কে তথ্যের জন্য, একটি কাস্টম সুপারিশ তালিকা ব্যবহার করুন বিভাগটি দেখুন৷

সুপারিশের তালিকায় তিনটি বিভাগ রয়েছে:

  • Vulkan ডিভাইস অনুমতি তালিকা
  • GPU সুপারিশ অনুমতি তালিকা
  • GPU সুপারিশ তালিকা অস্বীকার

ডিভাইস তালিকার মিলের অনুমতি দেয়

VkQuality প্রথমে চেক করে যে সক্রিয় ডিভাইসটি ডিভাইসের অনুমতি তালিকায় অন্তর্ভুক্ত আছে কিনা এবং এটি সেই ডিভাইসের অনুমতি তালিকায় উল্লেখ করা ন্যূনতম অ্যান্ড্রয়েড সংস্করণ এবং ভলকান ড্রাইভার সংস্করণ চলছে কিনা। যদি এই মানদণ্ডগুলি পূরণ করা হয়, VkQuality RECOMMENDATION_VULKAN_BECAUSE_DEVICE_MATCH enum মান ফেরত দিয়ে ভলকানকে সুপারিশ করে৷

ডিভাইসটি যদি মঞ্জুরি তালিকায় থাকে, কিন্তু অনুমোদিত তালিকায় এটির জন্য নির্দিষ্ট ন্যূনতমের নিচে একটি Android সংস্করণ বা ড্রাইভার সংস্করণ চালায়, VkQuality RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER ফেরত দিয়ে OpenGL ES সুপারিশ করে।

GPU সুপারিশ মেলে

যদি ডিভাইসের অনুমতি তালিকায় কোনো ডিভাইসের মিল পাওয়া না যায়, তাহলে VkQuality GPU মডেল এবং ড্রাইভার সংস্করণকে GPU সুপারিশের অনুমতি ও অস্বীকার তালিকার বিপরীতে মূল্যায়ন করে। যদি GPU মডেল এবং ড্রাইভার সংস্করণ GPU সুপারিশের অনুমতি তালিকার একটি এন্ট্রির সাথে মিলে যায়, VkQuality RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH enum ধ্রুবক ফিরিয়ে দিয়ে ভলকানকে সুপারিশ করে।

যদি GPU মডেল এবং ড্রাইভার সংস্করণ GPU সুপারিশ অস্বীকার তালিকার একটি এন্ট্রির সাথে মিলে যায়, VkQuality RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH ফেরত দিয়ে OpenGL ES সুপারিশ করে।

একটি মিল ছাড়া সুপারিশ

যদি কোনো মিল পাওয়া না যায়, তাহলে VkQuality Vulkan সুপারিশ করে যদি চলমান ডিভাইসের Android API স্তর সুপারিশ তালিকায় Future API স্তরের সমান বা তার চেয়ে বেশি হয়। ডিফল্ট সুপারিশ তালিকায় একটি ভবিষ্যত API স্তর রয়েছে 36, মানে API স্তর 36 বা উচ্চতর চলমান অতুলনীয় ডিভাইসগুলিতে, VkQuality RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID enum ধ্রুবক প্রদান করে৷

যদি ডিভাইসের অনুমতি তালিকা বা GPU সুপারিশ তালিকায় কোনো মিল পাওয়া না যায় এবং ডিভাইসের API স্তর ভবিষ্যতের API স্তরের নিচে থাকে, VkQuality RECOMMENDATION_GLES_BECAUSE_NO_DEVICE_MATCH ফেরত দিয়ে OpenGL ES সুপারিশ করে।

আপনার প্রকল্পে VkQuality সংরক্ষণাগার ফাইল যোগ করুন

VkQuality প্লাগইন হল VkQuality-1.xxaar ফাইল ডাউনলোড করা প্যাকেজ সংরক্ষণাগারের Assets/Android/Plugins ডিরেক্টরিতে অবস্থিত। .aar ফাইলের প্রকৃত সংস্করণ নম্বর প্যাকেজ সংরক্ষণাগার নামের সংস্করণ নম্বরের সাথে মেলে। প্লাগইন ইনস্টল করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:

  1. আপনার প্রজেক্টের Assets/Android/Plugins ডিরেক্টরিতে .aar ফাইলটি কপি করুন। (প্রয়োজনীয় Android এবং Plugins সাবডিরেক্টরি তৈরি করুন যদি সেগুলি বিদ্যমান না থাকে।)
প্রয়োজনীয় প্রকল্প ডিরেক্টরিতে VkQuality .aar ফাইল।
চিত্র 1. প্রয়োজনীয় প্রকল্প ডিরেক্টরিতে VkQuality .aar ফাইল।
  1. ইন্সপেক্টর প্যানে এর আমদানি সেটিংস আনতে ইউনিটি প্রজেক্ট হায়ারার্কিতে VkQuality-1.xx প্লাগইন ফাইলটি নির্বাচন করুন। অ্যান্ড্রয়েড প্ল্যাটফর্ম চেক করা হয়েছে তা নিশ্চিত করুন।
চিত্র 2. VkQuality প্লাগইন প্ল্যাটফর্ম আমদানি সেটিংস।
চিত্র 2. VkQuality প্লাগইন প্ল্যাটফর্ম আমদানি সেটিংস।

VkQuality কল করতে একটি কাস্টম কার্যকলাপ ব্যবহার করুন

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

যদি আপনার গেম ইতিমধ্যেই একটি কাস্টম কার্যকলাপ ব্যবহার করে থাকে, তাহলে একটি বিদ্যমান কাস্টম কার্যকলাপ বিভাগে VkQuality যোগ করুন দেখুন। আপনার গেমের জন্য একটি নতুন কাস্টম ক্রিয়াকলাপ তৈরি করতে, আপনার ইউনিটি প্রকল্পে একটি কাস্টম কার্যকলাপ যুক্ত করুন দেখুন, যা পরবর্তী অনুসরণ করে৷

আপনার ইউনিটি ইঞ্জিন প্রকল্পে একটি কাস্টম কার্যকলাপ যোগ করুন

VkQuality ব্যবহার করে একটি উদাহরণ কাস্টম কার্যকলাপ Assets/Plugins/Android/VkQualityTestActivity.java এর প্লাগইন প্যাকেজে অন্তর্ভুক্ত করা হয়েছে। ফাইলটি কাস্টমাইজ করতে এবং আপনার গেমে এটি ব্যবহার করতে, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:

  1. আপনার Assets/Plugins/Android ডিরেক্টরিতে VkQualityTestActivity.java ফাইলটি কপি করুন।
  2. আপনার গেমের জন্য উপযুক্ত কিছুতে এটির নাম পরিবর্তন করুন (উদাহরণস্বরূপ, MyGameActivity.java )।
  3. একটি পাঠ্য সম্পাদকে ফাইলটি খুলুন।
  4. ক্লাসের নাম VkQualityTestActivity থেকে আপনার ফাইলটি দেওয়া নামটিতে পরিবর্তন করুন (উদাহরণস্বরূপ, MyGameActivity.java )।
  5. অন্যান্য সেটিংস (উদাহরণস্বরূপ, com.mycompany.mygame ) এর অধীনে আপনার ইউনিটি প্রজেক্ট সেটিংস প্লেয়ার বিভাগে প্যাকেজ নামের ক্ষেত্রের মানের সাথে com.google.android.games.VkQualityTest থেকে প্যাকেজের নাম পরিবর্তন করুন।
  6. সংরক্ষণ করুন এবং ফাইলটি বন্ধ করুন।

একটি কাস্টম ম্যানিফেস্ট ফাইল যোগ করুন যা আপনার কাস্টম কার্যকলাপের উল্লেখ করে এবং ইউনিটিকে আপনার কাস্টম ম্যানিফেস্ট ফাইল ব্যবহার করতে বলুন:

  1. প্লাগইন প্যাকেজের Assets/Plugins/Android ডিরেক্টরি থেকে AndroidManifest.xml ফাইলটি আপনার প্রোজেক্টের Asset/Plugins/Android ডিরেক্টরিতে অনুলিপি করুন।
  2. একটি পাঠ্য সম্পাদকে ফাইলটি খুলুন।
  3. com.google.android.games.VkQualityTest.VkQualityTestActivity থেকে activity android:name com.mycompany.mygame.MyGameActivity পরিবর্তন করুন
  4. সংরক্ষণ করুন এবং ফাইলটি বন্ধ করুন।
  5. ইউনিটি সেটিংস উইন্ডো খুলুন এবং প্লেয়ার সেটিংস নির্বাচন করুন। প্রকাশনা সেটিংস বিভাগটি প্রসারিত করুন এবং কাস্টম প্রধান ম্যানিফেস্ট চেকবক্সটি চেক করুন।
চিত্র 3. ইউনিটি প্লেয়ার সেটিংসে কাস্টম প্রধান ম্যানিফেস্ট বিকল্প।
চিত্র 3. ইউনিটি প্লেয়ার সেটিংসে কাস্টম প্রধান ম্যানিফেস্ট বিকল্প।

আপনার প্রকল্পটি এখন কাস্টম কার্যকলাপ ব্যবহার করার জন্য সেট আপ করা হয়েছে যা শুরুতে VkQuality কল করে এবং VkQuality সুপারিশের উপর ভিত্তি করে Vulkan বা OpenGL ES বেছে নেয়।

একটি বিদ্যমান কাস্টম কার্যকলাপে VkQuality যোগ করুন

যদি আপনার গেমে ইতিমধ্যেই ডিফল্ট UnityPlayerActivity ওভাররাইড করে একটি কাস্টম কার্যকলাপ থাকে, তাহলে নিম্নলিখিত কোড যোগ করে VkQuality সুপারিশগুলিকে একীভূত করুন:

প্রথমে, কাস্টম কার্যকলাপ ফাইলের শীর্ষে আমদানির তালিকায় VkQuality আমদানি বিবৃতি যোগ করুন:

কোটলিন

import com.google.android.games.vkquality.VKQuality;

জাভা

import com.google.android.games.vkquality.VKQuality;

এরপরে, গ্রাফিক্স এপিআই পছন্দের জন্য আপনার Activity ক্লাসের বডিতে কিছু ধ্রুবক তৈরি করুন:

কোটলিন

companion object {
  private const val OVERRIDE_NONE = 0
  private const val OVERRIDE_GLES = 1
  private const val OVERRIDE_VULKAN = 2

জাভা

private static final int OVERRIDE_NONE = 0;
private static final int OVERRIDE_GLES = 1;
private static final int OVERRIDE_VULKAN = 2;

API নির্বাচন ট্র্যাক করতে একটি ভেরিয়েবল তৈরি করুন:

কোটলিন

private var apiOverride = OVERRIDE_NONE

জাভা

private int apiOverride = OVERRIDE_NONE;

আপনার Activity ক্লাসে নিম্নলিখিত ফাংশন যোগ করুন:

কোটলিন

private fun CheckVkQuality() {
    val vkQuality = VKQuality(this)
    val startResult = vkQuality.StartVkQuality("")
    if (startResult == VKQuality.INIT_SUCCESS) {
        // In the current release, we can assume GetVkQuality is
        // ready as soon as StartVkQuality has returned success.
        val getResult = vkQuality.GetVkQuality()
        LogVkQualityResult(getResult)
        apiOverride =
            when (getResult) {
                VKQuality.RECOMMENDATION_VULKAN_BECAUSE_DEVICE_MATCH,
                VKQuality.RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH,
                VKQuality.RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID -> OVERRIDE_VULKAN
                VKQuality.RECOMMENDATION_GLES_BECAUSE_OLD_DEVICE,
                VKQuality.RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER,
                VKQuality.RECOMMENDATION_GLES_BECAUSE_NO_DEVICE_MATCH,
                VKQuality.RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH -> OVERRIDE_GLES
                else -> OVERRIDE_GLES
            }
        vkQuality.StopVkQuality()
    } else {
        Log.e("VKQUALITY", "VkQuality start failed with result: $startResult")
    }
}

জাভা

private void CheckVkQuality() {
  VKQuality vkQuality = new VKQuality(this);
  // An empty string specifies use of the default
  // built-in device list file.
  int startResult = vkQuality.StartVkQuality("");
  if (startResult == VKQuality.INIT_SUCCESS) {
      // In the current release, we can assume GetVkQuality is
      // ready as soon as StartVkQuality has returned success.
      int getResult = vkQuality.GetVkQuality();

      switch (getResult) {
          case VKQuality.RECOMMENDATION_VULKAN_BECAUSE_DEVICE_MATCH:
          case VKQuality.RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH:
          case VKQuality.RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID:
              apiOverride = OVERRIDE_VULKAN;
              break;
          case VKQuality.RECOMMENDATION_GLES_BECAUSE_OLD_DEVICE:
          case VKQuality.RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER:
          case VKQuality.RECOMMENDATION_GLES_BECAUSE_NO_DEVICE_MATCH:
          case VKQuality.RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH:
          default:
              apiOverride = OVERRIDE_GLES;
              break;
      }
      vkQuality.StopVkQuality();
  } else {
      Log.e("VKQUALITY", "VkQuality start failed with result: " + startResult);
  }
}

বেস ক্লাস বাস্তবায়ন কল করার আগে একটি onCreate() ওভাররাইড ফাংশনের উপরে থেকে CheckVkQuality ফাংশনটি কল করুন:

কোটলিন

override fun onCreate(savedInstanceState: Bundle?) {
  CheckVkQuality()
  super.onCreate(savedInstanceState)
}

জাভা

@Override
protected void onCreate(Bundle savedInstanceState) {
    CheckVkQuality();
    super.onCreate(savedInstanceState);
}

অবশেষে, updateUnityCommandLineArguments() ফাংশনের একটি ওভাররাইড যোগ করুন যা apiOverride এর মান ব্যবহার করে ইউনিটি ইঞ্জিনে একটি কমান্ড-লাইন আর্গুমেন্ট পাস করে যা নির্দিষ্ট করে কোন গ্রাফিক্স API ব্যবহার করবে:

কোটলিন

override fun updateUnityCommandLineArguments(cmdLine: String): String {
  if (apiOverride == OVERRIDE_VULKAN) {
      Log.i("VKQUALITY", "Passing -force-vulkan")
      return appendCommandLineArgument(cmdLine, "-force-vulkan")
  } else if (apiOverride == OVERRIDE_GLES) {
      Log.i("VKQUALITY", "Passing -force-gles")
      return appendCommandLineArgument(cmdLine, "-force-gles")
  }
  Log.i("VKQUALITY", "No override passed")
  // let Unity pick the Graphics API based on PlayerSettings
  return cmdLine
}

private fun appendCommandLineArgument(cmdLine: String, arg: String?): String {
    return if (arg == null || arg.isEmpty()) cmdLine
    else if (cmdLine == null || cmdLine.isEmpty()) arg else "$cmdLine $arg"
}

জাভা

@Override protected String updateUnityCommandLineArguments(String cmdLine)
{
    if (apiOverride == OVERRIDE_VULKAN) {
        Log.i("VKQUALITY", "Passing -force-vulkan");
        return appendCommandLineArgument(cmdLine, "-force-vulkan");
    }
    else if (apiOverride == OVERRIDE_GLES) {
        Log.i("VKQUALITY", "Passing -force-gles");
        return appendCommandLineArgument(cmdLine, "-force-gles");
    }
    Log.i("VKQUALITY", "No override passed");
    // let Unity pick the Graphics API based on PlayerSettings
    return cmdLine;
}

private String appendCommandLineArgument(String cmdLine, String arg) {
    if (arg == null || arg.isEmpty())
        return cmdLine;
    else if (cmdLine == null || cmdLine.isEmpty())
        return arg;
    else
        return cmdLine + " " + arg;
}

আপনার কাস্টম কার্যকলাপ এখন শুরুতে VkQuality কল করে এবং VkQuality সুপারিশের ভিত্তিতে Vulkan বা OpenGL ES বেছে নেয়।

একটি কাস্টম সুপারিশ তালিকা ব্যবহার করুন

একটি খালি স্ট্রিং পাস করার পরিবর্তে StartVkQuality() এ তালিকাটি সম্বলিত ফাইলের নাম পাস করে একটি কাস্টম সুপারিশ তালিকা ফাইল নির্দিষ্ট করুন:

কোটলিন

val startResult = vkQuality.StartVkQuality("CUSTOM_FILE_NAME.vkq")

জাভা

int startResult = vkQuality.StartVkQuality("CUSTOM_FILE_NAME.vkq");

VkQuality প্রথমে আপনার অ্যাপ্লিকেশনের অভ্যন্তরীণ স্টোরেজ ডিরেক্টরিতে ফাইলটি সন্ধান করে। ফাইলটি অভ্যন্তরীণ স্টোরেজে না থাকলে, VkQuality আপনার অ্যাপ বান্ডেলের সম্পদ থেকে ফাইলটি লোড করার চেষ্টা করে। যদি ফাইলটি উভয় স্থানে না থাকে, তাহলে VkQuality ERROR_MISSING_DATA_FILE enum মান প্রদান করে।

একটি কাস্টম সুপারিশ তালিকা ফাইল তৈরি করতে, GitHub সংগ্রহস্থলে অবস্থিত VkQuality List Editor টুলটি ব্যবহার করুন। টুলটির জন্য ডকুমেন্টেশন এর README এ অবস্থিত।