c++ - OpenGL 中即时模式的性能问题

标签 c++ performance opengl graphics glfw

如何将这段立即代码转换为 VBO?

我的代码存在性能问题,我需要帮助通过使用 VBO 而不是立即模式来加快速度。有人可以告诉我如何将其转换为 VBO 以提高性能吗?

此代码在代码的主循环while(true) 中执行,以绘制一系列可能会改变其颜色的正方形,以表示一个名为cmp 的矩阵。 此 cmp 矩阵表示贪吃蛇游戏中可能有 NADA(Nothing)、Snake、Apple 或 MURO(Wall) 的字段,并且根据矩阵的值,它会在开关上改变颜色。

我是 GLFW 和 Opengl 的新手,所以我不知道如何使用 VBO 和高级图形技术。

完整注释代码可见here如果你愿意的话。

for(it a=0;a<(camp.Getlar())/2;a++)//line of quadrant -+
{
    for(int b=0;b<(camp.Getalt())/2;b++)//column
    {
        glBegin(GL_POLYGON);

        switch (cmp[a][b])
        {
        case camp.NADA:
            glColor3f(0,0,0);
            break;
        case camp.SNAKE:
            glColor3f(0,0.85f,0.20f);
            break;
        case camp.APPLE:
            glColor3f(1.0f,0,0.1f);
            break;
        case camp.MURO:
            glColor3f(0.3f,0.3f,0.3f);
            break;
        }

        glVertex2f(-1.0f+a/(camp.Getlar()/2.0f),        1.0f-b/(camp.Getalt()/2.0f) );
        glVertex2f(-1.0f+a/(camp.Getlar()/2.0f),        1.0f-(1+b)/(camp.Getalt()/2.0f) );
        glVertex2f(-1.0f+((1+a)/(camp.Getlar()/2.0f)),  1.0f-(1+b)/(camp.Getalt()/2.0f));
        glVertex2f(-1.0f+((1+a)/(camp.Getlar()/2.0f)),  1.0f-b/(camp.Getalt()/2.0f ));

        glEnd();
    }
}



for(int a=0;a<(camp.Getlar())/2;a++)//line of quadrant ++
{
    for(int b=0;b<(camp.Getalt())/2;b++)//column
    {
        glBegin(GL_POLYGON);

        switch (cmp[a+camp.Getlar()/2][b])
        {
        case camp.NADA:
            glColor3f(0,0,0);
            break;
        case camp.SNAKE:
            glColor3f(0,0.85f,0.20f);
            break;
        case camp.APPLE:
            glColor3f(1.0f,0,0.1f);
            break;
        case camp.MURO:
            glColor3f(0.3f,0.3f,0.3f);
            break;
        }

        glVertex2f(a/(camp.Getlar()/2.0f),        1.0f-b/(camp.Getalt()/2.0f) );
        glVertex2f(a/(camp.Getlar()/2.0f),        1.0f-(1+b)/(camp.Getalt()/2.0f) );
        glVertex2f(((1+a)/(camp.Getlar()/2.0f)),  1.0f-(1+b)/(camp.Getalt()/2.0f));
        glVertex2f(((1+a)/(camp.Getlar()/2.0f)),  1.0f-b/(camp.Getalt()/2.0f) );

        glEnd();
    }
}

for(int a=0;a<(camp.Getlar())/2;a++)//line of quadrant +-
{
    for(int b=0;b<(camp.Getalt())/2;b++)//column
    { 
        glBegin(GL_POLYGON);

        switch (cmp[a+camp.Getlar()/2][b+camp.Getlar()/2])
        {
        case camp.NADA:
            glColor3f(0,0,0);
            break;
        case camp.SNAKE:
            glColor3f(0,0.85f,0.20f);
            break;
        case camp.APPLE:
            glColor3f(1.0f,0,0.1f);
            break;
        case camp.MURO:
            glColor3f(0.3f,0.3f,0.3f);
            break;
        }

        glVertex2f(a/(camp.Getlar()/2.0f),        -b/(camp.Getalt()/2.0f) );
        glVertex2f(a/(camp.Getlar()/2.0f),        -(1+b)/(camp.Getalt()/2.0f) );
        glVertex2f(((1+a)/(camp.Getlar()/2.0f)),  -(1+b)/(camp.Getalt()/2.0f));
        glVertex2f(((1+a)/(camp.Getlar()/2.0f)),  -b/(camp.Getalt()/2.0f ));

        glEnd();
    }
}

for(int a=0;a<(camp.Getlar())/2;a++)//line of quadrant --
{
    for(int b=0;b<(camp.Getalt())/2;b++)//column
    {    
        glBegin(GL_POLYGON);

        switch (cmp[a][b+camp.Getlar()/2])
        {
        case camp.NADA:
            glColor3f(0,0,0);
            break;
        case camp.SNAKE:
            glColor3f(0,0.85f,0.20f);
            break;
        case camp.APPLE:
            glColor3f(1.0f,0,0.1f);
            break;
        case camp.MURO:
            glColor3f(0.3f,0.3f,0.3f);
            break;
        }

        glVertex2f(-1.0f+a/(camp.Getlar()/2.0f),        -b/(camp.Getalt()/2.0f) );
        glVertex2f(-1.0f+a/(camp.Getlar()/2.0f),        -(1+b)/(camp.Getalt()/2.0f) );
        glVertex2f(-1.0f+((1+a)/(camp.Getlar()/2.0f)),  -(1+b)/(camp.Getalt()/2.0f));
        glVertex2f(-1.0f+((1+a)/(camp.Getlar()/2.0f)),  -b/(camp.Getalt()/2.0f ));

        glEnd();
    }
}

最佳答案

你应该拿a tutorial在这个更好。无论如何,您使用 VBO 实现的是一次上传所有几何体,仅使用一个 opengl 调用而不是调用大量 glVertex

如果您的几何图形不断变化,一个选项是在每一帧上更新 GPU 中的所有几何图形,这肯定比在每一帧上进行所有这些调用更快。

关于c++ - OpenGL 中即时模式的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32552753/

相关文章:

sql - 将两部分 SQL 查询组合成一个查询

c++ - #error gl.h 包含在 glew.h 之前

c++ - 使用逆变换的 OpenGL 光线追踪

opengl - 镜面光出现在物体的面向眼睛和背面

performance - JavaFX:List 与 ObservableList 性能/内存使用情况

c++ - 一维不变一维可变的容器

c++ - Zmq 用于随机接收和回复

c++ - 等效于使用 lambda 的 python 映射函数

c++ - Boost::Python- 可以从 dict 自动转换 --> std::map?

mysql - 即使对于解释计划,也要努力应对长时间运行的查询,这也花费了很多时间