【问题标题】:Opengl Triangles BenchmarkOpengl 三角形基准测试
【发布时间】:2018-07-16 10:48:42
【问题描述】:

我正在尝试测试如何在笔记本电脑上绘制三角形,因此我在系统上执行以下操作:

操作系统:Windows 10 CPU:英特尔酷睿 i5 5200U GPU:英伟达 Geforce 820M

代码:

glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

// Open a window and create its OpenGL context

window = glfwCreateWindow( 1024, 768, "Tutorial 02 - Red triangle", NULL, NULL);
if( window == NULL ){
    fprintf( stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n" );
    getchar();
    glfwTerminate();
    return -1;
}
glfwMakeContextCurrent(window);

// Initialize GLEW
glewExperimental = true; // Needed for core profile
if (glewInit() != GLEW_OK) {
    fprintf(stderr, "Failed to initialize GLEW\n");
    getchar();
    glfwTerminate();
    return -1;
}

// Ensure we can capture the escape key being pressed below
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);

// Dark blue background
glClearColor(0.0f, 0.0f, 0.4f, 0.0f);

GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

// Create and compile our GLSL program from the shaders
GLuint programID = LoadShaders( "SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader" );


// Number of triangles
const int v = 200;
static  GLfloat g_vertex_buffer_data[v*9] = { 
    -1.0f, -1.0f, 1.0f,
     0.8f, 0.f, 0.0f,
     0.5f,  1.0f, 0.0f,
};

// fill buffer of triangles
for (int i = 9; i < v * 9; i += 9)
{
    g_vertex_buffer_data[i] = g_vertex_buffer_data[0];
    g_vertex_buffer_data[i+1] = g_vertex_buffer_data[1];
    g_vertex_buffer_data[i+2] = g_vertex_buffer_data[2];

    g_vertex_buffer_data[i+3] = g_vertex_buffer_data[3];
    g_vertex_buffer_data[i+4] = g_vertex_buffer_data[4];
    g_vertex_buffer_data[i+5] = g_vertex_buffer_data[5];

    g_vertex_buffer_data[i+6] = g_vertex_buffer_data[6];
    g_vertex_buffer_data[i+7] = g_vertex_buffer_data[7];
    g_vertex_buffer_data[i+8] = g_vertex_buffer_data[8];
}

GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

int frameNr = 0;
char text[100];
do{

    // Clear the screen
    glClear( GL_COLOR_BUFFER_BIT );

    // Use our shader
    glUseProgram(programID);

    // 1rst attribute buffer : vertices
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(
        0,                  // attribute 0. No particular reason for 0, but must match the layout in the shader.
        3,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
    );

    // Draw the triangle !
    glDrawArrays(GL_TRIANGLES, 0, v*3); // 3 indices starting at 0 -> 1 triangle

    glDisableVertexAttribArray(0);

    // Swap buffers
    glfwSwapBuffers(window);
    glfwPollEvents();
    //glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

    frameNr++;
    sprintf_s(text, "%d %d %d", frameNr, clock() / 1000, (frameNr * 1000) / (clock() + 1));
    glfwSetWindowTitle(window, text);

} // Check if the ESC key was pressed or the window was closed
while( glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS &&
       glfwWindowShouldClose(window) == 0 );

// Cleanup VBO
glDeleteBuffers(1, &vertexbuffer);
glDeleteVertexArrays(1, &VertexArrayID);
glDeleteProgram(programID);

// Close OpenGL window and terminate GLFW
glfwTerminate();

return 0;

让我感到奇怪的是,在 v = 200 个三角形的情况下,我只能获得大约 80 fps。 这将是每秒大约 16000 个三角形,这很糟糕不是吗?

我在代码中做错了什么,或者我的显卡真的只能处理这么少的三角形吗?

像 1080ti 这样的现代 gpu 可以处理多少个三角形(我听说理论上 110 亿个 - 虽然我知道实际上要低得多)。

【问题讨论】:

  • 每帧不做字符串操作和窗口标题设置能快多少?
  • 好吧,我使用 windows 标题的设置来查看我得到的 fps。但我怀疑这就是原因,因为如果我删除三角形的计算(所有函数在开始时使用 gl 但不是 glfw)我会得到大约 400fps。
  • 那就用别的吧。例如,Fraps,或者每秒只更新一次标题。设置窗口标题不是免费的,所以你会搞砸你的测量结果。
  • 您是否受到垂直同步速率的限制?可能值得尝试 glfwSwapInterval(0) 禁用同步(尽管 80Hz 是一个相当奇怪的垂直同步速率)。
  • 您是否确定使用的是 NVIDIA GPU 而不是您的 Intel GPU?

标签: c++ opengl


【解决方案1】:

由于我还没有足够的声誉来发表评论,所以让我在这里问一下:你的三角形有多大?如果没有看到顶点着色器就很难判断,但假设代码中的这些坐标直接映射到规范化的设备坐标,你的三角形覆盖了屏幕的很大一部分。如果我没记错的话,您基本上会在其自身之上一遍又一遍地绘制相同的三角形。因此,您很可能会受到填充率限制。为了获得更有意义的结果,您可能宁愿只绘制一个不重叠的三角形网格,或者至少画一个随机的三角形汤。为了进一步降低填充率和帧缓冲带宽要求,您可能需要确保关闭深度缓冲和混合。

如果您对每秒的原始三角形感兴趣,为什么要启用 MSAA?这样做只是人为地放大了光栅化负载。正如其他人也注意到的那样,V-Sync 可能会关闭,因为 80 Hz 的刷新率会相当奇怪,但最好确保并通过 glfwSwapInterval(0) 明确关闭它。您可能需要考虑使用GL_TIME_ELAPSED query 测量 GPU 上的实际绘制时间,而不是像您那样估计总帧时间。

【讨论】:

  • 是的,这似乎是原因,着色器只是将它们写在它们的原始坐标上,所以填充率似乎是限制因素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 2021-10-11
相关资源
最近更新 更多