Android Frame Pacing'i Vulkan API'ye dayalı bir oluşturma motoruyla kullanmak için aşağıdaki işlevleri kullanın.
Oluşturmak için gerekli uzantıları tanımlama
Vulkan kullanırken Android Frame Pacing örneği oluşturmak için gereken uzantı grubunu toplamak üzere aşağıdaki kod snippet'inde gösterilen adımları tamamlayın:
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);
Daha sonra, vkCreateDevice()
yöntemini çağırarak Android Frame Pacing'i başlatabilirsiniz. VkDeviceCreateInfo*
türünde bir struct olan 2. bağımsız değişkenin enabledExtensionCount
üyesi, gerekli uzantıların sayısına ayarlanmış olmalıdır.
Sıra ailesini tanımlama
Android Frame Pacing'in doğru görüntüleme sırasını sunmak için Vulkan'ın hangi sıra ailesini kullandığını bilmesi gerekir. Doğru aileyi belirlemek için aşağıdaki kod snippet'inde gösterilen adımları tamamlayın:
// 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);
Değişim zinciri için kare hızını tanımlayın
Belirli bir fiziksel cihaz ve takas zinciri için Android Frame Pacing'i başlatmak için aşağıdaki kod snippet'inde gösterilen adımları tamamlayın:
// 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);
Bu, değiştirme süresini nanosaniye cinsinden belirler. Ortak değiştirme süreleri için swappy_common.h
içinde tanımlanan yardımcı makrolar bulunmaktadır (ör. SWAPPY_SWAP_60FPS
).
Ardından, değişim süresini nanosaniye cinsinden sağlamanız gerekir.
// 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);
ANativeWindow'u Ayarlama
Değişim işlemi, ANativeWindow_setFrameRate()
gibi ANativeWindow
ile ilgili bir işlem gerçekleştirebilmek için ANativeWindow
işleyicisine ihtiyaç duyar.
Android ekran yüzeyiniz değiştiğinde ve yeni bir ANativeWindow
herkese açık kullanıcı adınız olduğunda SwappyVk_setWindow()
numarasını çağırın (örnek için Küp örneğine bakın).
Otomatik Modlar
Android Frame Pacing, değiştirme süresini ve ardışık düzen modunu önceki karelerin ortalama süresine göre ayarlar. Bu davranışı aşağıdaki işlevlerle kontrol edebilirsiniz:
void SwappyVk_setAutoSwapInterval(bool enabled);
void SwappyVk_setMaxAutoSwapIntervalNS(uint64_t max_swap_ns);
void SwappyVk_setAutoPipelineMode(bool enabled);
Çerçeve göster
Oyununuzun bir karesini Android Frame Pacing'e sunmak için SwappyVk_queuePresent()
numaralı telefonu arayın.
Bu işlev, oyununuz adına vkQueuePresentKHR()
işlevini çağırır.
Takas zincirini yok edin
Belirli bir takas zinciriyle ilişkili SwappyVk
verilerini kaldırmak için aşağıdaki kod snippet'inde gösterilen adımları tamamlayın:
// Reusing local variables from previous snippets: // VkDevice device; // VkSwapchainKHR swapchain; // const VkAllocationCallbacks allocator; SwappyVk_destroySwapchain(device, swapchain); vkDestroySwapchainKHR(device, swapchain, &allocator);