- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在 GPU 上处理后,我需要从 MTLBuffer
读取数据。到目前为止,我已经尝试了以下代码,但它总是因 EXC_BAD_ACCESS
错误代码而崩溃。
struct gauss_model {
var mean : [Float32] = [0.0, 0.0, 0.0];
var covMat : [[Float32]] = [[0.0, 0.0, 0.0],[0.0, 0.0, 0.0],[0.0, 0.0, 0.0]];
var invCovMat : [[Float32]] = [[0.0, 0.0, 0.0],[0.0, 0.0, 0.0],[0.0, 0.0, 0.0]];
var samples : Int32 = 0;
}
self.gaussModels = [gauss_model](count: Int(10), repeatedValue: gauss_model())
self.modelsBuffer = self.device.newBufferWithBytes(self.gaussModels, length: self.gaussModels.count * sizeof(gauss_model), options: MTLResourceOptions.OptionCPUCacheModeDefault)
commandEncoder.setBuffer(self.modelsBuffer, offset: 0, atIndex: 0)
// execute GPU code
var model = unsafeBitCast(self.modelsBuffer.contents(), UnsafeMutablePointer<gauss_model>.self)
NSLog("%@", model.memory.mean) // crashes on this statement
我也尝试过不同的获取值(value)的方法,比如
var model = UnsafeMutablePointer<gauss_model>(self.modelsBuffer.contents())
// iterate over models with model.memory and model.successor()
或
var model = UnsafeMutablePointer<[gauss_model]>(self.modelBuffer.contents())
let models : [gauss_model] = model.memory
但它们都不起作用。甚至有办法做到这一点吗?
最佳答案
我已经设法解决了这个问题。问题在于我对 Swift 中的内存管理的错误假设以及函数 newBufferWithBytes
仅执行浅拷贝的事实。调用该函数仅将指针复制到 mean
、covMat
和 invCovMat
数组以及 self.modelBuffer.contents()
包含指向未初始化内存的指针。访问内存导致崩溃。
关于ios - 在 Swift 中从 MTLBuffer 中读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27708228/
我希望能够定义一个 MTLBuffer 并将数据直接填充到缓冲区(或尽可能高效)。 如果我执行以下操作,着色器中使用的值是 1.0 和 2.0(分别用于 X 和 Y),而不是在创建 MTLBuffer
我通过此调用从缓冲区渲染点片段: renderEncoder.drawPrimitives(type: .point, vertexStart
我正在用 float2 向量填充 MTLBuffer。正在创建和填充缓冲区,如下所示: struct Particle { var position: float2 ... } let p
我创建了一个由浮点值数组填充的缓冲区。不幸的是,当我尝试查询其 contents() 属性时(当我试图调试问题时),我得到了 EXC_BAD_ACCESS。这是代码: let inputData =
当尝试使用 Metal 从内存中快速将像素缓冲区绘制到屏幕时,我们使用 MTLDevice.makeBuffer(bytesNoCopy:..) 创建 MTLBuffer 对象以允许GPU 直接从内存
我知道如何创建 MTLBuffer 和/或 MTLTexture,但是当不再需要这些资源时如何释放 GPU 内存? 最佳答案 MTLBuffer 和 MTLTexture 是 Objective-C
我将计算着色器的结果存储在 MTLBuffer 中。 MTLBuffer 的每个元素都是一个 UInt16。我试图将结果传递给片段着色器,该着色器通过将 MTLBuffer 的元素解释为 0 到 25
我们正在处理隔行扫描高清视频。我用于渲染的 Metal 颜色附件具有一个字段的尺寸 (1920*540 RGBA)。当我尝试将两个渲染字段复制到大小为 1920*1080*4 = 8294400 字节
我很困惑,因为我在 Swift 4 中创建了一个 MTLBuffer,但我无法使用 didModifyRange 方法。 有趣的是,我仍然可以在 Apple 文档中找到它,并且还没有听说过它被更改了。
如何向MTLBuffer追加数据? 我有以下数据集: var verticesArray:Array = [ A,B,C ,D,E,F ] 然
我正在使用 id vertexBuf = [device newBufferWithLength:count * sizeof(float) options:0]; 如何释放 vertexBuf 内存
我正在尝试在 GPU 上实现高动态范围算法,我需要为其计算直方图。到目前为止, Metal 代码看起来像这样: kernel void hist(texture2d_array inArray [[t
我需要帮助来替换 MTLBuffer 的内容而不创建新内容。两种情况下的内容都是 float 组。 let vector:[Float] = [0,1,2,3,4,5,6,7,8,9] let b
在 GPU 上处理后,我需要从 MTLBuffer 读取数据。到目前为止,我已经尝试了以下代码,但它总是因 EXC_BAD_ACCESS 错误代码而崩溃。 struct gauss_model {
我正在编写一个跨平台引擎来进行渲染。我正在尝试创建一个跨平台结构,该结构本质上管理一种绘制的几何体。 目标是有一个 c++ 类将 void* 保存到分配给缓冲区的内存块,然后将该指针传递到 MTLBu
我刚刚开始使用 Metal,在掌握一些基本的东西时遇到了困难。我一直在阅读大量关于 Metal 的网页,并研究了 Apple 的示例等等,但我的理解仍然存在差距。我认为我的主要困惑点是:处理顶点缓冲区
中心刊 我在一个渲染命令编码器中有两个渲染管道。第一个管道写入在第二个管道中使用的缓冲区。这似乎不起作用,我希望这是一个同步问题。当我为每个渲染管道使用一个单独的渲染命令编码器时,我得到了想要的结果。
我正在用 float2 向量填充 MTLBuffer。正在创建和填充缓冲区,如下所示: struct Particle { var position: float2 ... } let p
作为 this answer 的后续问题.我正在尝试用 Metal 中的内核函数替换在 CPU 上运行的 for 循环,以并行计算并提高性能。 我的函数基本上是一个卷积。由于我反复收到输入数组值的新数
我正在将统一缓冲区传递给顶点着色器和片段着色器。 let uniformBuffer = device.makeBuffer(length: 4096, options: []) renderEnco
我是一名优秀的程序员,十分优秀!