Android Çerçeve İlerlemesi'ni bir oluşturma motoruyla kullanmak için aşağıdaki işlevleri kullanın yeni bir kod snippet'i oluşturabilirsiniz.
Oluşturma için gerekli uzantıları tanımlama
Android Frame'in örneğini oluşturmak için gereken uzantı grubunu toplamak Vulkan kullanırken hız, aşağıdaki kodda gösterilen adımları tamamlayın 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);
Ardından vkCreateDevice()
numaralı telefonu arayarak Android Çerçeve İlerlemesi'ni başlatabilirsiniz. 2'si
VkDeviceCreateInfo*
türünde bir struct'ın kendi
enabledExtensionCount
üyesi, gerekli uzantı sayısına ayarlandı.
Sıra ailesini tanımlama
Doğru görüntüleme sırasını sunmak için Android Frame Pacing'in sıra ailesini ele alalım. Doğru aileyi belirlemek için adımları uygulayı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şme zinciri için kare hızını tanımlayın
Belirli bir fiziksel cihazda ve değişim zincirinde Android Çerçeve Hızı'nı 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şim süresini nanosaniye cinsinden belirler. Yardımcı makrolar var
yaygın değiştirme süreleri için swappy_common.h
içinde tanımlanır (örneğin,
SWAPPY_SWAP_60FPS
) tıklayın.
Daha sonra, 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
Swappy'nin performans göstermesi için ANativeWindow
herkese açık kullanıcı adı gerekiyor
ANativeWindow
ürününe özgü bir işlem (ör. telefon etme)
ANativeWindow_setFrameRate()
Telefonla arama
SwappyVk_setWindow()
Android ekran yüzeyiniz değiştiğinde ve yeni bir ANativeWindow
cihazınız olduğunda
herkese açık kullanıcı adı (örnek için Küp örneğine bakın).
Otomatik Modlar
Android Çerçeve İlerlemesi, değişim süresini ve ardışık düzen modunu aşağıdakilere göre ayarlar: önceki karelerin ortalama süresi. Bu davranışı şu işlevler:
void SwappyVk_setAutoSwapInterval(bool enabled);
void SwappyVk_setMaxAutoSwapIntervalNS(uint64_t max_swap_ns);
void SwappyVk_setAutoPipelineMode(bool enabled);
Kare göster
Oyununuzun bir karesini Android Frame Pacing'e göstermek için şu numarayı arayın:
SwappyVk_queuePresent()
.
Bu işlev, oyununuz adına vkQueuePresentKHR()
öğesini çağırır.
Takas zincirini yok edin
Belirli bir takas zinciriyle ilişkili SwappyVk
verilerini kaldırmak için
adımları uygulayın:
// Reusing local variables from previous snippets: // VkDevice device; // VkSwapchainKHR swapchain; // const VkAllocationCallbacks allocator; SwappyVk_destroySwapchain(device, swapchain); vkDestroySwapchainKHR(device, swapchain, &allocator);