SKRenderer - 神秘课程

zzy*_*yzy 5 scenekit sprite-kit skscene metal

在观看了WWDC2017的会话609视频后,我开始大肆宣传从SpriteKit中取出屏幕外的金属纹理.

这是一年多前了!

然而,绝对没有概述文档SKRenderer,也没有示例代码. https://developer.apple.com/documentation/spritekit/skrenderer

我发现这确实很奇怪. 这里有没有人对这个类,它的文档或示例代码有任何见解?

顺便说一句,同样的道理SKTransformNode.

war*_*enm 12

基本用法SKRenderer非常简单,但有一些奇怪之处使它在实践中有点古怪.

首先是基本面.要实例化渲染器,请使用该rendererWithDevice:方法.此方法采用a id<MTLDevice>,例如系统默认设备.原谅Objective-C; 这将很容易转换为Swift:

SKRenderer *renderer = [SKRenderer rendererWithDevice:mtlDevice];
Run Code Online (Sandbox Code Playgroud)

要告诉渲染器要绘制什么,我们将它与先前创建的场景相关联:

renderer.scene = (SKScene *)scene;
Run Code Online (Sandbox Code Playgroud)

如果要运行操作,则需要手动取消暂停场景,这通常是SKView在呈现场景时完成的:

scene.paused = NO;
Run Code Online (Sandbox Code Playgroud)

要实际绘制场景,我们需要提供命令缓冲区和渲染传递描述符.假设您正在使用a MTKView来处理运行显示链接计时器并管理a CAMetalLayer,您可以编写这样的委托方法,它通过渲染器更新场景的时间(和动作),然后绘制到MTKView可绘制的:

- (void)drawInMTKView:(nonnull MTKView *)view {
    MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;
    if (renderPassDescriptor == nil) {
        return;
    }

    [self.renderer updateAtTime:CACurrentMediaTime()];

    id<MTLCommandBuffer> commandBuffer = [self.commandQueue commandBuffer];
    CGRect viewport = CGRectMake(0, 0, view.drawableSize.width, view.drawableSize.height);
    [self.renderer renderWithViewport:viewport
                        commandBuffer:commandBuffer
                 renderPassDescriptor:renderPassDescriptor];

    // TODO: Add any additional Metal rendering here

    [commandBuffer presentDrawable:view.currentDrawable];
    [commandBuffer commit];
}
Run Code Online (Sandbox Code Playgroud)

请记住,在设置MTKViewframebufferOnly属性NO,如果你使用这种技术.

如果要将屏幕外渲染为您创建的纹理,则需要进行更多手动工作,但所涉及的概念是相同的.您可以通过创建其他渲染传递描述符/编码器来编码渲染到相同纹理的单独传递; 只需记住设置loadAction主要颜色附件,MTLLoadActionLoad以保持跨越过程的纹理内容.

您还可以使用renderWithViewport:renderCommandEncoder:renderPassDescriptor:commandQueue:它将所有绘图合并为一个通道.

一些警告:

  • 据我所知,该viewport参数被忽略.
  • 如果您希望SKScene接收NSResponder操作,则需要手动转发它们或将场景插入响应器链.这尤其适用于关键事件,其中场景(或负责转发给它的对象)需要是第一响应者.
  • 当场景没有呈现时,用于转换触摸或鼠标事件位置的便利方法都不起作用SKView; 你需要做一些手动翻译.