代码参考如下:
const transformToBinaryPcd = (points) => { // XYZI模式,共4个参数,每个参数4个字节 const dataview = new DataView(new ArrayBuffer(16 * points.length)); points.forEach((point, rowIndex) => { if (point.length) { point.forEach((axis, axisIndex) => { dataview.setFloat32(rowIndex * 16 + axisIndex * 4, Number(axis), true) }) } }) return dataview; } const run = (input, output) => new Promise((resolve) => { const data = fs.readFileSync(input) const ab = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength); const result = parse(ab); const finalPoints = trans(result.points) const dataview = transformToBinaryPcd(finalPoints); const wstream = fs.createWriteStream(output, 'binary'); wstream.write(getPCDHeaderString(finalPoints.length)) wstream.write(Buffer.from(dataview.buffer)) wstream.end(() => { resolve(`${output} 写入成功!`); }); })
拆分&流式
在静态帧标注场景,我们一开始采用离线堆叠的方式处理文件,处理好合并帧PCD之后,再整体加载,结果不言而喻,非常差的体验,一个叠20帧的PCD文件大小高达五六百MB,即便进行二进制压缩,也需要上百MB。
单帧PCD渲染图,约30万个点叠20帧PCD渲染图,约600万个点
最终我们决定采取 分片流式加载 的方式,渐进式的加载PCD,并增量绘制到场景(scene)里,效果如下:
分片流式加载(模糊是因为我压缩了GIF)
优化完,体验就舒服多了,从图上可以明显看出来这种渐进式加载体验带来的丝滑效果很是令人满意。
全文完。码字不易,如果你还想继续看我写的东西,就关注我吧(记得加星标🌟哦),顺便给个赞👍或点一下在看,你的支持是我继续写下去的动力。