此分配对速度有影响吗?

问题描述 投票:0回答:1

此非成员函数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);
    }
}
c++ performance draw
1个回答
1
投票

确定的唯一方法就是测量。但是,您还能使用什么与之进行比较?在堆上分配显然要慢一些。使用全局变量来保存顶点可能是一种选择-仅用于性能基准测试。

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

© www.soinside.com 2019 - 2024. All rights reserved.