gpt4 book ai didi

opengl - 结构数组或数组结构性能

转载 作者:行者123 更新时间:2023-12-02 06:10:29 25 4
gpt4 key购买 nike

我使用的是配备 AMD Radeon HD 6630M 的 MacMini '11。我正在使用数组结构绘制网格,一切都很好:60 fps(使用 CVDisplayLink)。我使用具有内置属性的着色器。生活很好。我转而使用结构数组(交错),因为我知道这是“现代”GPU 的首选。属性在着色器中定义。网格画得很漂亮。但当我这样做时,帧速率下降了约 33%(至 40 fps)。这些电话有多个副本。使用 Instruments:Time Profiler,我得到以下比较:

Using structure of arrays (60 fps)
Running Time Self Symbol Name
3.0ms 0.0% 3.0 0x21b76c4 ATIRadeonX3000GLDriver
2.0ms 0.0% 0.0 gldUpdateDispatch ATIRadeonX3000GLDriver
2.0ms 0.0% 0.0 gleDoDrawDispatchCore GLEngine
2.0ms 0.0% 0.0 glDrawElements_ACC_Exec GLEngine
2.0ms 0.0% 0.0 glDrawElements libGL.dylib
2.0ms 0.0% 0.0 -[Mesh draw] me

Using array of structures (40 fps)
Running Time Self Symbol Name
393.0ms 7.4% 393.0 0x86f6695 ?
393.0ms 7.4% 0.0 gleDrawArraysOrElements_ExecCore GLEngine
393.0ms 7.4% 0.0 glDrawElements_IMM_Exec GLEngine
393.0ms 7.4% 0.0 glDrawElements libGL.dylib
393.0ms 7.4% 0.0 -[Mesh draw] me

看起来 libGL 正在决定走向不同的方向,并且结构数组看起来好像没有调用 X3000 驱动程序。它是在Apple 软件模拟器中执行的吗?我应该只保留数组结构吗?有人见过这样的事情吗?

<小时/>

属性代码来自 Apple 示例,在我的应用程序(至少 10 个其他区域)中使用,在这些区域中没有性能影响。这是来自慢速版本。正如我所提到的,我在快速版本中使用内置属性,因为数据不是交错的。渲染很到位,只是速度很慢。

我希望这就是您正在寻找的:

//  Step 5 - Bind each of the vertex shader's attributes to the programs
[self.meshShader addAttribute:@"inPosition"];
[self.meshShader addAttribute:@"inNormal"];
[self.meshShader addAttribute:@"inTexCoord"];

// Step 6 - Link the program
if([[self meshShader] linkShader] == 0){
self.posAttribute = [meshShader attributeIndex:@"inPosition"];
self.normAttribute = [meshShader attributeIndex:@"inNormal"];
self.texCoordAttribute = [meshShader attributeIndex:@"inTexCoord"];

...


- (void) addAttribute:(NSString *)attributeName
{
if ([attributes containsObject:attributeName] == NO){
[attributes addObject:attributeName];
glBindAttribLocation(program, [attributes indexOfObject:attributeName],
[attributeName UTF8String]);
}
}

更新:经过进一步调查:1)我正在使用 dhpoWare 的 modelObj 加载器(已修改),并且由于它使用交错的结构数组,因此它在性能方面也类似于我的结构数组 - 只是不那么受欢迎。我可能错误地解释了仪器。 modelObj代码确实调用了glDrawElements_IMM_Exec,它也以迂回的方式调用了gleDoDrawDispatchCore。我不确定它是否只是在 glDrawElements_IMM_Exec 处积累了一堆调用,然后通过 gleDoDrawDispatchCore 将它们抛出。不知道。2) 我认为 Instruments 有问题,因为它显示 GLEngine 调用我未使用的内部 3ds 对象方法之一,该方法没有外部钩子(Hook)。我通过在那里设置 Xcode 断点进行了双重检查,它从未跳闸。我不再玩 3DS。

我想我会继续环顾四周,也许会偶然发现答案。如果有人能给我关于结构数组是否可行的意见,我将不胜感激。

解决方案:我在前端添加了一个 VBO,一切都很好。原始代码来自 OpenGL ES 2.0 指南,添加 VBO 解决了我的问题。帧速率为 60,驱动程序调用为 1 毫秒。这是代码:

glGenVertexArrays(1, &vaoName);
glBindVertexArray(vaoName);

// new - create VBO
glGenBuffers(1, &vboName);
glBindBuffer(GL_ARRAY_BUFFER, vboName);

// Allocate and load position data into the VBO
glBufferData(GL_ARRAY_BUFFER, sizeof(struct vertexAttribs) * self.numVertices,
vertexAttribData, GL_STATIC_DRAW);
// end of new

NSUInteger vtxStride = sizeof(struct vertexAttribs);
//GLfloat *vtxBuf = (GLfloat *)vertexAttribData; // no longer use this
GLfloat *vtxBuf = (GLfloat *)NULL; // use this instead

glEnableVertexAttribArray(self.posAttribute);
glVertexAttribPointer(self.posAttribute, VERTEX_POS_SIZE, GL_FLOAT, GL_FALSE,
vtxStride, vtxBuf);
vtxBuf += VERTEX_POS_SIZE;

glEnableVertexAttribArray(self.normAttribute);
glVertexAttribPointer(self.normAttribute, VERTEX_NORM_SIZE, GL_FLOAT, GL_FALSE,
vtxStride, vtxBuf);
vtxBuf += VERTEX_NORM_SIZE;

glEnableVertexAttribArray(self.texCoordAttribute);
glVertexAttribPointer(self.texCoordAttribute, VERTEX_TEX_SIZE, GL_FLOAT, GL_FALSE,
vtxStride, vtxBuf);
...

最佳答案

用于在内存中实现单位跨度访问的数组结构是经验法则。它不仅适用于 GPU,还适用于 CPUS 和英特尔至强融核等协处理器。

就您而言,我不认为这部分代码会发送到 GPU,相反,性能损失是由于非单位跨度内存访问(CPU 到内存/从内存)造成的。

关于opengl - 结构数组或数组结构性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9650006/

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