استخدِم الدوال التالية لاستخدام Android Frame Pacing مع محرّك عرض يعتمد على واجهة برمجة التطبيقات Vulkan.
تحديد الإضافات المطلوبة لإنشاء
لجمع مجموعة الإضافات اللازمة لإنشاء مثيل من 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);
يمكنك بعد ذلك بدء استخدام Android Frame Pacing من خلال استدعاء vkCreateDevice()
. يجب أن يحتوي الوسيط الثاني، وهو بنية من النوع 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);
تحديد معدّل عرض اللقطات في الثانية لسلسلة التبديل
لتهيئة Android Frame Pacing لجهاز فعلي وسلسلة تبديل معيّنين، أكمل الخطوات الموضّحة في مقتطف الرمز التالي:
// 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
، مثل استدعاء ANativeWindow_setFrameRate()
.
استدعاء
SwappyVk_setWindow()
عندما يتغير سطح العرض على Android ويكون لديك مقبض ANativeWindow
جديد (راجِع مثال 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()
نيابةً عن لعبتك.
تدمير سلسلة التبديل
لتدمير بيانات SwappyVk
المرتبطة بسلسلة تبديل معيّنة، عليك إكمال الخطوات الموضّحة في مقتطف الرمز التالي:
// Reusing local variables from previous snippets: // VkDevice device; // VkSwapchainKHR swapchain; // const VkAllocationCallbacks allocator; SwappyVk_destroySwapchain(device, swapchain); vkDestroySwapchainKHR(device, swapchain, &allocator);