VkQuality Unity 엔진 플러그인

Unity 엔진용 VkQuality 플러그인은 특정 기기에서 게임에 사용할 그래픽 API(Vulkan 또는 OpenGL ES)의 시작 시간 권장사항을 제공합니다.

VkQuality는 Unity 엔진의 기본 허용 목록보다 더 제한된 기기 세트에서 Vulkan을 권장합니다. VkQuality를 사용하여 Vulkan의 성능 이점을 누리면서 Vulkan의 사용을 최신 그래픽 드라이버가 있는 최신 기기로 제한하여 게임이 드라이버 문제에 노출되는 것을 제한합니다. VkQuality는 권장 기기에서 드라이버 문제가 발생할 수 있으므로 품질 권장사항만 보장하지는 않습니다. VkQuality는 게임의 기기 추천을 추가하거나 삭제할 수 있는 맞춤 목록을 지원합니다.

Unity 엔진 게임에서 Vulkan 사용 설정

VkQuality를 사용하려면 Unity 프로젝트 설정에서 OpenGL ES 및 Vulkan 렌더기를 모두 사용 설정해야 합니다. Auto Graphics API 옵션을 사용하거나 그래픽 API를 수동으로 설정하여 렌더기를 사용 설정합니다.

Unity 엔진용 VkQuality 플러그인 가져오기

GitHub에서 VkQuality 플러그인을 다운로드합니다. 플러그인은 Unity 2021 이상과 호환됩니다. Unity 2021 LTS 이상을 사용하여 Android에서 Vulkan을 사용 설정합니다. 플러그인 패키지에는 시작 시 플러그인을 사용하여 그래픽 API를 설정한 다음 기기의 활성 그래픽 API로 설정된 문자열을 표시하는 기본 샘플 프로젝트가 포함되어 있습니다.

VkQuality Vulkan 권장사항 목록 관리

VkQuality에는 지원되는 기기의 기본 권장사항 목록이 포함되어 있습니다. 커스텀 추천 목록 사용에 관한 자세한 내용은 커스텀 추천 목록 사용 섹션을 참조하세요.

추천 목록에는 다음 세 가지 카테고리가 있습니다.

  • Vulkan 기기 허용 목록
  • GPU 권장사항 허용 목록
  • GPU 권장사항 거부 목록

기기 허용 목록 일치

VkQuality는 먼저 활성 기기가 기기 허용 목록에 포함되어 있는지 확인하고 기기의 허용 목록에 지정된 최소 Android 버전 및 Vulkan 드라이버 버전을 실행하는지 확인합니다. 이러한 기준이 충족되면 VkQuality는 RECOMMENDATION_VULKAN_BECAUSE_DEVICE_MATCH enum 값을 반환하여 Vulkan을 권장합니다.

기기가 허용 목록에 있지만 허용 목록에 지정된 최솟값보다 낮은 Android 버전 또는 드라이버 버전을 실행 중인 경우 VkQuality는 RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER를 반환하여 OpenGL ES를 권장합니다.

GPU 권장사항 일치

기기 허용 목록에 일치하는 기기가 없으면 VkQuality는 GPU 권장사항 허용 및 거부 목록을 기준으로 GPU 모델 및 드라이버 버전을 평가합니다. GPU 모델과 드라이버 버전이 GPU 추천 허용 목록의 항목과 일치하면 VkQuality는 RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH enum 상수를 반환하여 Vulkan을 권장합니다.

GPU 모델 및 드라이버 버전이 GPU 추천 거부 목록의 항목과 일치하면 VkQuality는 RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH를 반환하여 OpenGL ES를 권장합니다.

일치하는 항목이 없는 추천

일치하는 항목이 발견되지 않으면 실행 중인 기기의 Android API 수준이 권장사항 목록의 Future API 수준 이상인 경우 VkQuality를 사용하는 것이 좋습니다. 기본 권장사항 목록의 향후 API 수준은 36입니다. 즉, API 수준 36 이상을 실행하는 일치하지 않는 기기에서 VkQuality는 RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID enum 상수를 반환합니다.

기기 허용 목록 또는 GPU 권장사항 목록에서 일치하는 항목을 찾을 수 없고 기기의 API 수준이 향후 API 수준보다 낮은 경우 VkQuality는 RECOMMENDATION_GLES_BECAUSE_NO_DEVICE_MATCH를 반환하여 OpenGL ES를 추천합니다.

프로젝트에 VkQuality 보관 파일을 추가합니다.

VkQuality 플러그인은 다운로드한 패키지 보관 파일의 Assets/Android/Plugins 디렉터리에 있는 VkQuality-1.x.x.aar 파일입니다. .aar 파일의 실제 버전 번호는 패키지 보관 파일 이름의 버전 번호와 일치합니다. 플러그인을 설치하려면 다음 단계를 따르세요.

  1. .aar 파일을 프로젝트의 Assets/Android/Plugins 디렉터리에 복사합니다. 필요한 AndroidPlugins 하위 디렉터리가 없으면 새로 만듭니다.
필수 프로젝트 디렉터리에 있는 VkQuality .aar 파일
그림 1. 필수 프로젝트 디렉터리에 있는 VkQuality .aar 파일
  1. Unity Project 계층 구조에서 VkQuality-1.x.x 플러그인 파일을 선택하여 Inspector(검사기) 창에 Import Settings(가져오기 설정)를 표시합니다. Android 플랫폼을 선택했는지 확인합니다.
그림 2. VkQuality 플러그인 플랫폼 가져오기 설정입니다.
그림 2. VkQuality 플러그인 플랫폼 가져오기 설정

맞춤 활동을 사용하여 VkQuality 호출

일반적인 Unity 엔진 플러그인과 달리 Unity 엔진을 초기화하기 전에 VkQuality를 실행하여 그래픽 API 권장사항을 가져와야 합니다. 그런 다음 Unity 플레이어 명령줄 인수 기능을 사용하여 VkQuality 권장사항에 따라 그래픽 API를 설정합니다. Android에서 명령줄 인수를 전달하려면 맞춤 활동을 생성하여 UnityPlayerActivity의 기본 동작을 재정의해야 합니다.

게임에서 이미 맞춤 활동을 사용하고 있다면 기존 맞춤 활동에 VkQuality 추가 섹션을 참고하세요. 게임의 새 맞춤 활동을 만들려면 다음에 나오는 Unity 프로젝트에 맞춤 활동 추가를 참고하세요.

Unity 엔진 프로젝트에 맞춤 활동 추가

VkQuality를 사용하는 맞춤 활동의 예는 Assets/Plugins/Android/VkQualityTestActivity.java플러그인 패키지에 포함되어 있습니다. 파일을 맞춤설정하고 게임에서 사용하려면 다음 단계를 따르세요.

  1. VkQualityTestActivity.java 파일을 Assets/Plugins/Android 디렉터리에 복사합니다.
  2. 이름을 게임에 적합한 이름으로 변경합니다 (예: MyGameActivity.java).
  3. 텍스트 편집기에서 파일을 엽니다.
  4. 클래스 이름을 VkQualityTestActivity에서 파일에 지정한 이름 (예: MyGameActivity.java)으로 변경합니다.
  5. com.google.android.games.VkQualityTest에서 패키지 이름을 변경하여 Unity 프로젝트 설정 Player(플레이어) 카테고리의 Package Name(패키지 이름) 필드의 Other Settings(기타 설정) 필드 값(예: com.mycompany.mygame)과 일치하도록 합니다.
  6. 파일을 저장하고 닫습니다.

맞춤 활동을 참조하는 맞춤 매니페스트 파일을 추가하고 Unity에 맞춤 매니페스트 파일을 사용하도록 지시합니다.

  1. 플러그인 패키지의 Assets/Plugins/Android 디렉터리에서 AndroidManifest.xml 파일을 프로젝트의 Asset/Plugins/Android 디렉터리로 복사합니다.
  2. 텍스트 편집기에서 파일을 엽니다.
  3. activity android:name 설정 값을 com.google.android.games.VkQualityTest.VkQualityTestActivity에서 이전 단계에서 사용한 패키지 및 활동 이름 (예: com.mycompany.mygame.MyGameActivity)으로 변경합니다.
  4. 파일을 저장하고 닫습니다.
  5. Unity 설정 창을 열고 Player(플레이어) 설정을 선택합니다. 게시 설정 섹션을 펼치고 맞춤 기본 매니페스트 체크박스를 선택합니다.
그림 3. Unity Player 설정의 맞춤 기본 매니페스트 옵션
그림 3. Unity Player 설정의 Custom Main Manifest 옵션

이제 프로젝트가 시작 시 VkQuality를 호출하는 맞춤 활동을 사용하도록 설정되었으며 VkQuality 권장사항에 따라 Vulkan 또는 OpenGL ES를 선택합니다.

기존 맞춤 활동에 VkQuality 추가

게임에 기본 UnityPlayerActivity를 재정의하는 맞춤 활동이 이미 있다면 다음 코드를 추가하여 VkQuality 추천을 통합합니다.

먼저 맞춤 활동 파일 상단의 가져오기 목록에 VkQuality import 문을 추가합니다.

Kotlin

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

Java

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

그런 다음 그래픽 API 선택을 위한 Activity 클래스의 본문에 상수를 만듭니다.

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 선택을 추적할 변수를 만듭니다.

Kotlin

private var apiOverride = OVERRIDE_NONE

Java

private int apiOverride = OVERRIDE_NONE;

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

기본 클래스 구현을 호출하기 전에 onCreate() 재정의 함수의 맨 위에서 CheckVkQuality 함수를 호출합니다.

Kotlin

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

Java

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

마지막으로 apiOverride 값을 사용하는 updateUnityCommandLineArguments() 함수의 재정의를 추가하여 사용할 그래픽 API를 지정하는 명령줄 인수를 Unity 엔진에 전달합니다.

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

이제 맞춤 활동이 시작 시 VkQuality를 호출하고 VkQuality 권장사항에 따라 Vulkan 또는 OpenGL ES를 선택합니다.

맞춤 추천 목록 사용

빈 문자열을 전달하는 대신 목록이 포함된 파일의 이름을 StartVkQuality()에 전달하여 커스텀 추천 목록 파일을 지정합니다.

Kotlin

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

Java

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

VkQuality는 먼저 애플리케이션의 내부 저장소 디렉터리에서 파일을 찾습니다. 파일이 내부 저장소에 없으면 VkQuality는 App Bundle의 애셋에서 파일을 로드하려고 시도합니다. 파일이 두 위치에 모두 있지 않으면 VkQuality는 ERROR_MISSING_DATA_FILE enum 값을 반환합니다.

커스텀 권장사항 목록 파일을 만들려면 GitHub 저장소에 있는 VkQuality List Editor 도구를 사용합니다. 이 도구에 관한 문서는 리드미에 있습니다.