swift - 使用 void* 访问 MTLBuffer 内容
问题描述
我正在尝试访问目标 C 中ARMeshGeometry缓冲区内容的内容。
到目前为止,我正在访问缓冲区的内容如下:
@interface ARMeshGeometry (miniExtension)
-(void) getVertices;
@end
@implementation ARMeshGeometry (miniExtension)
-(void) getVertices{
size_t stride = size_t(self.vertices.stride);
size_t offset = size_t(self.vertices.offset);
size_t offsetComponent = size_t(stride / self.vertices.componentsPerVector);
for(int i = self.vertices.count-1; i > -1 ; i--){
void* vBuffPointer = [self.vertices.buffer contents];
vBuffPointer = static_cast<float*>(vBuffPointer) + offset + stride * i;
float x = *static_cast<float*>(vBuffPointer);
vBuffPointer = static_cast<float*>(vBuffPointer) + offsetComponent;
float y = *static_cast<float*>(vBuffPointer);
vBuffPointer = static_cast<float*>(vBuffPointer) + offsetComponent;
float z = *static_cast<float*>(vBuffPointer);
}
}
@end
我在通过顶点时遇到内存访问错误,并且它似乎是随机的 - 或者当顶点数量大于 1500 时至少是随机的 - 。
我尝试使用Visualizing and Interacting with a Reconstructed Scene中提供的示例代码来做同样的事情:
// in Extensions.swift : extensions of the ARMeshGeometry
func seeAllVec(){
let index = 0;
for index in 0..<vertices.count {
let vertexPointer = vertices.buffer.contents().advanced(by: vertices.offset + (vertices.stride * Int(index)))
let vertex = vertexPointer.assumingMemoryBound(to: (Float, Float, Float).self).pointee
NSLog("vertex = %f, %f, %f", vertex.0, vertex.1, vertex.2);
}
}
它在 swift 中完美地工作,但在 Objective C 中却没有,我不知道为什么......
有什么帮助吗?
最好的,
磷
解决方案
推荐阅读
- python - 使用 Nginx + Gunicorn 提供的 Flask 应用程序上的无限页面重新加载
- tfsbuild - TFS 中的 CI 管道,用于一个管道中的两个不同项目
- javascript - 将文本附加到同一单元格后,表格单元格中的 Indesign 字形消失了
- c# - 等待 client.queryasync 耗时太长
- ruby-on-rails - 如何在开发模式下检测与 Active Record 的名称冲突错误
- python - 切片 PySpark DataFrame 中列的所有值
- python - 将python pandas数据框转换为数组
- c++ - 在 qt (c++) 中自定义按钮
- floating-point - 尾数有效位
- java - 我的 GUI 不适用于我的基于文本的冒险游戏,代码运行但我制作的选择按钮不起作用。为什么?Java 摇摆