- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是配备 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/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!