Rust 对用于Objective-C运行时的SIMD类型和函数进行编码的正确方法是什么?
我正在用Objective-C以外的语言开发一个应用程序,我遇到了。它使用来自SIMD API的Rust 对用于Objective-C运行时的SIMD类型和函数进行编码的正确方法是什么?,rust,simd,metal,objective-c-runtime,metalkit,Rust,Simd,Metal,Objective C Runtime,Metalkit,我正在用Objective-C以外的语言开发一个应用程序,我遇到了。它使用来自SIMD API的vector\u float3类型 由于vector\u float3类型,我无法对该函数进行编码 我发现;这里的问题是,如果@encode未对SIMD类型进行编码,则无法为使用SIMD类型的函数创建正确的形式,然后消息发送验证失败。如何在消息发送验证中绕过此编码问题?作为一个实验,我请求使用以下方法为+newBoxWithDimensions:segments:geometryType:inward
vector\u float3
类型
由于vector\u float3
类型,我无法对该函数进行编码
我发现;这里的问题是,如果
@encode
未对SIMD类型进行编码,则无法为使用SIMD类型的函数创建正确的形式,然后消息发送验证失败。如何在消息发送验证中绕过此编码问题?作为一个实验,我请求使用以下方法为+newBoxWithDimensions:segments:geometryType:inwardNormals:allocator:
签名:
NSMethodSignature* sig = [MDLMesh methodSignatureForSelector:@selector(newBoxWithDimensions:segments:geometryType:inwardNormals:allocator:)];
然后我列举了它的参数及其类型编码。事实证明,签名只是跳过了两个向量参数。它总共显示了5个参数,其中包括隐式self
和\u cmd
参数,而这些参数应该有7个。编码为“@”,““:”,“q”,“c”,“@”,前两个对应于self
和\u cmd
,后三个与方法的最后三个参数匹配
我认为最安全的方法是编写一个Objective-C模块,该模块导出一个包装此方法的函数,但向量分量是分开传递的(即,维度的三个float
参数和分段的三个unsigned int
参数)。它将从这些单独的参数构造向量参数,并调用class方法,返回其结果。解决生锈问题
对于那些使用Rust并有相同问题的人,我找到了绕过错误的解决方法,但请记住问题仍然存在,我的解决方案将使开发人员在调试过程中盲目
- 如果您使用的是objc板条箱,请尝试从板条箱中删除
功能,否则不要执行消息验证verify_message
- 对向量数据使用
表示法,并将数据放入消息中,无需任何编码simd
- 在这种情况下,您在开发过程中是盲目的,我建议的一种方法是将调试引入Xcode(这也不太好!)
我认为你最安全的方法…
这正是我不喜欢的。我只接受这一点,因为那个编码建议,我认为这是正确的,我很快会测试它。嗯,那不是一个建议。我认为Objective-C运行时无法处理向量参数,因此失败了(正如您所发现的)。我打算证实这一点。我不知道。它能处理返回带有给定C签名的函数指针的API吗?您可以调用[MDLMesh methodForSelector:@selector(newBox…)
,然后将结果视为MDLMesh*(*)(id,SEL,vector\u float3,vector\u uint3,MDLGeometryType,BOOL,id)
。