Kare hızı işlevleri ekleyin

Android Çerçeve İlerlemesi'ni bir oluşturma motoruyla kullanmak için aşağıdaki işlevleri kullanın yeni bir kod snippet'i oluşturabilirsiniz.

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

Android Frame'in örneğini oluşturmak için gereken uzantı grubunu toplamak Vulkan kullanırken hız, aşağıdaki kodda gösterilen adımları tamamlayın 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);

Ardından vkCreateDevice() numaralı telefonu arayarak Android Çerçeve İlerlemesi'ni başlatabilirsiniz. 2'si VkDeviceCreateInfo* türünde bir struct'ın kendi enabledExtensionCount üyesi, gerekli uzantı sayısına ayarlandı.

Sıra ailesini tanımlama

Doğru görüntüleme sırasını sunmak için Android Frame Pacing'in sıra ailesini ele alalım. Doğru aileyi belirlemek için adımları uygulayı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şme zinciri için kare hızını tanımlayın

Belirli bir fiziksel cihazda ve değişim zincirinde Android Çerçeve Hızı'nı 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şim süresini nanosaniye cinsinden belirler. Yardımcı makrolar var yaygın değiştirme süreleri için swappy_common.h içinde tanımlanır (örneğin, SWAPPY_SWAP_60FPS) tıklayın.

Daha sonra, 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

Swappy'nin performans göstermesi için ANativeWindow herkese açık kullanıcı adı gerekiyor ANativeWindow ürününe özgü bir işlem (ör. telefon etme) ANativeWindow_setFrameRate() Telefonla arama SwappyVk_setWindow() Android ekran yüzeyiniz değiştiğinde ve yeni bir ANativeWindow cihazınız olduğunda herkese açık kullanıcı adı (örnek için Küp örneğine bakın).

Otomatik Modlar

Android Çerçeve İlerlemesi, değişim süresini ve ardışık düzen modunu aşağıdakilere göre ayarlar: önceki karelerin ortalama süresi. Bu davranışı şu işlevler:

Kare göster

Oyununuzun bir karesini Android Frame Pacing'e göstermek için şu numarayı arayın: SwappyVk_queuePresent(). Bu işlev, oyununuz adına vkQueuePresentKHR() öğesini çağırır.

Takas zincirini yok edin

Belirli bir takas zinciriyle ilişkili SwappyVk verilerini kaldırmak için adımları uygulayın:

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

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