2015-06-01 4 views
0

Я получаю полиэдр с использованием металла. Проблема возникает, когда я пытался отобразить объект икосаэдра, вершины которого состоят только из 1680 байтов данных в размере, используя newBufferWithBytes(). Затем все приложение приостанавливается, и процессор, и графический процессор опускаются до нуля, и все возвращается к нормальному состоянию, за исключением того, что зависает металл.Есть ли ограничение по размеру для newBufferWithBytes()?

У меня есть регулярные многогранники как подклассы 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) 
} 
} 

ответ

1

Спасибо за предложение г-жи Нехал. Я соответствующим образом изменил ответ.

Согласно Apple Документация: Metal Feature Set Tables, с перечисленными ниже аппаратными средствами, максимальная длина MTLBuffer составляет 256 МБ.

компании Apple A7 ~ A9 GPU на прошивкой 8 и 9.

OS X 10,11: MacBook (начало 2015), MacBook Air (середина 2012 или новее), MacBook Pro (середина 2012 или более поздней версии), Mac Mini (конец 2012 года или новее), iMac (конец 2012 года или новее) и Mac Pro (конец 2013 года и новее).

+1

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменяется – Nehal

Смежные вопросы