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

استخدِم الدوال التالية لاستخدام Android Frame Pacing مع محرّك عرض يستند إلى واجهة برمجة تطبيقات Vulkan.

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

لجمع مجموعة الإضافات اللازمة لإنشاء مثيل لنظام 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 (يمكنك الاطّلاع على نموذج Cube مثلاً).

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

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

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

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