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:
void SwappyVk_setAutoSwapInterval(bool enabled);
void SwappyVk_setMaxAutoSwapIntervalNS(uint64_t max_swap_ns);
void SwappyVk_setAutoPipelineMode(bool enabled);
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);