إضافة دوال وتيرة الإطار

استخدِم الوظائف التالية لاستخدام ميزة "معدل سرعة الإطارات" في Android مع محرك عرض مستند إلى Vulkan API.

تحديد الإضافات المطلوبة لإنشاء المحتوى

لجمع مجموعة الإضافات اللازمة لإنشاء مثيل لنظام التشغيل Android Frame عند استخدام 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 عن طريق الاتصال بـ 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 (اطّلِع على مثال على نموذج المكعب).

الأوضاع التلقائية

تضبط ميزة "تسريع الإطارات" في نظام التشغيل Android مدة التبديل ووضع مسار الإحالة الناجحة استنادًا إلى متوسط مدة الإطارات السابقة. يمكنك التحكم في هذا السلوك باستخدام الدوال التالية:

مشاركة عرض إطار

لتقديم إطار من لعبتك إلى 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);