区块链技术博客
www.b2bchain.cn

使用参数缓冲区管理资源组求职学习资料

本文介绍了使用参数缓冲区管理资源组求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

Managing Groups of Resources with Argument Buffers | Apple Developer Documentation

创建参数缓冲区来组织相关资源。

翻译术语表

概述

参数缓冲区表示一组资源,这些资源可以作为一个参数集体分配给图形或运算函数。你可以使用参数缓冲区减少CPU开销,简化资源管理,并实现GPU驱动的管线。

在本示例中,你将学习如何在参数缓冲区中指定、编码、设置和访问资源。特别是,你将体会到在参数缓冲区中管理资源组而非单个资源的优势。本示例使用纹理、采样器、缓冲区和编码为参数缓冲区的常量来渲染一个静态四边形。

入门

Xcode项目包含了在macOS、iOS或tvOS上运行本示例的方案。默认方案是macOS,它将按Mac上的方式运行示例。

CPU开销和参数缓冲区

Metal命令是高效的,当app访问GPU时,CPU的开销最小。然而,每条命令都会产生一些开销;为了进一步减少开销,请使用这些策略:

  • 用更少的CPU命令做更多的GPU工作(译者注:这里没有打错,可以理解为以GPU的工作方式重新组织完成任务的命令)。
  • 避免重复执行昂贵的CPU命令。

Metal的参数缓冲区(argument buffer)功能减少了app关键路径中(例如,在app的渲染循环中)的CPU命令的数量和性能成本。一个参数缓冲区允许你在一个缓冲区内的多个资源进行分组和编码,而不是单独对每个资源进行编码。通过参数缓冲区,你可以把大量的CPU开销从app的关键路径转移到其初始设置中。

单个资源与参数缓冲区

Metal app,尤其是游戏,通常包含多个3D对象,每个对象都与一组资源相关联,如纹理、采样器、缓冲区和常量。为了渲染每个对象,app在发出绘制调用之前,对Metal命令进行编码,这些命令把资源设置为图形函数的参数。

你可以通过调用MTLRenderCommandEncoder的方法(例如setVertexBuffer:offset:atIndex:setFragmentTexture:atIndex:)来设置单个资源作为参数。

使用参数缓冲区管理资源组

设置单个资源的命令可能因此变得繁多且昂贵,特别是对于大型app或游戏。相反,你可以把相关资源分组到参数缓冲区中,然后把整个缓冲区设置为图像函数到单个参数。这种方法大大减少了CPU开销,并且仍然提供了对资源的单个GPU访问。

参数缓冲区表示为MTLBuffer对象。因此,通过调用MTLRenderCommandEncoder的方法将它们设置为参数,例如为每个参数缓冲区调用setVertexBuffer:offset:atIndex:setFragmentBuffer:offset:atIndex:方法。

使用参数缓冲区管理资源组

注意

要访问参数缓冲区中的单个资源,必须为要使用的每个资源单独调用useResource:usage:方法。有关更多信息,请参阅“在参数缓冲区中启用资源的GPU内存”部分。

定义参数缓冲区

参数缓冲区被定义为Metal着色器语言中的自定义结构体。每个结构体元素代表一个单独的资源,声明为纹理、采样器、缓冲区或常量数据类型。一个结构体元素还与一个整数相关联,用[[id(n)]]属性限定符声明,它制定了单个资源的索引。

本示例中的参数缓冲区声明为FragmentShaderArguments结构体,这是它的定义:

typedef struct FragmentShaderArguments {     texture2d<half> exampleTexture  [[ id(AAPLArgumentBufferIDExampleTexture)  ]];     sampler         exampleSampler  [[ id(AAPLArgumentBufferIDExampleSampler)  ]];     device float   *exampleBuffer   [[ id(AAPLArgumentBufferIDExampleBuffer)   ]];     uint32_t        exampleConstant [[ id(AAPLArgumentBufferIDExampleConstant) ]]; } FragmentShaderArguments;

该参数缓冲区包含以下资源:

  • exampleTexture,索引为0的二维纹理。
  • exampleSampler,索引为1的采样器。
  • exampleBuffer,索引为2float型缓冲区。
  • exampleConstant,索引为3uint32_t型常量。
fragment float4 fragmentShader(       RasterizerData            in                 [[ stage_in ]],                device FragmentShaderArguments & fragmentShaderArgs [[ buffer(AAPLFragmentBufferIndexArguments) ]])

fragmentShaderArgs参数是类型为FragmentShaderArguments的缓冲区。当示例设置一个MTLBuffer作为片元函数的参数时,函数把fragmentShaderArgs参数中的数据解析为一个参数缓冲区,其中包含纹理、采样器、缓冲区和常量(由FragmentShaderArguments结构体定义)。

把资源编码到参数缓冲区

在函数访问缓冲区之前,只需将单个资源编码到参数缓冲区中。这可以通过从使用参数缓冲区的MTLFunction创建一个MTLArgumentBufferEncoder来实现。

本示例从包含fragmentShaderArgs参数的fragmentShader函数中创建了一个MTLArgumentBufferEncoder

id <MTLFunction> fragmentFunction = [defaultLibrary newFunctionWithName:@"fragmentShader"];  id <MTLArgumentEncoder> argumentEncoder =     [fragmentFunction newArgumentEncoderWithBufferIndex:AAPLFragmentBufferIndexArguments];

argumentEncoderencodedLength属性决定了包含参数缓冲区中所有资源所需的大小,以字节为单位。本示例使用该值创建了一个新的缓冲区_fragmentShaderArgumentBuffer,其长度与参数缓冲区所需大小相匹配。

Managing Groups of Resources with Argument Buffers | Apple Developer Documentation

创建参数缓冲区来组织相关资源。

翻译术语表

概述

参数缓冲区表示一组资源,这些资源可以作为一个参数集体分配给图形或运算函数。你可以使用参数缓冲区减少CPU开销,简化资源管理,并实现GPU驱动的管线。

在本示例中,你将学习如何在参数缓冲区中指定、编码、设置和访问资源。特别是,你将体会到在参数缓冲区中管理资源组而非单个资源的优势。本示例使用纹理、采样器、缓冲区和编码为参数缓冲区的常量来渲染一个静态四边形。

入门

Xcode项目包含了在macOS、iOS或tvOS上运行本示例的方案。默认方案是macOS,它将按Mac上的方式运行示例。

CPU开销和参数缓冲区

Metal命令是高效的,当app访问GPU时,CPU的开销最小。然而,每条命令都会产生一些开销;为了进一步减少开销,请使用这些策略:

  • 用更少的CPU命令做更多的GPU工作(译者注:这里没有打错,可以理解为以GPU的工作方式重新组织完成任务的命令)。
  • 避免重复执行昂贵的CPU命令。

Metal的参数缓冲区(argument buffer)功能减少了app关键路径中(例如,在app的渲染循环中)的CPU命令的数量和性能成本。一个参数缓冲区允许你在一个缓冲区内的多个资源进行分组和编码,而不是单独对每个资源进行编码。通过参数缓冲区,你可以把大量的CPU开销从app的关键路径转移到其初始设置中。

单个资源与参数缓冲区

Metal app,尤其是游戏,通常包含多个3D对象,每个对象都与一组资源相关联,如纹理、采样器、缓冲区和常量。为了渲染每个对象,app在发出绘制调用之前,对Metal命令进行编码,这些命令把资源设置为图形函数的参数。

你可以通过调用MTLRenderCommandEncoder的方法(例如setVertexBuffer:offset:atIndex:setFragmentTexture:atIndex:)来设置单个资源作为参数。

使用参数缓冲区管理资源组

设置单个资源的命令可能因此变得繁多且昂贵,特别是对于大型app或游戏。相反,你可以把相关资源分组到参数缓冲区中,然后把整个缓冲区设置为图像函数到单个参数。这种方法大大减少了CPU开销,并且仍然提供了对资源的单个GPU访问。

参数缓冲区表示为MTLBuffer对象。因此,通过调用MTLRenderCommandEncoder的方法将它们设置为参数,例如为每个参数缓冲区调用setVertexBuffer:offset:atIndex:setFragmentBuffer:offset:atIndex:方法。

使用参数缓冲区管理资源组

注意

要访问参数缓冲区中的单个资源,必须为要使用的每个资源单独调用useResource:usage:方法。有关更多信息,请参阅“在参数缓冲区中启用资源的GPU内存”部分。

定义参数缓冲区

参数缓冲区被定义为Metal着色器语言中的自定义结构体。每个结构体元素代表一个单独的资源,声明为纹理、采样器、缓冲区或常量数据类型。一个结构体元素还与一个整数相关联,用[[id(n)]]属性限定符声明,它制定了单个资源的索引。

本示例中的参数缓冲区声明为FragmentShaderArguments结构体,这是它的定义:

typedef struct FragmentShaderArguments {     texture2d<half> exampleTexture  [[ id(AAPLArgumentBufferIDExampleTexture)  ]];     sampler         exampleSampler  [[ id(AAPLArgumentBufferIDExampleSampler)  ]];     device float   *exampleBuffer   [[ id(AAPLArgumentBufferIDExampleBuffer)   ]];     uint32_t        exampleConstant [[ id(AAPLArgumentBufferIDExampleConstant) ]]; } FragmentShaderArguments;

该参数缓冲区包含以下资源:

  • exampleTexture,索引为0的二维纹理。
  • exampleSampler,索引为1的采样器。
  • exampleBuffer,索引为2float型缓冲区。
  • exampleConstant,索引为3uint32_t型常量。
fragment float4 fragmentShader(       RasterizerData            in                 [[ stage_in ]],                device FragmentShaderArguments & fragmentShaderArgs [[ buffer(AAPLFragmentBufferIndexArguments) ]])

fragmentShaderArgs参数是类型为FragmentShaderArguments的缓冲区。当示例设置一个MTLBuffer作为片元函数的参数时,函数把fragmentShaderArgs参数中的数据解析为一个参数缓冲区,其中包含纹理、采样器、缓冲区和常量(由FragmentShaderArguments结构体定义)。

把资源编码到参数缓冲区

在函数访问缓冲区之前,只需将单个资源编码到参数缓冲区中。这可以通过从使用参数缓冲区的MTLFunction创建一个MTLArgumentBufferEncoder来实现。

本示例从包含fragmentShaderArgs参数的fragmentShader函数中创建了一个MTLArgumentBufferEncoder

id <MTLFunction> fragmentFunction = [defaultLibrary newFunctionWithName:@"fragmentShader"];  id <MTLArgumentEncoder> argumentEncoder =     [fragmentFunction newArgumentEncoderWithBufferIndex:AAPLFragmentBufferIndexArguments];

argumentEncoderencodedLength属性决定了包含参数缓冲区中所有资源所需的大小,以字节为单位。本示例使用该值创建了一个新的缓冲区_fragmentShaderArgumentBuffer,其长度与参数缓冲区所需大小相匹配。

Managing Groups of Resources with Argument Buffers | Apple Developer Documentation

创建参数缓冲区来组织相关资源。

翻译术语表

概述

参数缓冲区表示一组资源,这些资源可以作为一个参数集体分配给图形或运算函数。你可以使用参数缓冲区减少CPU开销,简化资源管理,并实现GPU驱动的管线。

在本示例中,你将学习如何在参数缓冲区中指定、编码、设置和访问资源。特别是,你将体会到在参数缓冲区中管理资源组而非单个资源的优势。本示例使用纹理、采样器、缓冲区和编码为参数缓冲区的常量来渲染一个静态四边形。

入门

Xcode项目包含了在macOS、iOS或tvOS上运行本示例的方案。默认方案是macOS,它将按Mac上的方式运行示例。

CPU开销和参数缓冲区

Metal命令是高效的,当app访问GPU时,CPU的开销最小。然而,每条命令都会产生一些开销;为了进一步减少开销,请使用这些策略:

  • 用更少的CPU命令做更多的GPU工作(译者注:这里没有打错,可以理解为以GPU的工作方式重新组织完成任务的命令)。
  • 避免重复执行昂贵的CPU命令。

Metal的参数缓冲区(argument buffer)功能减少了app关键路径中(例如,在app的渲染循环中)的CPU命令的数量和性能成本。一个参数缓冲区允许你在一个缓冲区内的多个资源进行分组和编码,而不是单独对每个资源进行编码。通过参数缓冲区,你可以把大量的CPU开销从app的关键路径转移到其初始设置中。

单个资源与参数缓冲区

Metal app,尤其是游戏,通常包含多个3D对象,每个对象都与一组资源相关联,如纹理、采样器、缓冲区和常量。为了渲染每个对象,app在发出绘制调用之前,对Metal命令进行编码,这些命令把资源设置为图形函数的参数。

你可以通过调用MTLRenderCommandEncoder的方法(例如setVertexBuffer:offset:atIndex:setFragmentTexture:atIndex:)来设置单个资源作为参数。

使用参数缓冲区管理资源组

设置单个资源的命令可能因此变得繁多且昂贵,特别是对于大型app或游戏。相反,你可以把相关资源分组到参数缓冲区中,然后把整个缓冲区设置为图像函数到单个参数。这种方法大大减少了CPU开销,并且仍然提供了对资源的单个GPU访问。

参数缓冲区表示为MTLBuffer对象。因此,通过调用MTLRenderCommandEncoder的方法将它们设置为参数,例如为每个参数缓冲区调用setVertexBuffer:offset:atIndex:setFragmentBuffer:offset:atIndex:方法。

使用参数缓冲区管理资源组

注意

要访问参数缓冲区中的单个资源,必须为要使用的每个资源单独调用useResource:usage:方法。有关更多信息,请参阅“在参数缓冲区中启用资源的GPU内存”部分。

定义参数缓冲区

参数缓冲区被定义为Metal着色器语言中的自定义结构体。每个结构体元素代表一个单独的资源,声明为纹理、采样器、缓冲区或常量数据类型。一个结构体元素还与一个整数相关联,用[[id(n)]]属性限定符声明,它制定了单个资源的索引。

本示例中的参数缓冲区声明为FragmentShaderArguments结构体,这是它的定义:

typedef struct FragmentShaderArguments {     texture2d<half> exampleTexture  [[ id(AAPLArgumentBufferIDExampleTexture)  ]];     sampler         exampleSampler  [[ id(AAPLArgumentBufferIDExampleSampler)  ]];     device float   *exampleBuffer   [[ id(AAPLArgumentBufferIDExampleBuffer)   ]];     uint32_t        exampleConstant [[ id(AAPLArgumentBufferIDExampleConstant) ]]; } FragmentShaderArguments;

该参数缓冲区包含以下资源:

  • exampleTexture,索引为0的二维纹理。
  • exampleSampler,索引为1的采样器。
  • exampleBuffer,索引为2float型缓冲区。
  • exampleConstant,索引为3uint32_t型常量。
fragment float4 fragmentShader(       RasterizerData            in                 [[ stage_in ]],                device FragmentShaderArguments & fragmentShaderArgs [[ buffer(AAPLFragmentBufferIndexArguments) ]])

fragmentShaderArgs参数是类型为FragmentShaderArguments的缓冲区。当示例设置一个MTLBuffer作为片元函数的参数时,函数把fragmentShaderArgs参数中的数据解析为一个参数缓冲区,其中包含纹理、采样器、缓冲区和常量(由FragmentShaderArguments结构体定义)。

把资源编码到参数缓冲区

在函数访问缓冲区之前,只需将单个资源编码到参数缓冲区中。这可以通过从使用参数缓冲区的MTLFunction创建一个MTLArgumentBufferEncoder来实现。

本示例从包含fragmentShaderArgs参数的fragmentShader函数中创建了一个MTLArgumentBufferEncoder

id <MTLFunction> fragmentFunction = [defaultLibrary newFunctionWithName:@"fragmentShader"];  id <MTLArgumentEncoder> argumentEncoder =     [fragmentFunction newArgumentEncoderWithBufferIndex:AAPLFragmentBufferIndexArguments];

argumentEncoderencodedLength属性决定了包含参数缓冲区中所有资源所需的大小,以字节为单位。本示例使用该值创建了一个新的缓冲区_fragmentShaderArgumentBuffer,其长度与参数缓冲区所需大小相匹配。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 使用参数缓冲区管理资源组求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们