对用于 Objective-C 运行时的 SIMD 类型和函数进行编码的正确方法是啥?
Posted
技术标签:
【中文标题】对用于 Objective-C 运行时的 SIMD 类型和函数进行编码的正确方法是啥?【英文标题】:What is the proper way to encode SIMD types and functions that use them for the Objective-C Runtime?对用于 Objective-C 运行时的 SIMD 类型和函数进行编码的正确方法是什么? 【发布时间】:2017-06-16 20:59:21 【问题描述】:我正在用 Objective-C 以外的语言开发应用程序,我遇到了newBoxWithDimensions
。它使用来自 SIMD API 的 vector_float3
类型。
由于vector_float3
类型,我无法对该函数进行编码。
我找到了Why can't gcc or clang properly @encode SIMD vector types?;这里的问题是当@encode
没有对 SIMD 类型进行编码时,它无法为那些使用 SIMD 类型的函数创建适当的形式,然后消息发送验证失败。消息发送验证如何绕过这个编码问题?
【问题讨论】:
您能否重新表述您的问题,以便清楚您遇到了什么问题? @E_net4 和 Shepmaster 我的问题仍然是正确的,因为问题仍然存在,我只是绕过它。必须有某种方法来克服这个问题,我认为其他语言正在以某种方式管理它。如果我有时间,我会看看他们。如果我在那里找到我的答案,是的,我当然会在下面发布我自己的答案! 我知道问题标题有点笼统,但对于遇到同样问题的人来说,这可能是一个很好的起点,我认为这是他们脑海中的第一件事。也许问题正文需要稍作修改。 【参考方案1】:作为一个实验,我请求+newBoxWithDimensions:segments:geometryType:inwardNormals:allocator:
的方法签名,使用:
NSMethodSignature* sig = [MDLMesh methodSignatureForSelector:@selector(newBoxWithDimensions:segments:geometryType:inwardNormals:allocator:)];
然后我列举了它的参数和它们的类型编码。事实证明,签名只是跳过了两个向量参数。一共显示了5个参数,包括隐含的self
和_cmd
参数,应该有7个。编码是“@”,“:”,“q”,“c”,“@”,前两个对应self
和_cmd
,后三个匹配方法的最后三个参数。
我认为您最安全的方法是编写一个 Objective-C 模块,该模块导出一个包装此方法的函数,但向量组件是单独传递的(即三个 float
参数用于维度,三个 unsigned int
参数用于段)。它将从这些单独的参数构造向量参数并调用类方法,返回其结果。
【讨论】:
I think your safest approach ...
这正是我不喜欢的。
我只接受这个编码建议,我认为这是正确的,我很快就会测试它。
嗯,这不是建议。我认为 Objective-C 运行时无法处理向量参数并崩溃(如您所见)。我打算确认一下。我不知道锈。它能否处理返回具有给定 C 签名的函数指针的 API?您可以调用[MDLMesh methodForSelector:@selector(newBox...)]
,然后将结果视为MDLMesh *(*)(id, SEL, vector_float3, vector_uint3, MDLGeometryType, BOOL, id<MDLMeshBufferAllocator>)
。【参考方案2】:
Rust 的变通解决方案
对于那些使用 Rust 并遇到同样问题的人,我找到了绕过错误的解决方法,但请记住,问题仍然存在,我的解决方案会使开发人员在调试过程中盲目。
如果您使用的是 objc crate,请尝试从您的 crate 中删除verify_message
功能,否则不要进行消息验证。
使用simd
表示您的矢量数据并将您的数据放入您的消息中,无需任何编码。
在这种情况下,您在开发过程中非常盲目,我建议的一种方法是将您的调试带入 Xcode(这也不好!)。
【讨论】:
以上是关于对用于 Objective-C 运行时的 SIMD 类型和函数进行编码的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章