Wtyczka VkQuality do silnika Unity zapewnia rekomendacje dotyczące czasu uruchamiania interfejsu graficznego interfejsu API – Vulkan lub OpenGL ES – do używania w grze w konkretnych urządzenia.
VkQuality zaleca używanie interfejsu Vulkan w przypadku bardziej ograniczonego zestawu urządzeń niż Unity domyślnej listy dozwolonych wyszukiwarek. Używaj VkQuality, aby uzyskać korzyści w zakresie wydajności interfejsu Vulkan z ograniczeniem korzystania z niego tylko na nowszych urządzeniach z nowszą grafiką kierowców, co ogranicza narażenie gry na problemy ze kierowcami. Tylko VkQuality przekazuje rekomendacje wysokiej jakości, a nie gwarantuje. na zalecanych urządzeniach napotkają problemy ze sterownikami. VkQuality obsługuje listy niestandardowe, Pozwala dodawać i usuwać rekomendacje urządzeń tę grę.
Włącz Vulkan w grze Unity
VkQuality wymaga, aby gra miała mechanizmy renderowania OpenGL ES i Vulkan można włączyć w ustawieniach projektu Unity. Włącz mechanizmy renderowania, korzystając z opcji Auto Graphics API lub przez ręczne ustawienie interfejsów API tego typu.
Pobierz wtyczkę VkQuality do silnika Unity
Pobierz wtyczkę VkQuality z GitHuba. Wtyczka to zgodne z Unity 2021 i nowszymi wersjami oprogramowania. Aby włączyć tę funkcję, użyj pakietu LTS Unity w wersji 2021 lub nowszej Vulkan na Androidzie. Pakiet wtyczek zawiera podstawowy przykładowy projekt, który używa do ustawienia interfejsu Graphics API podczas uruchamiania, a następnie wyświetla ciąg znaków ustawiony jako aktywny interfejs API grafiki urządzenia.
Zarządzanie listą rekomendacji VkQuality Vulkan
VkQuality zawiera domyślną listę rekomendacji obsługiwanych urządzeń. Dla: więcej informacji o korzystaniu z niestandardowej listy rekomendacji znajdziesz w artykule Używanie niestandardowej listy rekomendacji listę rekomendacji.
Lista rekomendacji zawiera 3 kategorie:
- Lista dozwolonych urządzeń obsługujących interfejs Vulkan
- Lista dozwolonych rekomendacji GPU
- Lista odrzuconych rekomendacji GPU
Dopasowania na liście dozwolonych urządzeń
VkQuality najpierw sprawdza, czy aktywne urządzenie jest uwzględnione w urządzeniu
oraz sprawdzić, czy jest na niej najnowsza wersja Androida i sterownik Vulkan
wersji określonej na liście dozwolonych dla tego urządzenia. Jeśli te kryteria są spełnione,
VkQuality zaleca korzystanie z interfejsu Vulkan przez zwrócenie
Wartość wyliczenia RECOMMENDATION_VULKAN_BECAUSE_DEVICE_MATCH
.
Jeśli urządzenie znajduje się na liście dozwolonych, ale ma zainstalowaną wersję Androida lub sterownika
wersja poniżej minimalnej określonej dla niej na liście dozwolonych, VkQuality
zaleca użycie OpenGL ES przez zwrócenie RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER
.
Jednakowe rekomendacje GPU
Jeśli na liście dozwolonych urządzeń nie ma dopasowania, VkQuality ocenia
Model GPU i wersja sterownika wbrew rekomendacji GPU zezwalają na lub są niedozwolone
list. Jeśli model GPU i wersja sterownika pasują do wpisu w GPU
listy dozwolonych rekomendacji, VkQuality zaleca korzystanie z interfejsu Vulkan przez zwrócenie
Stała wyliczenia RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH
.
Jeśli model GPU i wersja sterownika są zgodne z wpisem w GPU
lista odrzuconych rekomendacji, VkQuality zaleca użycie OpenGL ES przez zwrócenie
RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH
Rekomendacje bez dopasowania
Jeśli nie znaleziono dopasowań, VkQuality zaleca użycie interfejsu Vulkan, jeśli poziom interfejsu API Androida to
urządzenie z uruchomionym urządzeniem jest równe poziomowi interfejsu Future API lub od niego wyższym
z listą rekomendacji. Domyślna lista rekomendacji ma w przyszłości poziom interfejsu API ustawiony na
36, co oznacza, że na niedopasowanych urządzeniach z interfejsem API na poziomie 36 lub wyższym, VkQuality
zwraca stałą wyliczeniową RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID
.
Jeśli nie ma dopasowań na liście dozwolonych urządzeń lub listach rekomendacji GPU,
a poziom API urządzenia jest niższy niż poziom Future API, VkQuality
zaleca użycie OpenGL ES przez zwrócenie RECOMMENDATION_GLES_BECAUSE_NO_DEVICE_MATCH
.
Dodaj plik archiwum VkQuality do projektu
Wtyczka VkQuality to plik VkQuality-1.x.x.aar
znajdujący się w
Katalog Assets/Android/Plugins
pobranego archiwum pakietu. Rzeczywisty
numer wersji pliku .aar odpowiada numerowi wersji pakietu
nazwę archiwum. Aby zainstalować wtyczkę, wykonaj następujące czynności:
- Skopiuj plik .aar do katalogu
Assets/Android/Plugins
w projektach AI. (Utwórz potrzebne podkatalogiAndroid
iPlugins
, jeśli nie istnieją).
- Wybierz plik wtyczki
VkQuality-1.x.x
w hierarchii Projektu Unity. aby wyświetlić Ustawienia importowania w panelu Inspektor. Upewnij się, że parametr Platforma Android jest zaznaczona.
Używanie niestandardowej aktywności do wywoływania VkQuality
W przeciwieństwie do typowych wtyczek silnika Unity, aby uzyskać zalecenie dotyczące interfejsu API dla karty graficznej przed zainicjowaniem silnika Unity. Następnie używasz możesz użyć funkcji argumentów wiersza poleceń odtwarzacza Unity, aby ustawić Graphics API oparte na rekomendacji VkQuality. Na Androidzie: test argumentów wiersza poleceń wymaga zastąpienia domyślnego zachowania UnityPlayerActivity, tworząc niestandardowy aktywności.
Jeśli gra używa już niestandardowej aktywności, zapoznaj się z sekcją Dodawanie VkQuality istniejącą niestandardową aktywność. Aby utworzyć nową niestandardową aktywność związaną z urządzeniem gry, zapoznaj się z sekcją Dodawanie niestandardowej aktywności do projektu w Unity w następnej kolejności.
Dodaj niestandardowe działanie do projektu w Unity Engine
Wtyczka zawiera przykładową aktywność niestandardową wykorzystującą VkQuality
pakiet w: Assets/Plugins/Android/VkQualityTestActivity.java
.
Aby dostosować plik i używać go w grze, wykonaj te czynności:
- Skopiuj plik
VkQualityTestActivity.java
do folderuAssets/Plugins/Android
. - Zmień nazwę na odpowiednią do Twojej gry (na przykład
MyGameActivity.java
). - Otwórz plik w edytorze tekstu.
- Zmień nazwę zajęć z
VkQualityTestActivity
na nazwę określoną (np.MyGameActivity.java
). - Zmień nazwę pakietu z
com.google.android.games.VkQualityTest
na pasują do wartości w polu Package Name (Nazwa pakietu) w ustawieniach projektu w Unity Kategoria Gracz w sekcji Inne ustawienia (np.com.mycompany.mygame
). - Zapisz i zamknij plik.
Dodaj niestandardowy plik manifestu, który odwołuje się do Twojej niestandardowej aktywności, i poinformuj Unity , aby użyć niestandardowego pliku manifestu:
- Skopiuj plik
AndroidManifest.xml
zAssets/Plugins/Android
katalogu pakietu wtyczki do folderuAsset/Plugins/Android
projektu katalogu. - Otwórz plik w edytorze tekstu.
- Zmień wartość ustawienia
activity android:name
zcom.google.android.games.VkQualityTest.VkQualityTestActivity
na nazwy pakietów i aktywności użyte w poprzednich krokach (na przykładcom.mycompany.mygame.MyGameActivity
). - Zapisz i zamknij plik.
- Otwórz okno ustawień Unity i wybierz ustawienia Player. Rozwiń sekcję Ustawienia publikowania i sprawdź Niestandardowy główny plik manifestu. .
Twój projekt jest teraz skonfigurowany do używania niestandardowego działania, które wywołuje funkcję VkQuality uruchamiania i wybiera Vulkan lub OpenGL ES na podstawie rekomendacji VkQuality.
Dodawanie VkQuality do istniejącej aktywności niestandardowej
Jeśli gra ma już niestandardową aktywność, która zastępuje działanie domyślne
UnityPlayerActivity
, zintegruj rekomendacje VkQuality przez dodanie
ten kod:
Najpierw dodaj instrukcję importu VkQuality pliku niestandardowego aktywności:
Kotlin
import com.google.android.games.vkquality.VKQuality;
Java
import com.google.android.games.vkquality.VKQuality;
Następnie utwórz stałe w treści klasy Activity
dla obiektu
opcje interfejsu API grafiki:
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;
Utwórz zmienną do śledzenia wyboru interfejsu API:
Kotlin
private var apiOverride = OVERRIDE_NONE
Java
private int apiOverride = OVERRIDE_NONE;
Dodaj tę funkcję do klasy 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); } }
Wywołaj funkcję CheckVkQuality
na górze zastąpienia onCreate()
przed wywołaniem implementacji klasy bazowej:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { CheckVkQuality() super.onCreate(savedInstanceState) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { CheckVkQuality(); super.onCreate(savedInstanceState); }
Na koniec dodaj zastąpienie funkcji updateUnityCommandLineArguments()
który korzysta z wartości apiOverride
, aby przekazać argument wiersza poleceń do funkcji
Silnik Unity określający interfejs API grafiki, który ma być używany:
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; }
Niestandardowa aktywność wywołuje teraz VkQuality przy uruchamianiu i wybiera Vulkan lub OpenGL ES na podstawie rekomendacji VkQuality.
Użyj niestandardowej listy rekomendacji
Określ plik z niestandardową listą rekomendacji, przekazując nazwę pliku
zawierający listę do StartVkQuality()
zamiast przekazywania pustego ciągu:
Kotlin
val startResult = vkQuality.StartVkQuality("CUSTOM_FILE_NAME.vkq")
Java
int startResult = vkQuality.StartVkQuality("CUSTOM_FILE_NAME.vkq");
VkQuality najpierw szuka pliku w pamięci wewnętrznej aplikacji
katalogu. Jeśli pliku nie ma w pamięci wewnętrznej, VkQuality próbuje wczytać
z zasobów pakietu aplikacji. Jeśli plik nie znajduje się w żadnej lokalizacji,
Funkcja VkQuality zwraca wartość wyliczeniową ERROR_MISSING_DATA_FILE
.
Aby utworzyć niestandardowy plik listy rekomendacji, użyj edytora listy wysokiej jakości znajduje się w repozytorium GitHub. Dokumentacja znajduje się w pliku README.