小编kla*_*ius的帖子

在列主要顺序中重新排序3D矢量三元组是缓慢的

我有很多(x1,y1,z1),(x2,y2,z2),(x3,y3,z3)单精度矢量三元组,我想重新排序它们,所以(x1,y1,z1) ,(x2,y2,z2),(x3,y3,z3)变为(x1,x2,x3,0,y1,y2,y3,0,z1,z2,z3,0)

目标是为基于SSE的计算预先设置数据集.我有以下代码来执行此操作:

for (int i=0;i<count;i++)
{
    Vect3F p0 = get_first_point(i);
    Vect3F p1 = get_second_point(i);
    Vect3F p2 = get_third_point(i);
    int idx = i*3;
    scratch[idx] = Vec4F(p0.x, p1.x, p2.x, 0); // These 3 rows are the slowest
    scratch[idx+1] = Vec4F(p0.y, p1.y, p2.y, 0);
    scratch[idx+2] = Vec4F(p0.z, p1.z, p2.z, 0);
}
Run Code Online (Sandbox Code Playgroud)

循环的最后3行非常慢,它们占我整个算法的90%的时间!

这是正常的吗?我可以更快地进行这样的洗牌吗?(scratch是一个静态变量,并且是16对齐的.该函数经常被调用,所以我认为临时块不应该从缓存中消失.)

c c++ sse simd

7
推荐指数
1
解决办法
439
查看次数

现代GPU上的纹理变化(和其他状态变化)成本

我正在编写一个基于场景图的图形引擎,用于建模目的.我正在使用XNA 4.在我阅读的许多地方,渲染过程中应该最小化纹理变化(以及其他状态变化)(因此我必须按材料来订购我的基元等).

我在XNA 4中创建了一个小型测试应用程序,它使用单个纹理渲染数百个斯坦福兔子模型,然后切换2个不同的纹理.渲染时间没有差异(但是我使用了小~100x100纹理).

所以我的问题是:

  • 我真的应该关心通过纹理/颜色/其他材料参数对基元进行排序吗?或者它在现代GPU上不太重要?
  • 如果不这样做,可预期的绩效损失百分比是多少?
  • 是否还有其他状态变化会影响性能?
  • 我在哪里可以找到关于此的最新文献/最佳实践指南?

感谢您的帮助或链接!

directx 3d xna gpu direct3d

4
推荐指数
1
解决办法
1013
查看次数

标签 统计

3d ×1

c ×1

c++ ×1

direct3d ×1

directx ×1

gpu ×1

simd ×1

sse ×1

xna ×1