MTLCommandBuffer

Horus-iOS·2022년 7월 7일
0

https://developer.apple.com/documentation/metal/mtlcommandbuffer

A container that stores encoded commands for the GPU to execute.

GPU가 수행할 인코딩된 커맨드를 저장하는 컨테이너입니다.

Declaration

protocol MTLCommandBuffer

Overview

이 프로토콜을 직접 구현하지 않아야 합니다. 대신 MTLCommandQueue 객체의 makeCommandBuffer() 메소드를 호출해서 커맨드 버퍼 객체를 생성해야 합니다. 커맨드 버퍼는 생성된 명령 큐에서만 수행에 대한 커밋이 될 수 있습니다. 단일 커맨드 큐에 보내진 모든 커맨드 버퍼는 커맨드 버퍼에 인큐된 순서로 수행되는 것이 보장됩니다.

커맨드 버퍼를 생성한 후 버퍼를 커맨드로 채우기 위해 인코더 객체를 생성해야 합니다. MTLCommandBuffer 프로토콜은 구체적인 커맨드 인코더 타입을 생성하기 위한 메소드들을 갖고 있으며, MTLRenderCommandEncoder, MTLComputeCommandEncoder, MTLBlitCommandEncoder, MTLParallelRenderCommandEncoder가 있스니다. 어떤 주어진 시점이더라도 오직 특정 커맨드 버퍼를 위한 하나의 인코더만 활성화될 것입니다. 인코더를 생성하고 버퍼에 대한 커맨드를 추가하는 데 인코더를 사용한 후 인코딩 프로세스를 마무리지어야 합니다. 인코더를 사용해서 완료한 뒤 다른 인코더를 생성할 수 있ㅇ며, 같은 버퍼에 커맨드 추가를 계속할 수 있습니다. 인코딩된 커맨드의 집합을 수행할 준비가 되어 있다면, 커맨드 버퍼의 commit() 메소드를 호출해서 버퍼 수행에 대한 스케줄링될 수 있도록 해야 합니다.

커맨드 버퍼가 수행에 대한 커밋이 된 후에 커맨드 버퍼에 대해서 유효한 작업들만 스케줄되기 위해 대기하게 되고, 혹은 완료(동기 호출 혹은 핸들러 블록을 사용하는)되거나 커맨드 버퍼 수행의 상태를 확인하기 위해 대기하게 됩니다. 사용될 때에는 스케줄링된, 그리고 완료된 핸들러들은 수행 순서로 호출된 블록들입니다. 이와 같은 핸들러들은 빠르게 수행되어야 합니다. 만약 비용이 들거나 혹은 블로킹 작업이 스케줄되길 원한다면 해당 작업을 다른 스레드로 지연시켜야 합니다.

멀티스레드 앱에서 전체 작업을 하위작업으로 쪼개서 독립적으로 인코딩될 수 있도록 하는 것을 권장합니다. 작업의 각 덩어리에 대한 커맨드 버퍼를 생성한 후 수행 순서를 만들어내기 위해 커맨드 버퍼 객체들에 enqueue() 메소드를 호출해야 합니다. 각각의 버퍼 객체(다중 스레드를 사용하고 있는)를 채우고 커밋해야 합니다. 커맨드 큐는 사용 가능한 상태가 될 수 있도록 커맨드 버퍼를 자동으로 스케줄링하교 수행합니다.

0개의 댓글