Как контролировать количество кадров в секунду, отображаемых драйвером OpenGL? - PullRequest
1 голос
/ 20 июня 2020

Для простой сцены на windows с графикой Intel мы показываем 500 кадров в секунду. Конечно, это не означает, что мы действительно можем показать это многим при нормальной частоте обновления экрана sh от 60 до 130, но явно есть запас. На моем ноутбуке под управлением Ubuntu с приличной картой NVIDIA тот же код показывает около 2100 кадров в секунду, а анимация безумно быстрая. Но на рабочем столе Ubuntu с картой RTX2080 он работает чуть менее 30 кадров в секунду. Мы почти уверены, что код не так долго хранится на карте, драйвер как-то тормозит. Что-то подобное существует? Я ожидал, что настольный компьютер получит от 3 до 5 раз большую производительность, чем мой ноутбук.

В рассматриваемом тесте была загружена модель лягушки в формате .3ds и пара текстурированных кубиков, которые преобразуются и

Я прикрепляю информацию о драйвере устройства и напишу код, используемый с glfw в основном рендере l oop, но новую ключевую информацию: даже если я закомментирую весь рендеринг, скорость составляет 30 кадров в секунду, поэтому @Botje, возможно, вы правы, но я ничего не запрашиваю, будут ли разные значения по умолчанию на разных машинах?

sudo lhw -c video
*-display                        description: VGA compatible controller
       product: TU104 [GeForce RTX 2080 Rev. A]
       vendor: NVIDIA Corporation
       physical id: 0
       bus info: pci@0000:01:00.0
       version: a1
       width: 64 bits
       clock: 33MHz
       capabilities: pm msi pciexpress vga_controller bus_master cap_list rom
       configuration: driver=nvidia latency=0
       resources: irq:130 memory:a3000000-a3ffffff memory:90000000-9fffffff memory:a0000000-a1ffffff ioport:3000(size=128) memory:c0000-dffff

ok, it is using NVIDIA, but is the bus transfer really only 33 Mhz? That seems incredibly slow.
 dmesg | grep nvidia
[    5.713378] nvidia: loading out-of-tree module taints kernel.
[    5.713382] nvidia: module license 'NVIDIA' taints kernel.
[    5.717639] nvidia: module verification failed: signature and/or required key missing - tainting kernel
[    5.722567] nvidia-nvlink: Nvlink Core is being initialized, major device number 237
[    5.724195] nvidia 0000:01:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=none:owns=io+mem
[    5.859187] nvidia-modeset: Loading NVIDIA Kernel Mode Setting Driver for UNIX platforms  440.59  Thu Jan 30 00:59:18 UTC 2020
[    5.861979] [drm] [nvidia-drm] [GPU ID 0x00000100] Loading driver
[    5.861980] [drm] Initialized nvidia-drm 0.0.0 20160202 for 0000:01:00.0 on minor 0
[    5.881141] nvidia-uvm: Loaded the UVM driver, major device number 235.

Следующий минимальный рабочий пример не отображает что угодно и ВСЕ ЕЩЕ dr aws со скоростью всего 30 кадров в секунду, но он дает сбой при первом вызове openGL. Я не вижу, что я делаю по-другому, но я вырезал много кода и, несомненно, что-то было важным.

#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
using namespace std;

constexpr int width = 1024, height = 1024;
int main() {
  glfwInit();
  glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
  glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  GLFWwindow* win = glfwCreateWindow(width, height, "test", nullptr, nullptr);
  if (win == nullptr) {
    glfwTerminate();
    throw "Failed to open GLFW window";
  }
  glfwMakeContextCurrent(win);
  if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    throw "Failed to initialize GLAD";
  glEnable(GL_BLEND);
  glEnable(GL_LINE_SMOOTH);
  glEnable(GL_TEXTURE);
  glDepthFunc(GL_NEVER);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//  glw::mat4 projection = glm::ortho(0, width, height, 0);
  float startTime = glfwGetTime();
  float renderTime = 0;
  int frameCount = 0;
  while (!glfwWindowShouldClose(win)) {
    glfwPollEvents();  // Check and call events
    float startRender = glfwGetTime();
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);  // Clear the colorbuffer and depth
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //render(); literally draw nothing
    glfwSwapBuffers(win);  // Swap buffer so the scene shows on screen
    renderTime += glfwGetTime() - startRender;
    if (frameCount >= 150) {
      double endTime = glfwGetTime();
      double elapsed = endTime - startTime;
      cerr << "Elapsed=" << elapsed << " FPS= " << frameCount / elapsed
           << " render=" << renderTime << '\n';
      frameCount = 0;
      renderTime = 0;
      startTime = endTime;
    } else {
      frameCount++;
    }
  }
  glfwDestroyWindow(win);
  glfwTerminate();
}

скомпилировано с помощью:

g++ -g testwindow.cc glad.o -lglfw -lGL -ldl

glxinfo | Результаты рендеринга grep:

direct rendering: Yes
OpenGL renderer string: GeForce RTX 2080/PCIe/SSE2
    GL_ARB_conditional_render_inverted, GL_ARB_conservative_depth, 
    GL_NVX_conditional_render, GL_NVX_gpu_memory_info, GL_NVX_nvenc_interop, 
    GL_NV_compute_shader_derivatives, GL_NV_conditional_render, 
    GL_NV_path_rendering, GL_NV_path_rendering_shared_edge, 
    GL_NV_stereo_view_rendering, GL_NV_texgen_reflection, 
    GL_ARB_compute_variable_group_size, GL_ARB_conditional_render_inverted, 
    GL_NVX_conditional_render, GL_NVX_gpu_memory_info, GL_NVX_nvenc_interop, 
    GL_NV_compute_shader_derivatives, GL_NV_conditional_render, 
    GL_NV_path_rendering, GL_NV_path_rendering_shared_edge, 
    GL_NV_stereo_view_rendering, GL_NV_texgen_reflection, 
    GL_EXT_multisample_compatibility, GL_EXT_multisampled_render_to_texture, 
    GL_EXT_multisampled_render_to_texture2, 
    GL_EXT_raster_multisample, GL_EXT_render_snorm, GL_EXT_robustness, 
    GL_NV_conditional_render, GL_NV_conservative_raster, 
    GL_NV_packed_float_linear, GL_NV_path_rendering, 
    GL_NV_path_rendering_shared_edge, GL_NV_pixel_buffer_object, 
    GL_NV_shadow_samplers_cube, GL_NV_stereo_view_rendering, 
    GL_OES_element_index_uint, GL_OES_fbo_render_mipmap, 
    GL_OVR_multiview_multisampled_render_to_texture
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...