المكوّن الإضافي لمحرك Vkquality Unity

يوفّر المكوّن الإضافي Vkquality لمحرّك Unity اقتراحات وقت الإطلاق. واجهة برمجة تطبيقات الرسومات—Vulkan أو OpenGL ES—لاستخدامها مع لعبتك على أنظمة تشغيل الأجهزة.

تنصح Vkquality بـ Vulkan على مجموعة أجهزة محدودة أكثر من Unity. قائمة السماح الافتراضية للمحرك. استخدم Vkquality لاكتساب مزايا أداء Vulkan مع حصر استخدام Vulkan على الأجهزة الأحدث ذات الرسومات الجديدة السائقين، مما يحد من تعرض لعبتك لمشكلات السائق. Vkquality فقط تقدم توصيات للجودة، وليس ضمانات، حيث إنه لا يزال من الممكن مواجهة مشكلات برنامج التشغيل على الأجهزة الموصى بها. يدعم Vkquality القوائم المخصصة، التي تتيح لك إضافة أو إزالة اقتراحات بشأن الأجهزة في اللعبة.

تفعيل Vulkan في لعبة محرّك Unity

تتطلب Vkquality أن تحتوي لعبتك على كل من عارضي OpenGL ES وVulkan. مفعَّلة في إعدادات مشروع Unity. فعّل برامج العرض باستخدام زر Auto خيار واجهة برمجة التطبيقات Graphics API أو من خلال ضبط يدويًا واجهات برمجة التطبيقات الخاصة بالرسومات.

الحصول على المكوِّن الإضافي Vkquality لمحرك Unity

نزِّل المكوّن الإضافي Vkquality من GitHub. المكون الإضافي هو متوافقة مع Unity 2021 والإصدارات الأحدث يجب استخدام الإصدار Unity 2021 من قناة الدعم الطويل الأمد (LTS) أو إصدار أحدث لتفعيل Vulkan على Android. تحتوي حزمة المكونات الإضافية على نموذج مشروع أساسي يستخدم المكون الإضافي لتعيين واجهة برمجة تطبيقات الرسومات عند بدء التشغيل ثم عرض مجموعة على واجهة برمجة التطبيقات للرسومات النشطة للجهاز.

إدارة قائمة اقتراحات Vkquality Vulkan

تتضمّن Vkquality قائمة اقتراحات تلقائية بالأجهزة المتوافقة. بالنسبة حول استخدام قائمة اقتراحات مخصصة، راجع قسم استخدام قائمة الاقتراحات

تشمل قائمة الاقتراحات ثلاث فئات:

  • قائمة السماح بأجهزة Vulkan
  • قائمة السماح باقتراحات وحدة معالجة الرسومات
  • قائمة حظر اقتراحات وحدة معالجة الرسومات

تطابق قائمة الأجهزة المسموح بها

تتحقّق Vkquality أولاً مما إذا كان الجهاز النشط مضمّنًا في السماح للجهاز وما إذا كان يعمل بالحد الأدنى من إصدار Android وبرنامج تشغيل Vulkan المحدد في قائمة السماح لهذا الجهاز. إذا تم استيفاء هذه المعايير، تقترح Vkquality Vulkan من خلال إرجاع قيمة التعداد RECOMMENDATION_VULKAN_BECAUSE_DEVICE_MATCH.

إذا كان الجهاز ضمن قائمة السماح، ولكنه يعمل بإصدار Android أو برنامج تشغيل إصدار أقل من الحد الأدنى المحدد له في قائمة السماح، Vkquality يقترح استخدام OpenGL ES من خلال عرض RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER.

تطابقات وحدة معالجة الرسومات المقترَحة

إذا لم يتم العثور على أي جهاز مطابق في قائمة الأجهزة المسموح بها، تقيّم Vkquality طراز وحدة معالجة الرسومات وإصدار برنامج التشغيل وفقًا لاقتراح وحدة معالجة الرسومات ينطبقان ويرفضان القوائم. إذا تطابق طراز وحدة معالجة الرسومات وإصدار برنامج التشغيل مع إدخال في وحدة معالجة الرسومات قائمة السماح الموصى بها، تقترح Vkquality Vulkan من خلال إرجاع ثابت التعداد: RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH

إذا تطابق طراز وحدة معالجة الرسومات وإصدار برنامج التشغيل مع إدخال في وحدة معالجة الرسومات قائمة حظر الاقتراحات، تقترح Vkquality استخدام OpenGL ES من خلال عرض RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH

اقتراحات بلا مطابقة

إذا لم يتم العثور على أي تطابقات، تقترح Vkquality Vulkan إذا كان مستوى واجهة برمجة تطبيقات Android فإن الجهاز قيد التشغيل يساوي أو أعلى من مستوى واجهة برمجة التطبيقات المستقبلية في قائمة التوصيات. تحتوي قائمة الاقتراحات التلقائية على مستوى واجهة برمجة تطبيقات مستقبلي بقيمة 36، وهو ما يعني أنه على الأجهزة غير المتطابقة التي تعمل بالمستوى 36 أو أعلى لواجهة برمجة التطبيقات، وهي Vkquality لعرض ثابت التعداد RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID.

إذا لم يتم العثور على أي تطابقات في قائمة السماح للأجهزة أو قوائم اقتراحات وحدة معالجة الرسومات، وكان مستوى واجهة برمجة التطبيقات للجهاز أقل من مستوى واجهة برمجة التطبيقات المستقبلية، Vkquality يقترح استخدام OpenGL ES من خلال عرض RECOMMENDATION_GLES_BECAUSE_NO_DEVICE_MATCH.

أضِف ملف الأرشيف Vkquality إلى مشروعك.

المكوّن الإضافي Vkquality هو الملف VkQuality-1.x.x.aar الموجود في الدليل Assets/Android/Plugins لأرشيف الحزمة التي تم تنزيلها. القيمة الفعلية يتطابق رقم إصدار ملف .aar مع رقم إصدار الحزمة اسم الأرشيف. لتثبيت المكوّن الإضافي، اتّبِع الخطوات التالية:

  1. انسخ ملف .aar إلى دليل Assets/Android/Plugins في مشروعك. (أنشئ الأدلّة الفرعية Android وPlugins المطلوبة في حال: غير موجودة).
ملف Vkquality .aar في دليل المشروع المطلوب.
الشكل 1.ملف Vkquality .aar في دليل المشروع المطلوب
  1. اختيار ملف المكوّن الإضافي VkQuality-1.x.x في التسلسل الهرمي مشروع Unity لإظهار إعدادات الاستيراد في لوحة أداة الفحص. تأكَّد من أنّ Android الأساسي.
الشكل 2. إعدادات استيراد النظام الأساسي Vkquality.
الشكل 2. إعدادات استيراد النظام الأساسي لمكوّن Vkquality الإضافي.

استخدام نشاط مخصّص للاتصال بـ Vkquality

على عكس المكوّنات الإضافية المعتادة لمحرك Unity، يجب تنفيذ Vkquality للحصول على اقتراح واجهة برمجة التطبيقات للرسومات قبل إعداد محرّك Unity. بعد ذلك، تستخدم ميزة وسيطات سطر الأوامر لمشغّل Unity لضبط رسومات واجهة برمجة التطبيقات استنادًا إلى توصية Vkquality. على 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. انسخ ملف AndroidManifest.xml من Assets/Plugins/Android. دليل حزمة المكون الإضافي إلى Asset/Plugins/Android لمشروعك الدليل.
  2. افتح الملف في محرِّر نصوص.
  3. غيِّر قيمة الإعداد activity android:name من com.google.android.games.VkQualityTest.VkQualityTestActivity إلى أسماء الحزم والأنشطة التي استخدمتها في الخطوات السابقة (على سبيل المثال، com.mycompany.mygame.MyGameActivity).
  4. احفظ الملف وأغلقه.
  5. افتح نافذة إعدادات Unity واختَر إعدادات المشغّل. توسيع قسم إعدادات النشر، ثم تحقَّق من البيان الرئيسي المخصَّص .
الشكل 3.خيار البيان الرئيسي المخصَّص في إعدادات Unity Player.
الشكل 3.خيار البيان الرئيسي المخصَّص في إعدادات مشغّل Unity

تم إعداد مشروعك الآن لاستخدام النشاط المخصّص الذي يطلق عليه Vkquality وتختار Vulkan أو OpenGL ES بناءً على توصية Vkquality.

إضافة Vkquality إلى نشاط مخصّص حالي

إذا كانت لعبتك تتضمن حاليًا نشاطًا مخصّصًا يتخطى الإعدادات التلقائية UnityPlayerActivity، يمكنك دمج اقتراحات Vkquality من خلال إضافة الرمز التالي:

أولاً، أضف عبارة Vkquality إلى قائمة الاستيراد في أعلى ملف النشاط المخصص:

Kotlin

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

Java

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

بعد ذلك، أنشئ بعض الثوابت في نص الفئة Activity خيارات واجهة برمجة تطبيقات الرسومات:

Kotlin

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

Java

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

أنشِئ متغيّرًا لتتبُّع اختيار واجهة برمجة التطبيقات:

Kotlin

private var apiOverride = OVERRIDE_NONE

Java

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")
    }
}

Java

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);
  }
}

عليك استدعاء الدالة CheckVkQuality من أعلى قيمة التجاوز onCreate(). قبل استدعاء تنفيذ الفئة الأساسية:

Kotlin

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

Java

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

أخيرًا، أضِف إلغاءًا للدالة updateUnityCommandLineArguments(). التي تستخدم القيمة apiOverride لتمرير وسيطة سطر أوامر إلى محرّك Unity يحدّد واجهة برمجة تطبيقات الرسومات التي يجب استخدامها:

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"
}

Java

@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 عند بدء التشغيل ويختار Vulkan أو OpenGL. الإسبانية استنادًا إلى اقتراح Vkquality.

استخدام قائمة اقتراحات مخصّصة

حدِّد ملف قائمة اقتراحات مخصّصة من خلال تمرير اسم الملف. تضمين القائمة إلى StartVkQuality() بدلاً من تمرير سلسلة فارغة:

Kotlin

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

Java

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

تبحث ميزة Vkquality أولاً عن الملف في وحدة التخزين الداخلية لتطبيقك. الدليل. وإذا لم يكن الملف في وحدة التخزين الداخلية، فسيحاول Vkquality تحميل ملف ملف من مواد عرض حِزمة التطبيق. إذا لم يكن الملف في أي من الموقعين، تعرض Vkquality قيمة التعداد ERROR_MISSING_DATA_FILE.

لإنشاء ملف قائمة اقتراحات مخصّصة، استخدِم Vkquality List Editor. الموجودة في مستودع جيت هب. مستندات عن في README.