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

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

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

لجمع مجموعة الإضافات اللازمة لإنشاء مثيل من إطار Android مع الحفاظ على السرعة عند استخدام Vulkan، أكمِل الخطوات الموضّحة في الرمز البرمجي التالي. 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);

ويمكنك بعد ذلك بدء تسجيل الدخول إلى إطار إطار 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 لجهاز فعلي معيّن وسلسلة تبديل أكمل الخطوات الموضحة في مقتطف الرمز التالي:

// 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

يحتاج تطبيق Suppy إلى الاسم المعرِّف ANativeWindow لتنفيذ الإجراء. العملية الخاصة بـ "ANativeWindow"، مثل الاتصال ANativeWindow_setFrameRate() اتصل SwappyVk_setWindow() عندما تغيّرت مساحة عرض شاشة Android ولديك ANativeWindow جديد الاسم المعرِّف (راجِع نموذج Cube للحصول على مثال).

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

وتضبط ميزة "تخطيط إطار 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);