Wtyczka silnika VkQuality Unity

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:

  1. Skopiuj plik .aar do katalogu Assets/Android/Plugins w projektach AI. (Utwórz potrzebne podkatalogi Android i Plugins, jeśli nie istnieją).
.
Plik .aar Vk Quality w wymaganym katalogu projektu.
Rys.1 . Plik.aar Vkquality w wymaganym katalogu projektu
  1. 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.
.
Rysunek 2. Ustawienia importowania z platformy wtyczki VkQuality.
Rys. 2. Ustawienia importowania z platformy wtyczki VkQuality.

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:

  1. Skopiuj plik VkQualityTestActivity.java do folderu Assets/Plugins/Android.
  2. Zmień nazwę na odpowiednią do Twojej gry (na przykład MyGameActivity.java).
  3. Otwórz plik w edytorze tekstu.
  4. Zmień nazwę zajęć z VkQualityTestActivity na nazwę określoną (np. MyGameActivity.java).
  5. 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).
  6. 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:

  1. Skopiuj plik AndroidManifest.xml z Assets/Plugins/Android katalogu pakietu wtyczki do folderu Asset/Plugins/Android projektu katalogu.
  2. Otwórz plik w edytorze tekstu.
  3. Zmień wartość ustawienia activity android:name z com.google.android.games.VkQualityTest.VkQualityTestActivity na nazwy pakietów i aktywności użyte w poprzednich krokach (na przykład com.mycompany.mygame.MyGameActivity).
  4. Zapisz i zamknij plik.
  5. Otwórz okno ustawień Unity i wybierz ustawienia Player. Rozwiń sekcję Ustawienia publikowania i sprawdź Niestandardowy główny plik manifestu. .
.
Rysunek 3. Opcja Niestandardowy główny plik manifestu w ustawieniach Unity Playera
Rys.3. Opcja Niestandardowy główny plik manifestu w ustawieniach odtwarzacza Unity

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.