Kare hızı işlevleri ekleyin

Android Frame Pacing'i Vulkan API'ye dayalı bir oluşturma motoruyla kullanmak için aşağıdaki işlevleri kullanın.

Oluşturma için gerekli uzantıları tanımlama

Vulkan'ı kullanırken Android Frame Pacing örneği oluşturmak için gereken uzantı grubunu toplamak üzere aşağıdaki kod snippet'inde gösterilen adımları tamamlayın:

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);

Ardından, vkCreateDevice() yöntemini çağırarak Android Frame Pacing'i başlatabilirsiniz. VkDeviceCreateInfo* türündeki 2. bağımsız değişkenin enabledExtensionCount üyesi, gerekli uzantıların sayısına ayarlanmış olmalıdır.

Sıra ailesini tanımlayın

Doğru görüntüleme sırasını sunmak için Android Frame Pacing'in Vulkan'ın hangi sıra ailesini kullandığını bilmesi gerekir. Doğru aileyi belirlemek için şu kod snippet'inde gösterilen adımları tamamlayın:

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

Takas zinciri için kare hızını tanımlayın

Belirli bir fiziksel cihaz ve takas zinciri için Android Frame Pacing'i başlatmak için aşağıdaki kod snippet'inde gösterilen adımları tamamlayın:

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

Bu değer, değiştirme süresini nanosaniye cinsinden belirler. Ortak değiştirme süreleri için swappy_common.h içinde tanımlanan yardımcı makrolar vardır (örneğin, SWAPPY_SWAP_60FPS).

Ardından, değiştirme süresini nanosaniye cinsinden sağlamanız gerekir.

// 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'u ayarlama

Swappy, ANativeWindow_setFrameRate() gibi ANativeWindow'ye özgü bir işlem gerçekleştirebilmek için ANativeWindow işleyicisine ihtiyaç duyar. Android ekran yüzeyiniz değiştiğinde ve yeni ANativeWindow herkese açık kullanıcı adınız olduğunda SwappyVk_setWindow() numarasını arayın (örnek için Küp örneğine bakın).

Otomatik Modlar

Android Frame Pacing değiştirme süresini ve ardışık düzen modunu, önceki karelerin ortalama süresine göre ayarlar. Bu davranışı aşağıdaki işlevleri kullanarak kontrol edebilirsiniz:

Çerçeve göster

Oyununuzun bir karesini Android Frame Pacing'e sunmak için SwappyVk_queuePresent() numaralı telefonu arayın. Bu işlev, oyununuz adına vkQueuePresentKHR() işlevini çağırır.

Takas zincirini yok edin

Belirli bir takas zinciri ile ilişkili SwappyVk verilerini kaldırmak için aşağıdaki kod snippet'inde gösterilen adımları tamamlayın:

// Reusing local variables from previous snippets:
// VkDevice device;
// VkSwapchainKHR swapchain;
// const VkAllocationCallbacks allocator;

SwappyVk_destroySwapchain(device, swapchain);
vkDestroySwapchainKHR(device, swapchain, &allocator);