VkQuality Unity ইঞ্জিন প্লাগ-ইন

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

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

আপনার Unity ইঞ্জিন গেমে Vulkan চালু করা

VkQuality-এর জন্য আপনার গেমে OpenGL ES এবং Vulkan রেন্ডারার, দুটিই Unity প্রোজেক্ট সেটিংসে চালু থাকতে হবে। অটো গ্রাফিক্স API বিকল্প ব্যবহার করে অথবা গ্রাফিক্স API ম্যানুয়ালি সেট করে রেন্ডারার চালু করুন।

Unity ইঞ্জিনের জন্য VkQuality প্লাগ-ইন ডাউনলোড করা

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

VkQuality Vulkan সাজেশনের তালিকা ম্যানেজ করুন

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

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

  • Vulkan ডিভাইসের অনুমোদিত তালিকা
  • GPU সাজেশন অনুমোদিত তালিকা
  • GPU সাজেশন প্রত্যাখ্যানের তালিকা

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

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

ডিভাইসটি অনুমোদিত তালিকায় থাকলে, কিন্তু অনুমোদিত তালিকায় উল্লেখ করা ন্যূনতম ভার্সনের চেয়ে পুরনো Android ভার্সন বা ড্রাইভার ভার্সন ব্যবহার করলে, VkQuality RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER রিটার্ন করে OpenGL ES সাজেস্ট করে।

GPU সাজেশন ম্যাচ

ডিভাইসের অনুমোদিত তালিকায় কোনও ডিভাইস ম্যাচ না করলে, VkQuality GPU মডেল এবং ড্রাইভার ভার্সন GPU-এর অনুমোদিত এবং অননুমোদিত তালিকার সাথে তুলনা করে। GPU মডেল এবং ড্রাইভার ভার্সন GPU সাজেশন অনুমোদিত তালিকার কোনও এন্ট্রির সাথে ম্যাচ করলে, VkQuality RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH enum কনস্ট্যান্ট ফিরিয়ে দিয়ে Vulkan সাজেস্ট করে।

GPU মডেল এবং ড্রাইভার ভার্সন যদি GPU সাজেশন প্রত্যাখ্যান তালিকার কোনও এন্ট্রির সাথে মিলে যায়, তাহলে VkQuality RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH রিটার্ন করে OpenGL ES সাজেস্ট করে।

ম্যাচ না করা সাজেশন

কোনও ম্যাচ খুঁজে না পাওয়া গেলে, VkQuality Vulkan সাজেস্ট করে, যদি ডিভাইসের Android API লেভেল সাজেশন তালিকার Future API লেভেলের সমান বা তার থেকে বেশি হয়। ডিফল্ট সাজেশন তালিকায় API লেভেল ৩৬-এর জন্য ফিউচার API লেভেল আছে, যার অর্থ হল API লেভেল ৩৬ বা তার চেয়ে বেশি ভার্সনে রান করা অমিল ডিভাইসে, VkQuality RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID enum কনস্ট্যান্ট রিটার্ন করে।

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

আপনার প্রোজেক্টে VkQuality আর্কাইভ ফাইল যোগ করুন

VkQuality প্লাগ-ইন হল VkQuality-1.x.x.aar ফাইল যা ডাউনলোড করা প্যাকেজ আর্কাইভের Assets/Android/Plugins ডিরেক্টরিতে রয়েছে। .aar ফাইলের আসল ভার্সন নম্বর প্যাকেজ আর্কাইভ নামের ভার্সন নম্বরের সাথে মিলে যায়। প্লাগ-ইন ইনস্টল করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:

  1. আপনার প্রোজেক্টের Assets/Android/Plugins ডিরেক্টরিতে .aar ফাইল কপি করুন। (প্রয়োজনীয় Android এবং Plugins সাবডিরেক্টরি না থাকলে তৈরি করুন।)
প্রয়োজনীয় প্রোজেক্ট ডিরেক্টরিতে VkQuality .aar ফাইল।
ছবি ১.প্রয়োজনীয় প্রোজেক্ট ডিরেক্টরিতে VkQuality .aar ফাইল।
  1. Unity প্রজেক্ট হায়ারার্কিতে VkQuality-1.x.x প্লাগ-ইন ফাইল বেছে নিন যাতে ইন্সপেক্টর প্যানে এর ইমপোর্ট সেটিংস দেখা যায়। Android প্ল্যাটফর্ম বেছে নেওয়া হয়েছে কিনা তা দেখে নিন।
ছবি ২. VkQuality প্লাগ-ইন প্ল্যাটফর্ম ইমপোর্ট সেটিংস।
ছবি ২. VkQuality প্লাগ-ইন প্ল্যাটফর্ম ইমপোর্ট সেটিংস।

VkQuality কল করার জন্য কাস্টম অ্যাক্টিভিটি ব্যবহার করুন

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

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

আপনার Unity ইঞ্জিন প্রোজেক্টে কাস্টম অ্যাক্টিভিটি যোগ করা

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

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

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

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

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

আগে থেকে থাকা কাস্টম অ্যাক্টিভিটিতে VkQuality যোগ করুন

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

প্রথমে, কাস্টম অ্যাক্টিভিটি ফাইলের উপরে ইমপোর্টের তালিকায় VkQuality ইমপোর্ট স্টেটমেন্ট যোগ করুন:

Kotlin

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

জাভা

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

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

Kotlin

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 বেছে নেওয়া ট্র্যাক করতে একটি ভেরিয়েবেল তৈরি করুন:

Kotlin

private var apiOverride = OVERRIDE_NONE

জাভা

private int apiOverride = OVERRIDE_NONE;

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

Kotlin

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 ফাংশন কল করুন:

Kotlin

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

জাভা

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

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

Kotlin

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()-এ তালিকা সহ ফাইলের নাম পাস করে একটি কাস্টম সাজেশন তালিকা ফাইল নির্দিষ্ট করুন:

Kotlin

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-তে রয়েছে।