为什么OpenGL简单循环比Vulkan循环更快?

时间:2020-10-04 13:41:15

标签: opengl vulkan

我有2个用于OpenGL和Vulkan的图形应用程序。

OpenGL循环如下所示:

glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

static int test = 0;

// "if" statement here is to ensure that there is no any caching or optimizations
// made by OpenGL driver (if such things exist),
// and commands are re-recorded to the buffer every frame

if ((test = 1 - test) == 0) {

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer1);
    glUseProgram(program1);
    glDrawArrays(GL_TRIANGLES, 0, vertices_size);
    glUseProgram(0);
}
else {

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer2);
    glUseProgram(program2);
    glDrawArrays(GL_LINES, 0, vertices_size);
    glUseProgram(0);
}

glfwSwapBuffers(window);

还有Vulkan:

static uint32_t image_index = 0;

vkAcquireNextImageKHR(device, swapchain, 0xFFFFFFFF, image_available_semaphores[image_index], VK_NULL_HANDLE, &image_indices[image_index]);

vkWaitForFences(device, 1, &submission_completed_fences[image_index], VK_TRUE, 0xFFFFFFFF);

// VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
vkBeginCommandBuffer(cmd_buffers[image_index], &command_buffer_bi);
vkCmdBeginRenderPass(cmd_buffers[image_index], &render_pass_bi[image_index], VK_SUBPASS_CONTENTS_INLINE);
vkCmdEndRenderPass(cmd_buffers[image_index]);
vkEndCommandBuffer(cmd_buffers[image_index]);

vkResetFences(device, 1, &submission_completed_fences[image_index]);

vkQueueSubmit(graphics_queue, 1, &submit_info[image_index], submission_completed_fences[image_index]);

present_info[image_index].pImageIndices = &image_indices[image_index];

vkQueuePresentKHR(present_queue, &present_info[image_index]);

const static int max_swapchain_image_index = swapchain_image_count - 1;

if (++image_index > max_swapchain_image_index) {

  image_index = 0;
}

在Vulkan循环中,甚至没有渲染命令,只是空的渲染通道。验证层已禁用。

OpenGL FPS大约为10500,Vulkan FPS大约为7500(VK_PRESENT_MODE_IMMEDIATE_KHR使用8个交换链图像,较少的图像会使FPS降低)。

代码在具有Ubuntu 18.04,离散GPU Nvidia RTX 2060,Nvidia驱动程序450.66,Vulkan API版本1.2.133的笔记本电脑上运行。

我知道OpenGL驱动程序已经过高度优化,但是我无法想象Vulkan循环中还有哪些要优化的事情才能使其更快。

是否存在一些底层Linux驱动程序问题?也许Vulkan的性能提升只能在复杂得多的应用程序中实现(例如使用多线程)?

0 个答案:

没有答案