[Unity]数据的精度、硬件支持、以及性能

2020/05 14 15:05

在PC平台-Windows/Mac/Linux上,half,half,float 一律这视为32-bit float精度。half和fixed只在移动平台GPU上有区别

最好在真机上实测不同精度的表现,防止出现问题

在移动平台上,不同型号的GPU处理同类型的数据,精度也是不同的。

GPU Familyfloathalffixed
PowerVR Series 6/73216
PowerVR SGX 5xx321611
Qualcomm Adreno 4xx/3xx3216
Qualcomm Adreno 2xx32 vertex 24 fragment
ARM Mali T6xx/7xx3216
ARM Mali 400/45032 vertex 16 fragment
NVIDIA X13216
NVIDIA K132
NVIDIA Tegra 3/43216

大多数移动GPU仅支持32位数字(用于float)或16位数字(用于half/fixed)。一些较旧的GPU具有不同的精度在VS和PS中。

使用低精度的数据通常会更快,由于改善了GPU寄存器分配,以及某些低精度数学运算具有特殊的“快速路径”执行单元。使用低精度数据也会减少GPU的功耗,从而延长电池寿命。

一般经验是,除了位置和纹理坐标外,其他所有内容都可以用half/fixed。仅当精度不够时才提高

无穷大的数、Nana和其它特别浮点数

Direct3D 10的PC GPU都支持非常明确的IEEE 754浮点标准。这意味着浮点数的行为与在CPU上常规编程语言中的行为完全相同。

移动平台GPU行为不同。将零除以零可能会导致NaN;或者可能会导致无穷大,零或任何其他未指定的值。

我们要确保在目标设备上测试着色器以检查它们是否受支持。