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:
- .aar dosyasını projenizin
Assets/Android/Plugins
dizinine kopyalayın. (Mevcut değilse gerekliAndroid
vePlugins
alt dizinlerini oluşturun.)
![Gerekli proje dizinindeki VkQuality .aar dosyası.](https://developer.android.google.cn/static/images/games/engines/unity/unity-vkquality-unityassets.png?authuser=5&hl=tr)
- 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ı.](https://developer.android.google.cn/static/images/games/engines/unity/unity-vkquality-unityplugin.png?authuser=5&hl=tr)
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:
VkQualityTestActivity.java
dosyasınıAssets/Plugins/Android
dizininize kopyalayın.- Bunu oyununuza uygun bir adla yeniden adlandırın (örneğin,
MyGameActivity.java
). - Dosyayı bir metin düzenleyicide açın.
VkQualityTestActivity
olan sınıf adını dosyaya verdiğiniz adla değiştirin (örneğin,MyGameActivity.java
).- 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
). - 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:
AndroidManifest.xml
dosyasını eklenti paketininAssets/Plugins/Android
dizininden projenizinAsset/Plugins/Android
dizinine kopyalayın.- Dosyayı bir metin düzenleyicide açın.
activity android:name
ayarı içincom.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.- Dosyayı kaydedin ve kapatın.
- 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.](https://developer.android.google.cn/static/images/games/engines/unity/unity-vkquality-unitymanifest.png?authuser=5&hl=tr)
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.