代码之家  ›  专栏  ›  技术社区  ›  kennyc

大型MTLTexture是否比使用多个小型MTLTexture更具性能?

  •  0
  • kennyc  · 技术社区  · 6 年前

    我正在使用金属将图像显示为二维平面。正在使用Core image将图像渲染为iSurface的平铺。渲染每个磁贴后,iSurface将通过XPC发送到应用程序,包装在 MTLTexture 并使用blit编码器将其内容复制到主纹理。如果需要,IOSurface将被重新使用。

    我完全可以控制瓷砖的大小和纹理大小,我想知道金属是否喜欢有少量的大纹理,大量的小纹理,或者这并不重要。

    我已经遇到了一些权衡,最值得注意的是,如果我使用更小的纹理,那么(重新)生成mipmap的成本可能更小。还有最大尺寸为16384的纹理问题,这意味着任何大于该尺寸的图像都需要平铺。

    考虑以下事项:

    #1-覆盖整个图像的单个纹理:

    Single Tile

    Texture Type: MTLTextureType2D
    Texture Size: 400 x 300 px
    

    当核心图像渲染平铺并将其复制到纹理中时,我必须为整个纹理重新生成mipmap,即使纹理的大部分内容没有更改。


    #2-使用两种纹理:

    Two Tiles

    Texture Type: MTLTextureType2DArray
    Texture Array Count: 2
    Texture Size: 200 x 300 px (x2)
    


    #3-使用多种纹理:

    Many Tiles

    Texture Type: MTLTextureType2DArray
    Texture Array Length: 12
    Texture Size: 100 x 100 px (x12)
    

    在这种情况下,我可以通过将纹理分片大小与渲染分片大小匹配来最小化mipmap生成,但这需要大量的时间 MTLTextures .


    MTLTextureDescriptor.arrayLength 被记录为能够保持1到2048之间的值,这对我来说,使用大量纹理并不是一件坏事。

    一个纹理被传递到我的片段着色器,它所做的只是在适当的坐标处采样颜色。

    我目前在衡量性能方面的尝试对我来说有些包容性,我想知道这是否是因为从金属的角度来看,这一点都不重要。最终,需要相同的内存量(从我的角度来看),但我想知道是否有性能权衡我不知道。

    0 回复  |  直到 6 年前