Для простой сцены на 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