Имея два разных (не перекрывающих друг друга) 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];
}