Javascript 在WebGL程序中使用制服[1234][uif]设置制服:矢量版本[v]在任何方面都更好吗?
使用带有数组类型的Javascript 在WebGL程序中使用制服[1234][uif]设置制服:矢量版本[v]在任何方面都更好吗?,javascript,performance,glsl,webgl,Javascript,Performance,Glsl,Webgl,使用带有数组类型的uniform[1234][uif][v]设置WebGL程序的制服,而不是仅使用uniform[1234][uif]+散布参数,是否有任何显著的优点/缺点,例如: gl.uniform3f(位置,v0,v1,v2);//GLSL类型:vec3 //vs gl.uniform3fv(位置[v0,v1,v2]);//GLSL类型:vec3(或vec3[]数组) 显然,撇开该方法的一个版本处理数组这一事实不谈 我正在寻找性能、可读性和总体最佳实践方面的考虑因素 谢谢 我认为你应该想
uniform[1234][uif][v]
设置WebGL程序的制服,而不是仅使用uniform[1234][uif]
+散布参数,是否有任何显著的优点/缺点,例如:
gl.uniform3f(位置,v0,v1,v2);//GLSL类型:vec3
//vs
gl.uniform3fv(位置[v0,v1,v2]);//GLSL类型:vec3(或vec3[]数组)
显然,撇开该方法的一个版本处理数组这一事实不谈
我正在寻找性能、可读性和总体最佳实践方面的考虑因素
谢谢 我认为你应该想做什么就做什么。我的意思是很难建议哪一个更好,因为这太依赖于你的个人编码偏好了 假设你做了一个这样的向量
const v = {x: 1, y: 2, z: 3}
const v = [1, 2, 3];
现在,当需要将其与gl.uniform
一起使用时,您可以执行以下任一操作
gl.uniform3f(loc, v.x, v.y, v.z);
gl.uniform3fv(loc, [v.x, v.y, v.z]);
在这种情况下,第一个更好,因为第二个是在每次执行该行时创建一个新数组
另一方面,如果你创建一个像这样的向量
const v = {x: 1, y: 2, z: 3}
const v = [1, 2, 3];
然后
显然,第二个更好
使用ES5,您还有一个选择,即
gl.uniform3f(loc, ...v);
我不知道这比gl.uinform3fv(loc,v)快还是慢。我怀疑今天的速度会慢一些,但将来的速度可能会一样。因为您有gl.uinform3fv
,所以没有理由使用这种样式。它对于其他没有数组格式的函数也很有用。例子
const color = [1, 0, 0, 1];
gl.clearColor(...color);
阵列版本本身稍微慢一点。引用(第19页) 例如,比较
uniform4f
到uniform4fv
而不是uniform1f
,我们
发现uniform4fv
在所有方面都比uniform4f
慢
我们尝试的浏览器,尽管参数尽可能少
uniform1f
。这是因为uniform4fv
比uniform4f
有更多的工作要做,因为它可以处理
任意统一数组上传
基本上,必须检查输入是否是数组(然后检查其元素类型)、类型化数组等会失去传递较少参数所获得的性能
不过,这主要意味着您应该使用与您的数据匹配的数据,因为解压缩现有阵列可能会超过其好处(尽管可以自由测试)。谢谢!因此,程序/应用程序的设计似乎决定了其中一个的使用。最终我想这取决于浏览器的WebGL实现。在这一点上,这可能是过早的优化。