【问题标题】:Does this allocation have any effects on speed?这种分配对速度有影响吗?
【发布时间】: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


【解决方案1】:

唯一可以确定的方法就是测量。但是你还能用什么来比较呢?在堆上分配显然会更慢。使用全局变量来保存顶点可能是一种选择 - 仅用于性能基准测试。

鉴于可构造对象的堆栈分配通常转换为堆栈指针的简单更改,分配本身可能没什么大不了的。可能会产生明显的影响的是触摸额外的缓存行。从性能的角度来看,代码写入的缓存行越少越好。因此,您可以尝试将vertList[25] 拆分为缓存行大小的数组,并多次调用al_draw_prim。基准会显示是否存在差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多