VkQuality Unity motor eklentisi

Unity motoru için VkQuality eklentisi, lansman zamanı önerileri sunar belirli bir platformda oyununuz için kullanmak üzere grafik API'sının (Vulkan veya OpenGL ES) cihazlar.

VkQuality, Vulkan'ı Unity'ye kıyasla daha kısıtlı bir cihaz grubunda öneriyor motorunun varsayılan izin verilenler listesine eklenir. VkQuality'yi kullanarak şunun performans avantajlarından yararlanın: Vulkan, Vulkan kullanımını yeni grafiklere sahip yeni cihazlarla sınırlar Bu durum, oyununuzun sürücü sorunlarıyla karşılaşma olasılığını azaltır. Yalnızca VkKaliteli önerilmesini garantilemez, çünkü yalnızca önerilen cihazlarda sürücü sorunlarıyla karşılaşılabilir. VkKaliteli, özel listeleri destekler, Bu uygulamada, Google Arama'da hesabınız için cihaz önerileri ekleyip bir oyundur.

Unity motor oyununuzda Vulkan'ı etkinleştirin

VkQuality, oyununuzda hem OpenGL ES hem de Vulkan oluşturucularının olmasını gerektirir etkinleştirdiğinizden emin olun. Grafik API'sı seçeneğini kullanarak veya grafik API'lerini manuel olarak ayarlayarak kullanabilirsiniz.

Unity motoru için VkQuality eklentisini edinin

VkQuality eklentisini GitHub'dan indirin. Eklenti Unity 2021 ve daha yeni sürümlerle uyumludur. Etkinleştirmek için Unity 2021 LTS veya sonraki bir sürümü kullanın Vulkan, Android'de. Eklenti paketi, grafik API'sini başlangıçta ayarlayacak ve ardından Cihazın etkin grafik API'si.

VkQuality Vulkan öneri listesini yönetme

VkKalite, desteklenen cihazlardan oluşan varsayılan bir öneri listesi içerir. Örneğin, hakkında bilgi için Özel bir öneri listesi kullanma öneri listesi bölümüne bakın.

Öneri listesinde üç kategori bulunur:

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

Cihaz izin verilenler listesi eşleşmeleri

VkKaliteli öncelikle etkin cihazın cihaza dahil olup olmadığını kontrol eder. minimum Android sürümünü ve Vulkan sürücüsünü çalıştırıp çalıştırmadığı izin verilenler listesinde belirtilen sürüm. Bu ölçütler karşılanırsa VkKaliteli, Vulkan'ı RECOMMENDATION_VULKAN_BECAUSE_DEVICE_MATCH sıralama değeri.

Cihaz, izin verilenler listesinde olmasına rağmen bir Android sürümünü veya sürücüsünü çalıştırıyorsa izin verilenler listesinde bunun için belirtilen minimum sürümün altında olan sürüm, VkQuality RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER değerini döndürerek OpenGL ES'yi önerir.

GPU önerisi eşleşmeleri

Cihazın izin verilenler listesinde herhangi bir cihaz eşleşmesi bulunmazsa VkQuality, GPU önerisine göre GPU modeli ve sürücü sürümü izin verme ve reddetme listeler. GPU modeli ve sürücü sürümü, GPU'daki bir girişle eşleşiyorsa Vk Quality, Vulkan'ı önerirken bunun için RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH sıralama sabiti.

GPU modeli ve sürücü sürümü, GPU'daki bir girişle eşleşiyorsa öneri reddetme listesi, VkQuality'nin önceki deneyime döndüğünde OpenGL ES'yi RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH

Eşleşmeyen öneriler

Eşleşme bulunmazsa Vulkan, Android API düzeyi [gelecekteki API] seviyesinin aynı veya bu seviyeden yüksek olduğunu öneri listesi. Varsayılan öneri listesinin Gelecekteki API düzeyi şudur: 36: VkQuality (API düzeyi 36 veya üstünü çalıştıran eşleşmeyen cihazlarda) RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID enum sabitini döndürür.

Cihazın izin verilenler listesinde veya GPU öneri listelerinde eşleşme bulunmazsa Cihazın API düzeyi ise Gelecekteki API düzeyi olan VkQuality'nin altındaysa RECOMMENDATION_GLES_BECAUSE_NO_DEVICE_MATCH değerini döndürerek OpenGL ES'yi önerir.

VkQuality arşiv dosyasını projenize ekleyin

VkQuality eklentisi, VkQuality-1.x.x.aar İndirilen paket arşivinin Assets/Android/Plugins dizini. Asıl .aar dosyasının sürüm numarası paketin sürüm numarasıyla eşleşiyor arşiv adı. Eklentiyi yüklemek için aşağıdaki adımları uygulayın:

  1. .aar dosyasını sitenizin Assets/Android/Plugins dizinine kopyalayın. belirler. (Buna karşılık gelen Android ve Plugins alt dizinlerini oluşturun. mevcut değildir.)
ziyaret edin.
Gerekli proje dizinindeki VkQuality .aar dosyası.
Şekil 1.Gerekli proje dizinindeki VkQuality .aar dosyası.
  1. Unity Projesi hiyerarşisinde VkQuality-1.x.x eklenti dosyasını seçin Denetçi bölmesinde İçe Aktarma Ayarlarını görüntülemeniz gerekir. Lütfen Android platformu işaretli olmalıdır.
ziyaret edin.
Şekil 2. VkQuality eklenti platformu içe aktarma ayarları.
Şekil 2. VkQuality eklenti platformu içe aktarma ayarları.

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

Tipik Unity motor eklentilerinden farklı olarak, Unity motoru başlatılmadan önce grafik API'sinin önerisini bulun. Daha sonra Unity oynatıcı komut satırı bağımsız değişkenleri özelliğini kullanarak Grafik API'sini VkQuality önerisine göre kullanır. Android'de, komut satırı bağımsız değişkenleri, Özel bir oluşturarak UnityPlayerActivity etkinliği hakkında daha fazla bilgi edinin.

Oyununuz zaten özel bir etkinlik kullanıyorsa Bir Mevcut özel etkinlikler bölümüne bakın. Şunun için yeni bir özel etkinlik oluşturmak için: Unity projenize özel etkinlik ekleme başlıklı makaleye göz atın.

Unity Engine projenize özel etkinlik ekleyin

Eklentiye VkQuality kullanan bir özel etkinlik örneği verilmiştir. paketinde Assets/Plugins/Android/VkQualityTestActivity.java olarak tanımlanmıştır. Dosyayı özelleştirmek ve oyununuzda kullanmak için aşağıdaki adımları uygulayın:

  1. VkQualityTestActivity.java dosyasını kopyalayıp Assets/Plugins/Android dizini.
  2. Adı, oyununuza uygun bir adla değiştirin (örneğin, MyGameActivity.java) bilgileri gösterilir.
  3. Dosyayı bir metin düzenleyicide açın.
  4. VkQualityTestActivity olan sınıf adını, verdiğiniz adla değiştirin dosyası (örneğin, MyGameActivity.java).
  5. com.google.android.games.VkQualityTest olan paket adını şu şekilde değiştirin: Unity Proje Ayarlarınızdaki Paket Adı alanının değeriyle eşleştirin Diğer Ayarlar altındaki Oynatıcı kategorisi (örneğin, com.mycompany.mygame) tıklayın.
  6. Dosyayı kaydedin ve kapatın.

Özel etkinliğinize referans veren özel bir manifest dosyası ekleyip Unity'ye bildirin özel manifest dosyanızı kullanmak için:

  1. Assets/Plugins/Android içinden AndroidManifest.xml dosyasını kopyalayın eklenti paketinin dizinini projenizin Asset/Plugins/Android klasörüne ekleyin dizin.
  2. Dosyayı bir metin düzenleyicide açın.
  3. activity android:name ayarının değerini Şuraya com.google.android.games.VkQualityTest.VkQualityTestActivity: önceki adımlarda kullandığınız paket ve etkinlik adları (örneğin, com.mycompany.mygame.MyGameActivity).
  4. Dosyayı kaydedin ve kapatın.
  5. Unity ayarlar penceresini açıp Player ayarlarını seçin. Genişlet Yayınlama Ayarları bölümüne gidin ve Özel Ana Manifest'i işaretleyin. onay kutusunu işaretleyin.
ziyaret edin.
Şekil 3. Unity Oynatıcı ayarlarındaki Özel Ana Manifest seçeneği
Şekil 3. Unity Player ayarlarındaki Özel Ana Manifest seçeneği

Projeniz artık şu adreste VkQuality'yi çağıran özel etkinliği kullanacak şekilde ayarlandı: startup'ı seçer ve VkQuality önerisine göre Vulkan veya OpenGL ES'yi seçer.

VkQuality'yi mevcut bir özel etkinliğe ekleme

Oyununuzda varsayılanı geçersiz kılan bir özel etkinlik zaten varsa UnityPlayerActivity, şu kodu kullanabilirsiniz:

İlk olarak, VkQuality import (içe aktarma) ifadesini üst kısımdaki içe aktarmalar listesine ekleyin özel etkinlik dosyası:

Kotlin

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

Java

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

Sonra, Activity sınıfınızın gövdesinde grafik API seçimleri:

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

onCreate() geçersiz kılmasının üst kısmından CheckVkQuality işlevini çağırma 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, updateUnityCommandLineArguments() işlevinin bir geçersiz kılmasını ekleyin apiOverride değerini kullanan bir komut satırı bağımsız değişkeni Hangi grafik API'sinin kullanılacağını belirten Unity motoru:

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 Vulkan veya OpenGL'yi seçer ES, VkQuality önerisine göre.

Özel bir öneri listesi kullanın

Dosyanın adını ileterek özel bir öneri listesi dosyası belirtin içeren, boş bir dize iletmek yerine listeyi StartVkQuality() öğesine içeren bir kod snippet'i ekleyin:

Kotlin

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

Java

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

VkKaliteli ilk olarak uygulamanızın dahili depolamasında dosyayı arar dizin. Dosya dahili depolama alanında değilse VkKaliteli, dosyası olarak ayarlayın. Dosya iki konumda da değilse VkQuality, ERROR_MISSING_DATA_FILE enum değerini döndürür.

Özel bir öneri listesi dosyası oluşturmak için VkQuality List Editor'ı (VkKalite Listesi Düzenleyici) kullanın aracı GitHub deposunda bulabilirsiniz. araç, README (BENİOKU) öğesi içindedir.