VkQuality Unity motor eklentisi

Unity motoru için VkQuality eklentisi, belirli cihazlarda oyununuzda kullanılabilecek Vulkan veya OpenGL ES grafik API'sinin başlatma zamanıyla ilgili önerileri sağlar.

VkQuality, Vulkan'ı Unity motorunun varsayılan izin verilenler listesinden daha kısıtlı bir cihaz grubunda önerir. Vulkan'ın performans avantajlarından yararlanırken Vulkan'ı daha yeni grafik sürücülere sahip yeni cihazlarla sınırlandırarak oyununuzun sürücü sorunlarına maruz kalmasını önlemek için VkQuality'yi kullanın. VkQuality, önerilen cihazlarda sürücü sorunlarıyla karşılaşmaya devam edebileceği için yalnızca kalite önerilerinde bulunur, garanti vermez. VkQuality, oyununuz için cihaz önerileri eklemenize veya kaldırmanıza olanak tanıyan özel listeleri destekler.

Unity motor oyununuzda Vulkan'ı etkinleştirin

VkKalite, oyununuzda Unity proje ayarlarında hem OpenGL ES hem de Vulkan oluşturucularının etkinleştirilmiş olmasını gerektirir. AutoGraphics API seçeneğini kullanarak veya grafik API'lerini manuel olarak ayarlayarak oluşturucuları etkinleştirin.

Unity motoru için VkQuality eklentisini edinin

GitHub'dan VkQuality eklentisini indirin. Eklenti, Unity 2021 ve sonraki sürümlerle uyumludur. Android'de Vulkan'ı etkinleştirmek için Unity 2021 LTS veya sonraki bir sürümü kullanın. Eklenti paketi, başlangıçta grafik API'sini ayarlamak için eklentiyi kullanan ve ardından cihazın etkin grafik API'sine ayarlanmış bir dize görüntüleyen temel örnek proje içerir.

VkQuality Vulkan öneri listesini yönet

VkQuality, desteklenen cihazların varsayılan bir öneri listesini içerir. Özel öneri listesi kullanma hakkında bilgi edinmek için Özel öneri listesi kullanma bölümüne bakın.

Öneri listesi üç kategori içerir:

  • Vulkan cihaz izin verilenler listesi
  • GPU önerisi izin verilenler listesi
  • GPU önerisi reddetme listesi

Cihaz izin verilenler listesi eşleşiyor

VkQuality ilk olarak, etkin cihazın izin verilenler listesine eklenip eklenmediğini ve o cihazın izin verilenler listesinde belirtilen minimum Android sürümünü ve Vulkan sürücü sürümünü çalıştırıp çalıştırmadığını kontrol eder. Bu ölçütler karşılanırsa VkQuality, RECOMMENDATION_VULKAN_BECAUSE_DEVICE_MATCH sıralama değerini döndürerek Vulkan'ı önerir.

Cihaz, izin verilenler listesindeyse ancak izin verilenler listesinde kendisi için belirtilen minimumun altında bir Android sürümü veya sürücü sürümü çalıştırıyorsa VkQuality, RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER değerini döndürerek OpenGL ES'yi önerir.

GPU önerisi eşleşmeleri

Cihaz izin verilenler listesinde cihaz eşleşmesi bulunmazsa VkQuality, GPU modelini ve sürücü sürümünü GPU önerisi izin verme ve reddetme listelerine göre değerlendirir. GPU modeli ve sürücü sürümü, GPU önerisi izin verilenler listesindeki bir girişle eşleşirse VkQuality, RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH enum sabitini döndürerek Vulkan'ı önerir.

GPU modeli ve sürücü sürümü, GPU öneri reddetme listesindeki bir girişle eşleşirse VkQuality, RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH değerini döndürerek OpenGL ES'yi önerir.

Eşleşmesi olmayan öneriler

Eşleşme bulunmazsa VkQuality, çalışan cihazın Android API düzeyi öneri listesindeki Future API düzeyine eşit veya bundan yüksekse Vulkan'ı önerir. Varsayılan öneri listesinin Future API düzeyi 36'dır. Diğer bir deyişle, API düzeyi 36 veya üstünü çalıştıran eşleşmeyen cihazlarda VkQuality, RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID numaralandırma sabitini döndürür.

Cihaz izin verilenler listesinde veya GPU öneri listelerinde eşleşme bulunamazsa ve cihazın API düzeyi Gelecekteki API düzeyinin altındaysa VkQuality, RECOMMENDATION_GLES_BECAUSE_NO_DEVICE_MATCH değerini döndürerek OpenGL ES'yi önerir.

VkQuality arşiv dosyasını projenize ekleyin

VkQuality eklentisi, indirilen paket arşivinin Assets/Android/Plugins dizininde bulunan VkQuality-1.x.x.aar dosyasıdır. .aar dosyasının gerçek sürüm numarası, paket arşivi adının sürüm numarasıyla eşleşir. Eklentiyi yüklemek için aşağıdaki adımları uygulayın:

  1. .aar dosyasını projenizin Assets/Android/Plugins dizinine kopyalayın. (Mevcut değilse gerekli Android ve Plugins alt dizinlerini oluşturun.)
Gerekli proje dizinindeki VkQuality .aar dosyası.
Şekil 1.Gerekli proje dizinindeki VkQuality .aar dosyası.
  1. Unity Proje hiyerarşisinde VkQuality-1.x.x eklenti dosyasını seçerek İnceleyici bölmesinde İçe Aktarma Ayarları'nı açın. Android platformunun işaretli olduğundan emin olun.
Şekil 2. VkQuality eklentisi platformu içe aktarma ayarları.
Şekil 2. VkQuality eklentisi platformu içe aktarma ayarları.

VkQuality'yi çağırmak için özel bir etkinlik kullan

Tipik Unity motoru eklentilerinin aksine, Unity motoru başlatılmadan önce grafik API'si önerisi almak için VkQuality'in yürütülmesi gerekir. Daha sonra, Grafik API'sini VkQuality önerisine göre ayarlamak için Unity oynatıcısı komut satırı bağımsız değişkenleri özelliğini kullanırsınız. Android'de, komut satırı bağımsız değişkenlerinin iletilmesi için özel bir etkinlik oluşturarak UnityPlayerActivity'nin varsayılan davranışının geçersiz kılınması gerekir.

Oyununuz zaten özel bir etkinlik kullanıyorsa Mevcut bir özel etkinliğe VkQuality ekleme bölümüne bakın. Oyununuz için yeni bir özel etkinlik oluşturmak istiyorsanız Unity projenize özel etkinlik ekleme başlıklı bölümü inceleyin.

Unity motor projenize özel etkinlik ekleme

VkQuality'yi kullanan bir özel etkinlik örneği, Assets/Plugins/Android/VkQualityTestActivity.java ürünündeki eklenti paketinde yer almaktadır. Dosyayı özelleştirmek ve oyununuzda kullanmak için aşağıdaki adımları uygulayın:

  1. VkQualityTestActivity.java dosyasını Assets/Plugins/Android dizininize kopyalayın.
  2. Bunu oyununuza uygun bir adla yeniden adlandırın (örneğin, MyGameActivity.java).
  3. Dosyayı bir metin düzenleyicide açın.
  4. VkQualityTestActivity olan sınıf adını dosyaya verdiğiniz adla değiştirin (örneğin, MyGameActivity.java).
  5. Paket adını com.google.android.games.VkQualityTest yerine, Unity Proje Ayarlarınızdaki Diğer Ayarlar bölümündeki Paket Adı alanının değeriyle eşleşecek şekilde değiştirin (ör. com.mycompany.mygame).
  6. Dosyayı kaydedin ve kapatın.

Özel etkinliğinize referans veren bir özel manifest dosyası ekleyin ve Unity'ye özel manifest dosyanızı kullanmasını söyleyin:

  1. AndroidManifest.xml dosyasını eklenti paketinin Assets/Plugins/Android dizininden projenizin Asset/Plugins/Android dizinine kopyalayın.
  2. Dosyayı bir metin düzenleyicide açın.
  3. activity android:name ayarı için com.google.android.games.VkQualityTest.VkQualityTestActivity olan değeri, önceki adımlarda kullandığınız paket ve etkinlik adlarına (ör. com.mycompany.mygame.MyGameActivity) değiştirin.
  4. Dosyayı kaydedin ve kapatın.
  5. Unity ayarları penceresini açıp Oyuncu ayarlarını seçin. Publishing Settings (Yayınlama Ayarları) bölümünü genişletin ve Custom Main Manifest (Özel Ana Manifest) onay kutusunu işaretleyin.
Şekil 3.Unity Player ayarlarındaki Özel Ana Manifest seçeneği.
Şekil 3. Unity Player ayarlarındaki Özel Ana Manifest seçeneği.

Projeniz artık başlangıçta VkQuality'yi çağıran ve VkQuality önerisine göre Vulkan veya OpenGL ES'yi seçen özel etkinliği kullanacak şekilde ayarlandı.

Mevcut bir özel etkinliğe VkQuality'yi ekleme

Oyununuzda varsayılan UnityPlayerActivity değerini geçersiz kılan özel bir etkinlik zaten varsa aşağıdaki kodu ekleyerek VkKalite önerilerini entegre edin:

İlk olarak, VkQuality içe aktarma ifadesini özel etkinlik dosyasının en üstündeki içe aktarmalar listesine ekleyin:

Kotlin

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

Java

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

Ardından, grafik API seçenekleri için Activity sınıfınızın gövdesinde bazı sabit değerler oluşturun:

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;

API seçimini izlemek için bir değişken oluşturun:

Kotlin

private var apiOverride = OVERRIDE_NONE

Java

private int apiOverride = OVERRIDE_NONE;

Activity sınıfınıza aşağıdaki işlevi ekleyin:

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

Temel sınıf uygulamasını çağırmadan önce onCreate() geçersiz kılma işlevinin üst kısmından CheckVkQuality işlevini çağırın:

Kotlin

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

Java

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

Son olarak, Unity motoruna hangi grafik API'sinin kullanılacağını belirten bir komut satırı bağımsız değişkeni iletmek için apiOverride değerini kullanan updateUnityCommandLineArguments() işlevinin geçersiz kılmasını ekleyin:

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

Özel etkinliğiniz artık başlangıçta VkQuality'yi çağırır ve VkQuality önerisine göre Vulkan veya OpenGL ES'yi seçer.

Özel bir öneri listesi kullanma

Boş bir dize iletmek yerine listeyi içeren dosyanın adını StartVkQuality() parametresine ileterek özel bir öneri listesi dosyası belirtin:

Kotlin

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

Java

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

Vk Quality, önce uygulamanızın dahili depolama dizininde dosyayı arar. Dosya dahili depolamada değilse VkQuality dosyayı uygulama paketinizin öğelerinden yüklemeye çalışır. Dosya iki konumda da değilse Vk Quality, ERROR_MISSING_DATA_FILE sıralama değerini döndürür.

Özel bir öneri listesi dosyası oluşturmak için GitHub deposunda bulunan VkQuality List Editor aracını kullanın. Aracın belgeleri BENİOKU konumunda bulunmaktadır.