OpenGL中即时模式的性能问题
Performance issue with immediate mode in OpenGL
如何将这段即时代码转换为vbo ?
我有性能问题与我的代码,我需要帮助,使其更快,通过使用VBO而不是直接模式。有人能告诉我如何将其转换为VBO以提高性能吗?
此代码在代码的主循环while(true)
中执行,以绘制一系列正方形,这些正方形可以改变其颜色以表示称为cmp
的矩阵。这个cmp
矩阵代表一个来自蛇游戏的领域,可能有NADA(Nothing), snake, Apple或MURO(Wall),并且根据矩阵的值,它会在开关上改变颜色。
我是GLFW和Opengl的新手,所以我不知道如何使用vbo和高级图形技术。
完整的注释代码可以在这里找到。
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();
}
}
您应该更好地学习这方面的教程。无论如何,你用VBOs实现的是一次上传所有的几何图形,只使用一个opengl调用,而不是调用大量的glVertex
。
如果你的几何图形是不断变化的,选项是在每一帧上更新GPU的所有几何图形,这肯定会比在每一帧上进行所有这些调用快。
相关文章:
- 在类中使用随机生成器时出现性能问题
- Qt OpenGL 渲染到纹理性能问题
- 剪辑性能问题
- OpenCV - 基本操作 - 性能问题 [模式:发布]
- 使用 #define 进行跟踪日志记录以避免性能问题
- 在 Qt C++ 中在自定义项委托上绘制文本时的性能问题
- std::函数有性能问题,如何避免?
- 使用 const double* const 作为模板参数 - 代码性能问题
- 在C 中读取大型CSV文件性能问题
- MPI 二进制文件 I/O 基本功能和性能问题
- 使用STD :: MAP在数据及其性能问题中查找重复项.我可以预先分配吗?
- C 功能性能问题
- 在C 性能问题中使用Getter返回地图
- 初始化每个班级成员时的性能问题
- 事件(开始,结束),1天的最大事件.C++ 中的性能问题
- 在X64模式下从C /CLI调用MASM PROC会产生意外的性能问题
- OpenGL:MESA3D屏幕上的软件渲染性能问题
- 是包含容器性能问题的STL关联容器
- 任何性能问题都在qt框架中使用了stackedwidget的最大页面数
- SHGetFileInfo性能问题