Dodawanie funkcji tempa klatek

Aby używać Android Frame Pacing z silnikiem renderowania, użyj tych funkcji oparty na interfejsie Vulkan API.

Sprawdzanie rozszerzeń wymaganych do utworzenia

Do zebrania zestawu rozszerzeń niezbędnego do utworzenia instancji Android Frame. Tempo w przypadku korzystania z Vulkana: wykonaj czynności podane w tym kodzie snippet:

VkPhysicalDevice physicalDevice;
uint32_t availableExtensionCount;
VkExtensionProperties* pAvailableExtensions;
uint32_t requiredExtensionCount;
char** pRequiredExtensions;

// Determine the number of extensions available for this device.
vkEnumerateDeviceExtensionProperties(physicalDevice, layerName, &availableExtensionCount,
    pAvailableExtensions);

// Determine the number of required extensions.
SwappyVk_determineDeviceExtensions(physicalDevice, availableExtensionCount,
    pAvailableExtensions, &requiredExtensionCount, nullptr);

// Determine the required extensions.
pRequiredExtensions = (char**)malloc(requiredExtensionCount * sizeof(char*));
pRequiredExtensionsData = (char*)malloc(requiredExtensionCount * (VK_MAX_EXTENSION_NAME_SIZE + 1));
for (uint32_t i = 0; i < requiredExtensionCount; i++) {
    pRequiredExtensions[i] = &pRequiredExtensionsData[i * (VK_MAX_EXTENSION_NAME_SIZE + 1)];
}
SwappyVk_determineDeviceExtensions(physicalDevice, availableExtensionCount,
    pAvailableExtensions, &requiredExtensionCount, pRequiredExtensions);

Następnie możesz uruchomić Android Frame Pacing, wywołując funkcję vkCreateDevice(). 2. (struktura typu VkDeviceCreateInfo*) powinna mieć swój W przypadku elementu enabledExtensionCount ustawiono liczbę wymaganych rozszerzeń.

Określ rodzinę kolejek

Aby wyświetlić prawidłową kolejkę wyświetlania, Android Frame Pacing musi wiedzieć, rodziny kolejek, których używa Vulkan. Aby określić właściwą rodzinę, wypełnij czynności pokazane w tym fragmencie kodu:

// Reusing local variables from previous snippets:
// VkPhysicalDevice physicalDevice;

const VkDeviceCreateInfo createInfo;
const VkAllocationCallbacks allocator;
VkDevice device;
uint32_t queueFamilyIndex;
uint32_t queueIndex;
VkQueue deviceQueue;

// Values of "device" and "deviceQueue" set in the 1st and 2nd function
// calls, respectively.
vkCreateDevice(physicalDevice, &createInfo, &allocator, &device);
vkGetDeviceQueue(device, queueFamilyIndex, queueIndex, &deviceQueue);
SwappyVk_setQueueFamilyIndex(device, deviceQueue, queueFamilyIndex);

Zdefiniuj liczbę klatek na potrzeby zamiany klatek

Aby zainicjować Android Frame Pacing na danym urządzeniu fizycznym i przeprowadzić zamianę: wykonaj czynności podane w tym fragmencie kodu:

// Reusing local variables from previous snippets:
// VkPhysicalDevice physicalDevice;
// VkDevice device;

// Assume that the JNI environment is available in:
// JNIEnv *env;
// jobject jactivity;

// Assume that swapchain is already known.
VkSwapchainKHR swapchain;
uint64_t refreshDuration; // in nanoseconds

// Determine duration between vertical-blanking periods.
// Example: 60 FPS sets "refreshDuration" to 16,666,666.
SwappyVk_initAndGetRefreshCycleDuration(env, jactivity, physicalDevice,
        device, swapchain, &refreshDuration);

Określa czas trwania zamiany w nanosekundach. Istnieją makra pomocnicze zdefiniowane w polu swappy_common.h dla typowych okresów wymiany (na przykład SWAPPY_SWAP_60FPS).

Następnie podaj czas trwania zamiany w nanosekundach.

// Declare the periods in nanoseconds that should elapse before refreshing one
// image with the next image. There are helper macros defined in swappy_common.h
// for common swap durations.
// This example shows what to do when you want to render your game at 30 FPS.

SwappyVk_setSwapIntervalNS(device, swapchain, SWAPPY_SWAP_30FPS);

Ustawianie ANativeWindow

Aby wykonać działanie Zamieńpy, potrzebny jest nick ANativeWindow Działanie związane z usługą ANativeWindow, na przykład wywoływanie ANativeWindow_setFrameRate() Zadzwoń do nas SwappyVk_setWindow() gdy zmienił się wyświetlacz Androida i masz nowy telefon ANativeWindow uchwyt (przykład znajdziesz w przykładzie sześcianu).

Tryby automatyczne

Android Frame Pacing dostosowuje czas trwania zamiany i tryb potoku na podstawie średniego czasu trwania poprzednich klatek. Możesz kontrolować to zachowanie za pomocą następujące funkcje:

Zaprezentuj ramkę

Aby zaprezentować klatkę z gry w Android Frame Pacing, wywołaj polecenie SwappyVk_queuePresent() Ta funkcja wywołuje vkQueuePresentKHR() w imieniu Twojej gry.

Zniszcz swapchain

Aby zniszczyć dane SwappyVk powiązane z daną zamianą, wykonaj czynności pokazane w tym fragmencie kodu:

// Reusing local variables from previous snippets:
// VkDevice device;
// VkSwapchainKHR swapchain;
// const VkAllocationCallbacks allocator;

SwappyVk_destroySwapchain(device, swapchain);
vkDestroySwapchainKHR(device, swapchain, &allocator);