【发布时间】:2019-10-09 20:58:29
【问题描述】:
此非成员函数drawPoly() 从顶点列表中绘制 3D 空间中的 n 边多边形。
此函数在正常执行期间通常会被调用数千次,速度至关重要。
忽略drawPoly()中调用的函数的影响,25元素顶点数组的分配对速度有什么负面影响吗?
void drawPoly(const meshx::Face& face, gen::Vector position,
ALLEGRO_COLOR color, bool filled)
{
ALLEGRO_VERTEX vertList[25];
std::size_t k = 0;
// ...For every vertex in the polygon...
for(; k < face.getNumVerts(); ++k) {
vertList[k].x = position.x + face.alVerts[k].x;
vertList[k].y = position.y + face.alVerts[k].y;
vertList[k].z = position.z + face.alVerts[k].z;
vertList[k].u = 0;
vertList[k].v = 0;
vertList[k].color = color;
}
// Draw with ALLEGRO_VERTEXs and no textures.
if(filled) {
al_draw_prim(vertList, nullptr, nullptr,
0, k, ALLEGRO_PRIM_TRIANGLE_LIST);
} else {
al_draw_prim(vertList, nullptr, nullptr,
0, k, ALLEGRO_PRIM_LINE_LOOP);
}
}
【问题讨论】:
-
如果顶点类型是 POD(它可能是),则字面意思转换为单个
sub esp, N指令(或足够接近,其中 N 是 25 个结构所需的对齐字节数)。您知道,您始终可以通过 asm-list 生成来执行此操作,并检查优化的发布版本中发生的情况。 -
ALLEGRO_VERTEX vertList[25];“分配25个元素的顶点数组对速度有负面影响吗?” - 不,你是声明函数堆栈本身具有自动存储持续时间的数组。将为函数堆栈提供足够的大小以多次处理 25 个元素的数组。没有调用内存分配函数,它只是一个声明。 (这可能是获得 25 元素数组的最有效方法之一)
标签: c++ performance draw