gpt4 book ai didi

ios - newBufferWithBytes() 有大小限制吗?

转载 作者:行者123 更新时间:2023-11-28 05:27:30 25 4
gpt4 key购买 nike

我一直在使用 Metal 渲染多面体。当我尝试使用 newBufferWithBytes() 渲染一个二十面体实体时,该实体的顶点仅包含大小为 1680 字节的数据时发生了问题。然后整个应用停止,CPU 和 GPU 帧都降为零,一切恢复正常,除了 Metal View 卡住。

我在实现中将正多面体作为 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)
}
}

最佳答案

Metal Feature Set Tables 不再声明最大 MTLBuffer 长度。从 iOS 12 和 macOS 10.14 开始,MTLDevice 上有一个 maxBufferLength 属性,您应该在创建更大的缓冲区时检查它。

如果您只是用谷歌搜索这个并且需要一个数字来评估某些方法的可行性而无需编写任何代码,那么这里是它给我的数字。

 - 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 可能是安全的。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com