以一个整数小的增益存储几个值

这可能是一个难以回答的问题,但是…我有一个DirectX :: XMFLOAT3作为顶点属性。 通过将3个浮点数放置为int(每个浮点数仅使用8个位),我已将其更改为int。 在顶点着色器中,我提取像这样的位:

// example int bits: 00000000 10011000 00011101 11111111 input.weight.x = ( input.w >> 16 ) / 255.0f; // 10011000 / 255.0f input.weight.y = ( ( input.w & 0x0000FF00 ) >> 8 ) / 255.0f; // 00011101 / 255.0f input.weight.z = ( input.w & 0x000000FF ) / 255.0f; // 11111111 / 255.0f 

但是用这种方式,我只能获得1-5 fps(从130到135),那么fps提升是如此之小呢? 这是什么罪魁祸首? GPU上的提取位很重吗?

我不认为这会给你带来什么,实际上我觉得你会失去performance。 你应该使用一个分析器来查明瓶颈的位置。

一个好的thumbrule是不要混合在GPU上的Interger和Floatmath,这通常是一个垮台。 当然,当需要的时候有点,但是将浮点数打包成int是非常糟糕的! 而是考虑使用使用Float16的vertexlayout。 所以你使用浮点数的一半精度。

另外需要注意的是,你可能会相信你是带宽限制的,这在纹理而不是顶点缓冲区中很常见。 一个包含一百万个顶点的网格大麦会占用512×512纹理的内存。 (值得关注的是在那里优化)

另一方面,gpu在内存上存储顶点缓冲区,纹理和其他东西,所以除非你每更新一次你的顶点缓冲区,否则不会把它stream到GPU。