我一直在使用Metal渲染多面体。当我尝试渲染一个二十面体实体时,会发生问题,使用newBufferWithBytes()来绘制其顶点仅包含1680字节大小的数据。然后整个应用程序停止运行,CPU和GPU框架均降为零,除了“金属”视图冻结之外,其他一切恢复正常。

在实现中,我有常规的多面体作为Node的子类。

class Node {
let name : String
var vertexBuffer: MTLBuffer?
var uniformBuffer: MTLBuffer?
var vertexCount : Int = 0

var device : MTLDevice

init(name: String, vertices: [Vertex], device: MTLDevice){
    self.name = name
    self.device = device

    var floatBuffer : [Float] = []
    for vertex in vertices {
        floatBuffer += vertex.floatBuffer
    }
    let floatBufferSize = floatBuffer.count * sizeof(Float)

    self.vertexBuffer = device.newBufferWithBytes(&floatBuffer, length: floatBufferSize, options: nil)
    self.vertexCount = floatBuffer.count
}

func render(commandEncoder: MTLRenderCommandEncoder, parentModelViewMatrix: Matrix4, projectionMatrix: Matrix4){
    commandEncoder.setVertexBuffer(self.vertexBuffer, offset: 0, atIndex: 0)

    // set up uniform transformation matrices
    var nodeModelMatrix = self.modelMatrix()
    nodeModelMatrix.multiplyLeft(parentModelViewMatrix)
    let matrixSize = sizeof(Float) * Matrix4.numberOfElements()
    uniformBuffer = device.newBufferWithLength(matrixSize * 2, options: .OptionCPUCacheModeDefault)
    var bufferPointer = uniformBuffer?.contents()
    memcpy(bufferPointer!, nodeModelMatrix.raw(), matrixSize)
    memcpy(bufferPointer! + matrixSize, projectionMatrix.raw(), matrixSize)
    commandEncoder.setVertexBuffer(self.uniformBuffer, offset: 0, atIndex: 1)

    // can draw
    commandEncoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: self.vertexCount, instanceCount: 1)
}
}

最佳答案

感谢Nehal女士的建议。我已经相应地修改了答案。

根据Apple文档:Metal Feature Set Tables,具有下面列出的硬件,最大MTLBuffer长度均为256 MB。

iOS 8和9上的Apple A7〜A9 GPU。

OS X 10.11:MacBook(2015年初),MacBook Air(2012年中或更高版本),MacBook Pro(2012年中或更高版本),Mac Mini(2012年或更高版本),iMac(2012年或更高版本)和Mac Pro(后期) 2013及更高版本)。

关于ios - newBufferWithBytes()是否有大小限制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30578202/

10-09 08:32