SceneKit,动态加载和替换纹理的最有效方法是啥? UIImage,MTLTexture,MDLTexture,URL?

Posted

技术标签:

【中文标题】SceneKit,动态加载和替换纹理的最有效方法是啥? UIImage,MTLTexture,MDLTexture,URL?【英文标题】:SceneKit, what is the most efficient way to load and replace textures on the fly? UIImage, MTLTexture, MDLTexture, URL?SceneKit,动态加载和替换纹理的最有效方法是什么? UIImage,MTLTexture,MDLTexture,URL? 【发布时间】:2020-11-02 00:20:59 【问题描述】:

我需要在运行时尽快加载和替换各种纹理,同时保持尽可能低的内存使用量。应尽快从 VRAM 中删除未使用的旧纹理。将所有内容重写为 Metal 可能会有所帮助,但工作量很大。

我们可以从 Apple 的文档中看到,纹理可能是:

UIImage / NSImage / MTLTexture / MDLTexture / String / URL

那么,哪一个是最好的。我测试了其中一些,但它们在 macOS 和 ios 上的行为不同。

【问题讨论】:

【参考方案1】:

文件路径和 URL 更好,因为它们不会为纹理数据预先分配内存。例如,在处理 UIImageCGImageRef 时,SceneKit 无法代表您丢弃原始图像数据,这可能与 SceneKit 内部想要使用的色彩空间和/或像素格式不匹配。

【讨论】:

不使用 UIImage 的代码会是什么样子? 我发现了这个,它肯定有助于内存管理。即使我没有过渡效果。我可能会找到解决方法... var documentsUrl: URL return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

以上是关于SceneKit,动态加载和替换纹理的最有效方法是啥? UIImage,MTLTexture,MDLTexture,URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SceneKit 中显示金属和透明纹理?

在OpenGL中动态加载纹理的好方法是啥?

SceneKit 中地形的 Splatmap

3D 模型无法在 Scenekit 中正确加载

使用 VBO 的纹理绑定无法正常工作

在 OpenGL 中绘制 3d 图形的最有效方法是啥?