我一直使用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)
}
}
答案 0 :(得分:2)
感谢Nehal女士的建议。我已相应地修改了答案。
根据Apple文档:Metal Feature Set Tables,使用下面列出的硬件,最大MTL缓冲区长度均为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版专业(2013年末及更新)。答案 1 :(得分:2)
金属功能集表不再声明最大MTLBuffer长度。
从iOS 12和macOS 10.14开始,maxBufferLength
上有一个MTLDevice
属性,创建更大的缓冲区时应该检查它。
如果您只是在Google上搜索,并且需要一个数字来评估某种方法的可行性而无需编写任何代码,那么这就是它给我的数字。
- iPad Pro (12.9", 2nd generation) iOS 13.3 - 993 MB (1041235968 bytes)
- iPhone 11 iOS 13.3 - 960 MB (1007468544 bytes)
- iPhone 8 iOS 12.4 - 747 MB (783597568 bytes)
- iPhone 6 iOS 12.1 - 256 MB (268435456 bytes)
这些似乎在应用程序启动和系统重新启动时保持不变。 当然,它们可能会改变,但是它们给您一个想法。可以肯定地说,您总是可以至少获得256MB。