4

現在、Metal アプリで視覚的なポップ音を追跡していますが、バックバッファではなく、フレームバッファに直接描画しているためだと考えています。

  // this is when I've finished passing commands to the render buffer and issue the draw command.  I believe this sends all the images directly to the framebuffer instead of using a backbuffer
  [renderEncoder endEncoding];
  [mtlCommandBuffer presentDrawable:frameDrawable];
  [mtlCommandBuffer commit];
  [mtlCommandBuffer release];
  //[frameDrawable present];   // This line isn't needed (and I believe is performed by presentDrawable

後で何度かグーグルで検索しましたが、金属のバックバッファに関するドキュメントは見つかりませんでした。自分でロールバックできることはわかっていますが、メタルがバック バッファーをサポートしていないなんて信じられません。

CAMetalLayer オブジェクトをどのようにセットアップしたかを示すコード スニペットを次に示します。

+ (id)layerClass
{
    return [CAMetalLayer class];
}

- (void)initCommon
{
    self.opaque          = YES;
    self.backgroundColor = nil;
    ...
}

-(id <CAMetalDrawable>)getMetalLayer
{
    id <CAMetalDrawable> frameDrawable;
    while (!frameDrawable && !frameDrawable.texture)
    {
        frameDrawable = [self->_metalLayer nextDrawable];
    }
    return frameDrawable;
}

CAMetalLayer オブジェクトでバックバッファを有効にすることはできますか? それとも独自にロールバックする必要がありますか?

4

1 に答える 1

9

back -bufferとは、対応するフロントバッファーが表示されている間にレンダリングされるレンダーバッファーを意味すると思いますか?

Metal では、概念は から抽出したドローアブルによって提供されますCAMetalLayer。インスタンスはドローアブルのCAMetalLayer小さなプール (通常は 3 つ) を維持し、 を呼び出すたびにプールからそれらの 1 つを取得し、呼び出し後、レンダリングが完了するとnextDrawableプールに戻します(しばらく時間がかかる場合があります)。 presentDrawableGPU は CPU とは非同期で実行されるため)。

事実上、各フレーム ループで、 を呼び出してバック バッファーを取得し、を呼び出してコミットすることでフロント バッファーnextDrawableになる資格を与えます。presentDrawable:MTLCommandBuffer

プールにはドローアブルが 3 つしかないため、呼び出し時に適切な CPU リソースの同期を追加し、nextDrawableレンダリングが完了したら取得するコールバックで、このライフサイクルを自分で管理する必要があります (MTLCommandBuffer addCompletedHandler:コールバック セットに従って)。上)。

通常dispatch_semaphore_t、これには a を使用します。

_resource_semaphore = dispatch_semaphore_create(3);

次に、呼び出す直前に次を配置しますnextDrawable

dispatch_semaphore_wait(_resource_semaphore, DISPATCH_TIME_FOREVER);

そして、これをaddCompletedHandler:コールバック ハンドラで:

dispatch_semaphore_signal(_resource_semaphore);

Apple のシンプルな Metal サンプル アプリのいくつかを見て、これが実際に行われていることを確認してください。これに関するAppleのドキュメントに関してはあまりありません。

于 2015-08-14T18:36:45.853 に答える