我正在尝试从 ThreeJS 中的 Texturepacker 加载 spritesheet,其中包含图像和 json。该图像有一堆小精灵打包在一起,json 定义了图像中小精灵的位置和大小。
我尝试了3种加载方法。
使用具有不同偏移量的多个纹理实例的方法应该可以正常工作,因为我没有复制源图像,但是当我通过切换材质的纹理来运行动画时,它会使用大量的 RAM,就好像它将整个源精灵表复制到内存中一样为每一个。如果我更改动画的纹理偏移而不是使用纹理副本,它可以正常工作,但偏移更改将应用于使用相同源精灵表的每个对象。
WebGLRenderTarget 方法需要一个相机和场景来裁剪纹理以及添加到场景中的精灵。此输出无法使用,因为它不会生成原始纹理的 1:1 裁剪,而且加载速度非常慢。有没有办法在 ThreeJS 中将纹理 1:1 渲染到较小的缓冲区?
Canvas 方法效果最好,我为每个精灵创建一个画布元素,并将精灵表裁剪到每个精灵中。这是 1:1 且质量良好,但使用 spritesheet 的要点是 GPU 仅需要处理单个图像,并且这需要 HTML 加载程序。理想情况下,我不想将精灵表裁剪为较小的纹理缓冲区。
为什么将相同的大源图像与多个 THREE.Texture 对象一起使用会占用如此多的内存?我预计它只需要在内存中保留单个纹理,并且纹理对象只会显示具有不同偏移量的相同纹理。