添加/组合ArrayBuffers的首选方法是什么?
我正在接收和解析具有各种数据结构的网络数据包.传入消息将读入ArrayBuffers.如果部分数据包到达,我需要存储它并在重新尝试解析它之前等待下一条消息.
目前我正在做这样的事情:
function appendBuffer( buffer1, buffer2 ) {
var tmp = new Uint8Array( buffer1.byteLength + buffer2.byteLength );
tmp.set( new Uint8Array( buffer1 ), 0 );
tmp.set( new Uint8Array( buffer2 ), buffer1.byteLength );
return tmp.buffer;
}
Run Code Online (Sandbox Code Playgroud)
显然你不能不得不创建一个新的缓冲区,因为ArrayBuffers的长度是固定的,但是有必要初始化类型化的数组吗?到达后我只想要能够将缓冲区视为缓冲区; 类型和结构无关紧要.
看一下编译器生成的x86程序集,我注意到(无符号)整数除法有时实现为整数乘法.这些优化似乎遵循这种形式
value / n => (value * ((0xFFFFFFFF / n) + 1)) / 0x100000000
Run Code Online (Sandbox Code Playgroud)
例如,执行除以9:
12345678 / 9 = (12345678 * 0x1C71C71D) / 0x100000000
Run Code Online (Sandbox Code Playgroud)
除以3将使用乘法0x55555555 + 1,依此类推.
利用mul指令将结果的高部分存储在edx寄存器中的事实,可以使用具有魔术值的单个乘法来获得除法的最终结果.(虽然这种优化有时与最后的逐位移位一起使用.)
我想了解一下这实际上是如何运作的.这种方法什么时候有效?为什么必须将1添加到我们的"神奇数字"中?
optimization assembly bit-manipulation multiplication division
我在 THREE.js 中的顶点法线方面遇到困难。(作为参考,我使用的是修订版 58。)出于各种原因,我想在设置几何体时首先计算面顶点法线,然后可以自由地对其进行变换、合并等。
虽然我意识到法线取决于应用矩阵时变换的顶点,但我认为 Geometry.applyMatrix 也能够变换它们。然而,虽然以下工作正常:
geometry.applyMatrix(new THREE.Matrix4().makeScale(1, -1, 1));
geometry.computeFaceNormals();
geometry.computeVertexNormals();
Run Code Online (Sandbox Code Playgroud)
...以下操作顺序会产生反转的顶点法线:
geometry.computeFaceNormals();
geometry.computeVertexNormals();
geometry.applyMatrix(new THREE.Matrix4().makeScale(1, -1, 1));
Run Code Online (Sandbox Code Playgroud)
所以我只是想知道,这是否按预期工作?在计算顶点法线之前,是否需要首先对几何体进行所有变换?
javascript ×2
arraybuffer ×1
assembly ×1
division ×1
optimization ×1
three.js ×1
typed-arrays ×1