از عملکردهای زیر برای استفاده از Android Frame Pacing با موتور رندر مبتنی بر Vulkan API استفاده کنید.
پسوندهای مورد نیاز برای ایجاد را شناسایی کنید
برای جمع آوری مجموعه افزونه های لازم برای ایجاد یک نمونه از Android Frame Pacing هنگام استفاده از Vulkan، مراحل نشان داده شده در قطعه کد زیر را تکمیل کنید:
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);
سپس میتوانید با فراخوانی vkCreateDevice()
Android Frame Pacing را شروع کنید. آرگومان دوم، ساختاری از نوع VkDeviceCreateInfo*
، باید عضو enabledExtensionCount
آن را روی تعداد پسوندهای مورد نیاز تنظیم کند.
خانواده صف را شناسایی کنید
برای ارائه صف نمایش صحیح، Android Frame Pacing باید بداند Vulkan از کدام خانواده صف استفاده می کند. برای تعیین خانواده صحیح، مراحل نشان داده شده در قطعه کد زیر را کامل کنید:
// 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);
نرخ فریم را برای swapchain تعریف کنید
برای مقداردهی اولیه Android Frame Pacing برای یک دستگاه فیزیکی معین و swapchain، مراحل نشان داده شده در قطعه کد زیر را کامل کنید:
// 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);
این مدت زمان مبادله را بر حسب نانوثانیه تعیین می کند. ماکروهای کمکی در swappy_common.h
برای مدت زمان متداول مبادله تعریف شده اند (به عنوان مثال SWAPPY_SWAP_60FPS
).
در مرحله بعد، باید مدت زمان مبادله را بر حسب نانوثانیه تهیه کنید.
// 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
Swappy برای انجام عملیات خاص ANativeWindow
، مانند فراخوانی ANativeWindow_setFrameRate()
به دسته ANativeWindow
نیاز دارد. زمانی که سطح صفحه نمایش اندروید شما تغییر کرد و یک دسته ANativeWindow
جدید دارید SwappyVk_setWindow()
را فراخوانی کنید ( نمونه Cube را برای مثال ببینید).
حالت های خودکار
Android Frame Pacing مدت زمان تعویض و حالت خط لوله را بر اساس میانگین مدت فریم های قبلی تنظیم می کند. شما می توانید این رفتار را با توابع زیر کنترل کنید:
-
void SwappyVk_setAutoSwapInterval(bool enabled);
-
void SwappyVk_setMaxAutoSwapIntervalNS(uint64_t max_swap_ns);
-
void SwappyVk_setAutoPipelineMode(bool enabled);
یک قاب ارائه دهید
برای ارائه فریمی از بازی خود به Android Frame Pacing، با SwappyVk_queuePresent()
تماس بگیرید. این تابع vkQueuePresentKHR()
را از طرف بازی شما فراخوانی می کند.
swapchain را نابود کنید
برای از بین بردن داده های SwappyVk
مرتبط با یک swapchain معین، مراحل نشان داده شده در قطعه کد زیر را کامل کنید:
// Reusing local variables from previous snippets: // VkDevice device; // VkSwapchainKHR swapchain; // const VkAllocationCallbacks allocator; SwappyVk_destroySwapchain(device, swapchain); vkDestroySwapchainKHR(device, swapchain, &allocator);