【发布时间】:2019-03-28 09:57:33
【问题描述】:
有 两个 不同(不相互重叠)MtkViews 正常运行。每个都有不同的统一、顶点和不同的原始类型。已经使用一个 RenderCommandEncoder 将两个视图中的一个组合成不同的管道渲染。工作正常。
为了降低对 iOS 设备的能源影响,我减少了每个视图上的 mtkview.preferredFramesPerSecond = 24;。
有没有办法在 GPU 上并行处理它们,这样它们就不会相互累加渲染?
假设我必须使用
id<MTLParallelRenderCommandEncoder> renderEncoder =
[commandBuffer parallelRenderCommandEncoderWithDescriptor:renderPassDescriptor];
但是这个编码器确实不知道...
[renderEncoder setViewport:(MTLViewport){0.0, 0.0, _viewportSize.x, _viewportSize.y, -1.0, 1.0 }];
...我当然使用普通的 RenderCommandEncoder。
那么如何正确设置MTLParallelRenderCommandEncoder
- (void)drawInMTKView:(nonnull MTKView *)view {
id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
//commandBuffer.label = @"CombiCommand";
MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;
if(renderPassDescriptor != nil) {
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(0,0,0,0);
id<MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
//renderEncoder.label = @"CombiRenderEncoder";
[renderEncoder setViewport:(MTLViewport){0.0, 0.0, _viewportSize.x, _viewportSize.y, -1.0, 1.0 }];
//----CHART----
[renderEncoder setRenderPipelineState:_chartPipelineState];
if (_pat->infoCC.needsDisplay ) {
[CCChartMetalRenderer changeChartDataWithBuffer:_chartVertexBuffer];
_chartUniform.statisch = somedata.isStatic;
_pat->infoCC.needsDisplay=false;
}
[renderEncoder setVertexBytes:&_viewportSize length:sizeof(_viewportSize) atIndex:IndexViewportSize];
[renderEncoder setVertexBytes:&_chartUniform length:sizeof(_chartUniform) atIndex:IndexUniforms];
[renderEncoder setVertexBuffer:_chartVertexBuffer offset:0 atIndex:IndexVertices];
[renderEncoder drawPrimitives:MTLPrimitiveTypeLineStrip vertexStart:0 vertexCount:_chartVerticesCount];
//----NOTE----
[renderEncoder setRenderPipelineState:_notePipelineState];
if (_pat->infoNotePatch.needsDisplay ) {
[NoteMetalRenderer changeVertexDataWithMtlBuffer:_noteVertexBuffer];
_noteUniform.color = simd_make_float4(1.0, 0.0, 1.0, 1.0);
_noteUniform.isOn = somedata.isOn;
_pat->infoNotePatch.needsDisplay=false;
}
[renderEncoder setVertexBytes:&_viewportSize length:sizeof(_viewportSize) atIndex:IndexViewportSize];
[renderEncoder setVertexBytes:&_noteUniform length:sizeof(_noteUniform) atIndex:IndexUniforms];
[renderEncoder setVertexBuffer:_noteVertexBuffer offset:0 atIndex:IndexVertices];
[renderEncoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:_notesCount * sizeof(NoteVertex)];
//----POS----
[renderEncoder setRenderPipelineState:_posPipelineState];
_posUniform.statischValue = somedata.value;
_posUniform.statisch = somedata.isStatic;
[renderEncoder setVertexBytes:&_viewportSize length:sizeof(_viewportSize) atIndex:IndexViewportSize];
[renderEncoder setVertexBytes:&_posUniform length:sizeof(_posUniform) atIndex:IndexUniforms];
[renderEncoder drawPrimitives:MTLPrimitiveTypeLine vertexStart:0 vertexCount:16];
//---ENDENCODIG---
[renderEncoder endEncoding];
[commandBuffer presentDrawable:view.currentDrawable];
}
[commandBuffer commit];
}
和第二个 mtkView
- (void)drawInMTKView:(nonnull MTKView *)view {
id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
//commandBuffer.label = @"CCTableCommand";
MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;
if(renderPassDescriptor != nil) {
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(0,0,0,0);
id<MTLRenderCommandEncoder> renderEncoder =
[commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
//renderEncoder.label = @"CCTableRenderEncoder";
[renderEncoder setViewport:(MTLViewport){0.0, 0.0, _viewportSize.x, _viewportSize.y, -1.0, 1.0 }];
[renderEncoder setRenderPipelineState:_pipelineState];
[self.class changeVertexDataWithPatch:_pat Ch:_viewCH Quantize:_quantized mtlBuffer:_vertexBuffer];
_tableUniform.isOn = somedata.isOn;
[renderEncoder setVertexBytes:&_viewportSize length:sizeof(_viewportSize) atIndex:IndexViewportSize];
[renderEncoder setVertexBytes:&_tableUniform length:sizeof(_tableUniform) atIndex:IndexUniforms];
[renderEncoder setVertexBuffer:_vertexBuffer offset:0 atIndex:IndexVertices];
[renderEncoder drawPrimitives:MTLPrimitiveTypeTriangle vertexStart:0 vertexCount:_numVertices];
[renderEncoder endEncoding];
[commandBuffer presentDrawable:view.currentDrawable];
}
[commandBuffer commit];
}
【问题讨论】:
标签: ios objective-c metal metalkit