gpt4 book ai didi

c++ - 哪个是编写此 gl 代码的正确方法

转载 作者:行者123 更新时间:2023-11-28 00:20:05 26 4
gpt4 key购买 nike

我一直在用 opengl 和处理纹理做一些实验。在我的实验中,我有一个随机生成的 (int) 二维数组

 int mapskeleton[300][300];

然后我有了自己的 obj 文件加载器,用于加载带有纹理的 obj

m2d wall,floor;//i initialize and load those files at start

用于记录我使用的渲染时间统计

bool Once = 1; 
int secs = 0;

现在到这里的渲染代码,我做了我的实验

    //  Code A: Benchmarked on radeon 8670D   
// Takes 232(average) millisecs for drawing 300*300 tiles

if(Once)
secs = glutGet(GLUT_ELAPSED_TIME);

for(int i=0;i<mapHeight;i++){
for(int j=0;j<mapWidth;j++){
if(mapskeleton[j][i] == skel_Wall){
glBindTexture(GL_TEXTURE_2D,wall.texture);
glPushMatrix();
glTranslatef(j*10,i*10,0);
wall.Draw();//Draws 10 textured triangles
glPopMatrix();
}
if(mapskeleton[j][i] == skel_floor){
glBindTexture(GL_TEXTURE_2D,floor.texture);
glPushMatrix();
glTranslatef(j*10,i*10,0);
floor.Draw();//Draws 2 textured triangles
glPopMatrix();
}

}
}
if(Once){
secs = glutGet(GLUT_ELAPSED_TIME)-secs;
printf("time taken for rendering %i msecs",secs)
Once = 0;
}

其他代码是

    //  Code B:    Benchmarked on radeon 8670D   
// Takes 206(average) millisecs for drawing 300*300 tiles


if(Once)
secs = glutGet(GLUT_ELAPSED_TIME);

glBindTexture(GL_TEXTURE_2D,floor.texture);

for(int i=0;i<mapHeight;i++){
for(int j=0;j<mapWidth;j++){
if(mapskeleton[j][i] == skel_floor){
glPushMatrix();
glTranslatef(j*10,i*10,0);
floor.Draw();
glPopMatrix();
}
}
}
glBindTexture(GL_TEXTURE_2D,wall.texture);

for(int i=0;i<mapHeight;i++){
for(int j=0;j<mapWidth;j++){
if(mapskeleton[j][i] == skel_Wall){
glPushMatrix();
glTranslatef(j*10,i*10,0);
wall.Draw();
glPopMatrix();
}
}
}
if(Once){
secs = glutGet(GLUT_ELAPSED_TIME)-secs;
printf("time taken for rendering %i msecs",secs)
Once = 0;
}

对于我来说,代码 A 看起来不错,一个人(初学者)查看代码。但基准说不同。我的 gpu 似乎喜欢代码 B。我不明白为什么代码 B 的渲染时间更短?

最佳答案

OpenGL 状态的更改通常代价高昂 - 驱动程序和/或 GPU 的数据结构和缓存可能会失效。在您的情况下,所讨论的变化是绑定(bind)不同的纹理。在代码 B 中,您执行了两次。在代码 A 中,您可以轻松地执行数千次。

编写 OpenGL 渲染程序时,您通常需要为设置 A 设置管道,渲染需要设置 A 的所有内容,为设置 B 重新设置管道,渲染需要设置 B 的所有内容,等等。

关于c++ - 哪个是编写此 gl 代码的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27942045/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com