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

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

Sıra ailesini tanımlama

Android Frame Pacing'in doğru görüntüleme sırasını sunmak için Vulkan'ın hangi sıra ailesini kullandığını bilmesi gerekir. Doğru aileyi belirlemek için aşağıdaki 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);

Değişim 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ğ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 bulunmaktadır (ör. SWAPPY_SWAP_60FPS).

Ardından, değişim 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

Değişim işlemi, ANativeWindow_setFrameRate() gibi ANativeWindow ile ilgili bir işlem gerçekleştirebilmek için ANativeWindow işleyicisine ihtiyaç duyar. Android ekran yüzeyiniz değiştiğinde ve yeni bir ANativeWindow herkese açık kullanıcı adınız olduğunda SwappyVk_setWindow() numarasını çağırı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şlevlerle 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 zinciriyle 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);