MTKView обновляет буфер кадров без очистки предыдущего содержимого - PullRequest
3 голосов
/ 30 марта 2019

Я работаю над программой рисования, в которой я рисую интерактивные штрихи через MTKView.Если я задаю для параметра loadAction renderPassDescriptor значение «clear»:

renderPassDescriptor?.colorAttachments[0].loadAction = .clear

В буфере кадров, как и ожидалось, отображается самое последнее содержимое renderCommandEncoder?.drawPrimitives, в данном случае это передний край мазка кисти.

Если я установлю loadAction в 'load':

renderPassDescriptor?.colorAttachments[0].loadAction = .load 

Буфер кадров мигает как сумасшедший и показывает пятнистый след того, что я только что нарисовал.Теперь я понимаю, что перепрошивка, вероятно, вызвана тройной буферизацией MTKView по умолчанию.Таким образом, каждый раз, когда я пишу в currentDrawable, я, вероятно, пишу в один из 3 циклических буферов.Пожалуйста, поправьте меня, если я ошибаюсь.

Мой вопрос: что мне нужно сделать, чтобы нарисовать чистый мазок без мигания буфера кадра, как сейчас?Другими словами, есть ли способ иметь главный буфер, который обновляется с последним содержимым commandEncoder?

1 Ответ

2 голосов
/ 31 марта 2019

Вы можете использовать собственную текстуру в качестве цветового вложения прохода рендеринга. Вам не нужно использовать текстуру отрисовки. Таким образом, вы можете использовать действие .load без всякого мусора, странных перепрошивок или чего-либо еще. Вы будете иметь полный контроль над тем, с какой текстурой вы рендеритесь, и каково ее содержимое.

После рендеринга в эту текстуру для прохода рендеринга вам необходимо добавить ее в текстуру рисованного объекта для отображения.

Основным осложнением здесь является то, что у вас не будет преимуществ двойной или тройной буферизации. Вы потеряете определенное количество производительности, поскольку все должно быть синхронизировано с состоянием этой текстуры. Я подозреваю, однако, что вам не нужно так много производительности, поскольку она интерактивна и должна идти в ногу со скоростью человека.

...