4

最近我有一个项目,我需要使用画布创建很多大型纹理,然后将它们上传到 GPU。当页面加载时,我不断地耗尽内存(chrome 崩溃)并且“窒息”,因为所有纹理都同时被推送通过 GPU 总线。

我决定错开texture.needsUpdate = true;调用,这样所有纹理都不会在一次渲染更新中推送到 GPU。

这行得通,但我很好奇任何其他解决方案......

我发布这个是因为它可能对其他在启动时加载所有纹理的人有帮助......

4

1 回答 1

1

将纹理剔除为零是阻止过度负载的最佳方法。从根本上使它们更小将改善后续的一切。

虽然这篇文章很旧,但它在谷歌上显示为最高结果。因此,这里有一些对任何其他初学者 3D 游戏/网络开发人员的方便提示。

纹理以固定位块添加到缓冲区中,块越少越好,但是以 2 的幂的分辨率创建纹理将防止加载半块并浪费位/时间。的幂是指在每个实例中加倍的数字序列(2、4、8、16、32、64),遵守这个公式将防止丢失位。

查看屏幕上纹理的大小。您的来源可能是 1024x1024,但如果它在屏幕上只有 20px 高,或者您的输出画布 id 为 480x640,那么所有额外信息都会丢失。减少纹理以匹配屏幕上的内容。

同样,如果您不使用它们,请在纹理上取出颜色,有时您可以使用顶点着色和/或灯光将细节添加到纹理中,在这种情况下将纹理保存为灰度图像,或限制调色板大小通过索引它们。

.gif 是小纹理的绝佳格式,而 Jpeg 更适合压缩大纹理。如果您使用 .gif,您还可以通过将纹理分组到一个图像和匹配它们的调色板来节省空间。请记住整个 Zelda LTTP 游戏仅使用 256 种颜色。有多种方法可以创建 RGB 索引数组并将图像存储为从中提取的原始数字。

如果您从 JSON 导入/导出,请记住您的图像默认为原始 32 位 .png 文件。它们本身很大,当作为位数据添加到 JSON 对象文件的末尾时变得更大。仅导出网格数据并通过源中的 JS 将纹理添加回其中,可以使用更多格式并优化更多纹理。

于 2016-03-18T03:07:33.887 回答