📱

GameActivityとVulkanの環境構築

2025/02/22に公開

最小要件
MinimumSDK API 24 (Nougat Android 7.0)
AndroidNDK r12

build.gradle.ktsに下記を記述する

android {
    compileSdk = 35
    defaultConfig {
        minSdk = 24
        targetSdk = 35
        }
    }
    buildFeatures {
        prefab = true
    }
}
dependencies {
    implementation(libs.androidx.core.ktx)
    implementation(libs.androidx.appcompat)
    implementation(libs.androidx.games.activity)
}

CMake.txtに下記を記述する

find_package(game-activity REQUIRED CONFIG)
target_link_libraries(${CMAKE_PROJECT_NAME}
    vulkan
    game-activity::game-activity_static
    android
    log)

MainActivity.kts

import android.os.Bundle
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import com.google.androidgamesdk.GameActivity

class MainActivity : GameActivity() {
    companion object {
        init {
            System.loadLibrary("rayengine")
        }
    }

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

    private fun hideSystemBarsForImmersiveMode() {
        val insetsController = WindowCompat.getInsetsController(window, window.decorView)
        insetsController.hide(WindowInsetsCompat.Type.systemBars())
        insetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    }
}

Vulkan-Hppを使う

リポジトリからZIPファイルをダウンロードする場合

最小要件
CMake 3.10
C++ 11

Vulkan-HppリポジトリからZIPファイルをダウンロードしてください
このとき、VK_HEADER_VERSIONとタグの下三桁を一致させる必要があります
VK_HEADER_VERSIONは、includes/NDK/LLVM/vulkan/vulkan_core.hの66行目あたりに記載されています
分からなければタグを指定せずにダウンロードして設定を行い、コンパイルをすると発生するエラーのメッセージを読んでください

タグの検索窓にVK_HEADER_VERSIONを入力して選択します
タグの検索窓

Download ZIPを押下します
ZIPのダウンロードボタン

展開し、Vulkan-Hpp/vulkanディレクトリを残し、ほかのディレクトリを削除します
次にプロジェクトのルートディレクトリに"third_party"というディレクトリを作成してください
そこに抽出したVulkan-Hpp/vulkanをコピーします

ディレクトリ構成は以下のようになります

project_root
|   .gitignore
|   build.gradle.kts
|   gradle.properties
|   gradlew
|   gradlew.bat
|   local.properties
|   settings.gradle.kts
+---.gradle
+---.idea
+---app
+---build
+---gradle
\---third_party
    \---Vulkan-Hpp
        \---vulkan
                vulkan.cppm
                vulkan.hpp

CMakeLists.txtを書き換えます

cmake_minimum_required(VERSION 3.10)
set(CXX_STANDARD 11)
set(CXX_STANDARD_REQUIRED ON)

set(THIRD_PARTY_DIR ../../../../third_party)
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
    ${THIRD_PARTY_DIR}/Vulkan-Hpp
)

この他にも使用したいライブラリがあるときはthird_partyディレクトリにコピーすれば管理が楽です

FetchContentを使用する場合

最小要件
CMake 3.11
C++ 11

FetchContent_MakeAvailable()は、FetchContent_Populate()でもよい
GIT_TAGには、VK_HEADER_VERSIONと一致するタグを指定する(もちろんコミットIDでもよい)

cmake_minimum_required(VERSION 3.11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(FetchContent)
FetchContent_Declare(
    vulkan-hpp
    GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Hpp.git
    GIT_TAG v1.3.275
)
FetchContent_MakeAvailable(vulkan-hpp)
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
    ${vulkan-hpp_SOURCE_DIR}
)

または、Vulkan-Headersを用いることもできる
このリポジトリでは、vulkan-sdk-1.3.275.0とv1.3.275のようにコミットIDが同一でありながら別のタグを付けていることがある
よって、GIT_TAGはコミットIDにすると良い

include(FetchContent)
FetchContent_Declare(
    vulkan-headers
    GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Headers.git
    GIT_TAG 217e93c664ec6704ec2d8c36fa116c1a4a1e2d40 # VK_HEADER_VERSION == 275
)
FetchContent_MakeAvailable(vulkan-headers)
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
    ${vulkan-headers_SOURCE_DIR}/include
)

git submoduleを使用する場合

最小要件
CMake 3.10
C++ 11

git init
git switch -orphan main
git add .
git commit -m "initial commit"
mkdir submodule
cd submodule
git submodule add --depth 1 https://github.com/KhronosGroup/Vulkan-Hpp.git
git commit -m "add submodule Vulkan-Hpp"
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(SUBMODULE_DIR ../../../../submodule)
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
        ${SUBMODULE_DIR}/Vulkan-Hpp
)

VK_HEADER_VERSIONを一致させる
タグのみ取得してからタグを指定してチェックアウトしてください

cd submodule/Vulkan-Hpp
git sparse-checkout set vulkan
git fetch --tags
git checkout v1.3.275
cd ../../
git commit -m "checkout Vulkan-Hpp v1.3.275"

sparse-checkoutは、プロジェクトのリポジトリをクローンするたびに設定しなおす必要があります

git clone https://github.com/your-name/your-repository.git
cd your-repository
git submodule init
git submodule update --recommend-shallow --depth 1 --single-branch
cd submodule/Vulkan-Hpp
git sparse-checkout set vulkan

また、サブモジュールに対してgit submodule updateを実行するよりも前にgit sparse-checkout setを実行することはできません
よって、vulkanディレクトリのみクローンすることはできません

Discussion