热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

解释Metal和SIMD中的不同类型

如何解决《解释Metal和SIMD中的不同类型》经验,为你挑选了1个好方法。

在使用Metal时,我发现类型令人困惑,而且我并不总是清楚在哪种情况下应该使用哪种类型。

在Apple的Metal Shading语言规范中,Metal着色器文件中支持哪种类型的表非常清楚。但是,有许多示例代码似乎使用了SIMD一部分中的其他类型。在macOS(Objective-C)方面,Metal类型不可用,但SIMD类型可用,我不确定应该使用哪种类型。

例如:

在《金属规格》中,float2它被描述为代表两个浮动成分的“向量”数据类型。

在应用程序方面,以下所有功能似乎都得到了使用或表示:

float2typedef ::simd_float2 float2位于vector_types.h中

注意:“在C或Objective-C中,此类型可以作为simd_float2使用。”


vector_float2,这是 typedef simd_float2 vector_float2

注意:“此类型已弃用;您应该改用simd_float2或simd :: float2”


simd_float2,这是 typedef __attribute__((__ext_vector_type__(2))) float simd_float2


::simd_float2simd::float2


矩阵类型也存在类似情况:

matrix_float4x4simd_float4x4::simd_float4x4float4x4


有人可以说明为什么这么多的typedef具有看似重叠的功能吗?如果您今天(2018年)使用Objective-C / Objective-C ++编写一个新应用程序,则应使用哪种类型来表示两个浮点值(x / y),以及可以在应用程序代码和Metal之间共享的矩阵转换的类型?



1> warrenm..:

不推荐使用带有vector_matrix_前缀的类型,而推荐使用带有前缀的类型simd_,因此一般指导(float4以示例为例)为:

在C代码中,使用simd_float4类型。(除非您提供自己的前缀,否则必须包括前缀typedef,因为C没有命名空间。)

与Objective-C相同。

在C ++代码,使用simd::float4类型,它可以缩短到float4通过using namespace simd;

与Objective-C ++相同。

在Metal代码中,使用float4类型,因为它float4是Metal Shading Language [1]中的基本类型。

在Swift代码中,使用float4类型,因为simd_类型被别名化为较短的名称。

更新:在Swift 5中,float4不赞成使用相关类型,而赞成SIMD4和相关类型。

这些类型从根本上都是等效的,并且都具有相同的大小和对齐特征,因此您可以跨语言使用它们。实际上,这就是simd框架的设计目标之一。

由于您没有询问,我将把打包类型的讨论推迟到另一天。

[1] Metal是一种不寻常的情况,因为它float4在全局名称空间中定义,然后将其导入metal名称空间,该名称空间也作为simd名称空间导出。此外float4,它的别名为vector_float4。因此,您可以将以上任何名称用于此向量类型(除外simd_float4)。更喜欢float4


推荐阅读
author-avatar
手机用户2602938575
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有