Swift 3中的SCNGeometryElement设置

莫里·马克维兹(Maury Markowitz)

我忍无可忍,开始将我的应用程序转换为Swift3。与往常一样,转换器有很多不足之处。在这种情况下,我不确定如何正确编码新版本。这是原始文件:

let indexes : [CInt] = [0,1,2,3]
let dat  = NSData(bytes: indexes, length: sizeofValue(indexes))
let ele = SCNGeometryElement(data:dat, primitiveType: .Triangles, primitiveCount: 2, bytesPerIndex: sizeof(Int))

运行转换并编写新的sizeof(谢谢)后,我得到了以下结果:

let indexes : [CInt] = [0,1,2,3]
let dat  = Data(bytes: UnsafePointer<UInt8>(indexes), count: sizeof(indexes))
let ele = SCNGeometryElement(data:dat, primitiveType: .triangles, primitiveCount: 2, bytesPerIndex: MemoryLayout<Int>.size)

但是,这给了我(Data(bytes:length:)通话中):

'init'不可用:使用'withMemoryRebound(to:capacity:_)'临时将内存视为另一种布局兼容类型。

我在这里查看了几个线程,并阅读了涵盖此内容的发行说明,但我仍然对应该在此处执行的操作感到困惑。

rick

您已解决了一个问题,sizeof但没有解决另一个问题,并且正在创建不需要这样的新指针-可以将任何数组(给定的元素类型正确)传递给采用C样式指针的API。然后直接为您的代码修复:

let indexes: [CInt] = [0,1,2,3]
let dat = Data(bytes: indexes, count: MemoryLayout<CInt>.size * indexes.count)
let ele = SCNGeometryElement(data:dat, primitiveType: .triangles, primitiveCount: 2, bytesPerIndex: MemoryLayout<CInt>.size)

(另请注意使MemoryLayout它们与描述的数据保持一致的修复程序。)

但是,除非您对多余的Data对象有某种需求,对指针的乐趣或描述元素的特殊性,否则可以使用以下简单形式:

let indices: [UInt8] = [0,1,2,3] 
let element = SCNGeometryElement(indices: indices, primitiveType: .triangles)

这个通用的初始化程序会自动管理传入的内存,推断数组的数量,并primitiveCount根据数组的数量和primitiveType您指定的数量推断

(请注意,四个索引组成的数组对于来说是一个不寻常的数字.triangles;或者您有一个三角形和一个未使用的索引,或者实际上是一个.triangleStrip包含两个基元的对象。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章