В точке, где вы хотите выполнить рендеринг на экран, вы получаете отрисовку из слоя, вызывая nextDrawable
.Вы получаете текстуру отрисовки из свойства texture
.Вы используете эту текстуру, чтобы установить цель рендеринга (цветное вложение) MTLRenderPassDescriptor
.Например:
id<CAMetalDrawable> drawable = layer.nextDrawable;
id<MTLTexture> texture = drawable.texture;
MTLRenderPassDescriptor *desc = [MTLRenderPassDescriptor renderPassDescriptor];
desc.colorAttachments[0].texture = texture;
Отсюда это очень похоже на то, что вы делаете в методе MTKView
drawRect:
.Вы создаете буфер команд (если у вас его еще нет), создаете кодировщик команд рендеринга с использованием дескриптора, кодируете команды рисования, заканчиваете кодирование, сообщаете буферу команд представить чертеж (используя метод -presentDrawable:...
) ипередайте командный буфер.То, что было нарисовано в текстуре рисованного объекта, будет отображаться на экране при его представлении.
Я согласен с Уорреном в том, что вы, вероятно, не хотите синхронизировать цикл с обновлением дисплея.Вы хотите параллелизма.Вы хотите, чтобы центральный процессор работал над следующим кадром, в то время как графический процессор отображает самый последний кадр (а на дисплее отображается последний кадр).
Тот факт, что количество доступных для рисования элементов может быть ограниченоПолет сразу, и что nextDrawable
заблокирует ожидание одного, предотвратит ваш цикл рендеринга слишком далеко вперед.(Вы, вероятно, будете использовать некоторую другую синхронизацию до этого, например, для управления небольшим пулом буферов.) Если вы хотите использовать только двойную буферизацию, а не тройную буферизацию, вы можете установить maximumDrawableCount
слоя вместо 2 вместо его значения по умолчанию.из 3.