我正在使用金属将图像显示为二维平面。正在使用Core image将图像渲染为iSurface的平铺。渲染每个磁贴后,iSurface将通过XPC发送到应用程序,包装在
MTLTexture
并使用blit编码器将其内容复制到主纹理。如果需要,IOSurface将被重新使用。
我完全可以控制瓷砖的大小和纹理大小,我想知道金属是否喜欢有少量的大纹理,大量的小纹理,或者这并不重要。
我已经遇到了一些权衡,最值得注意的是,如果我使用更小的纹理,那么(重新)生成mipmap的成本可能更小。还有最大尺寸为16384的纹理问题,这意味着任何大于该尺寸的图像都需要平铺。
考虑以下事项:
#1-覆盖整个图像的单个纹理:
Texture Type: MTLTextureType2D
Texture Size: 400 x 300 px
当核心图像渲染平铺并将其复制到纹理中时,我必须为整个纹理重新生成mipmap,即使纹理的大部分内容没有更改。
#2-使用两种纹理:
Texture Type: MTLTextureType2DArray
Texture Array Count: 2
Texture Size: 200 x 300 px (x2)
#3-使用多种纹理:
Texture Type: MTLTextureType2DArray
Texture Array Length: 12
Texture Size: 100 x 100 px (x12)
在这种情况下,我可以通过将纹理分片大小与渲染分片大小匹配来最小化mipmap生成,但这需要大量的时间
MTLTextures
.
MTLTextureDescriptor.arrayLength
被记录为能够保持1到2048之间的值,这对我来说,使用大量纹理并不是一件坏事。
一个纹理被传递到我的片段着色器,它所做的只是在适当的坐标处采样颜色。
我目前在衡量性能方面的尝试对我来说有些包容性,我想知道这是否是因为从金属的角度来看,这一点都不重要。最终,需要相同的内存量(从我的角度来看),但我想知道是否有性能权衡我不知道。