2017-04-23 3 views
1

Est-il possible de modifier la taille de la mémoire tampon lors de l'exécution? Nous attribuons la taille de la mémoire tampon lors de l'enregistrement de notre device:langue d'ombrage - modifier la taille du tampon

device = MTLCreateSystemDefaultDevice() 
queue = device!.makeCommandQueue() 
     do { 
      let library = device!.newDefaultLibrary()! 
      let kernel = library.makeFunction(name: "compute")! 
      cps = try device!.makeComputePipelineState(function: kernel) 
     } catch let e { 
      Swift.print("\(e)") 
     } 
     paramBuffer = device!.makeBuffer(length: MemoryLayout<Float>.size*2, options: []) 

nous le mettre à jour en conséquence au moment de l'exécution:

override public func draw(_ dirtyRect: NSRect) { 
     super.draw(dirtyRect) 
     if let drawable = currentDrawable { 
      let command_buffer = queue.makeCommandBuffer() 
      let command_encoder = command_buffer.makeComputeCommandEncoder() 
      command_encoder.setComputePipelineState(cps) 
      command_encoder.setTexture(drawable.texture, at: 0) 
      command_encoder.setBuffer(paramBuffer, offset: 0, at: 0) 

Il fonctionne pour l'instant. Mais que faire si j'ai un scénario qui, ont des particules, à différents états ont des comptes différents. Par exemple, au début, j'ai 500 particules, Après un certain temps, les particules augmentent lentement de 10 à la fois, disons 510, 520, 530, ...

Comment dois-je aborder ce scénario? dois-je refaire le queue chaque fois qu'il ya un changement sur les comptes de particules ?:

queue = device!.makeCommandQueue() 
      do { 
       let library = device!.newDefaultLibrary()! 
       let kernel = library.makeFunction(name: "compute")! 
       cps = try device!.makeComputePipelineState(function: kernel) 
      } catch let e { 
       Swift.print("\(e)") 
      } 
      paramBuffer = device!.makeBuffer(length: MemoryLayout<Float>.size*particleCount, options: [])//<--particleCount 

Ou une meilleure façon de le faire?

Répondre

2

Non, vous ne pouvez pas modifier la taille d'un tampon après sa création. Pourquoi pensez-vous avoir besoin d'une nouvelle file d'attente de commandes chaque fois que vous pensez avoir besoin d'une nouvelle file d'attente de commandes? La file d'attente de commandes n'est pas liée à la taille de la mémoire tampon.

La seule chose que vous auriez à recréer est le tampon lui-même.

Cependant, s'il existe une limite supérieure du nombre de particules, vous pouvez simplement créer le tampon à cette taille maximale depuis le début. Il n'y a aucune exigence que le tampon soit exactement aussi gros que nécessaire actuellement. Il peut être plus grand que nécessaire, même si une partie de celui-ci est temporairement gaspillée. Sinon, si vous voulez le réaffecter au fur et à mesure que le nombre de particules augmente, je ne le réattribuerais pas nécessairement à la taille requise. Au lieu de cela, je arrondir la taille actuellement requise à un multiple de la taille de la page (4096 octets). De cette façon, vous avez un peu de mou. Le nombre de particules peut augmenter pendant un certain temps sans nécessiter de réaffectation du tampon.