gpt4 book ai didi

sprite-kit - SKRenderer——神秘类

转载 作者:行者123 更新时间:2023-12-04 16:50:38 25 4
gpt4 key购买 nike

在观看了 WWDC2017 的 session 609 视频后,我对从 SpriteKit 中提取屏幕外 Metal 纹理感到非常兴奋。

这是一年多以前的事了!

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

我确实觉得这很奇怪。 这里有没有人对这个类、它的文档或示例代码有任何见解?

顺便说一句,SKTransformNode 也是如此。 .

最佳答案

SKRenderer的基本使用很简单,但有一些奇怪的地方使它在实践中有些古怪。

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

SKRenderer *renderer = [SKRenderer rendererWithDevice:mtlDevice];

为了告诉渲染器要绘制什么,我们将其与先前创建的场景相关联:
renderer.scene = (SKScene *)scene;

如果要运行 Action ,则需要手动取消暂停场景,这通常由 SKView 完成。呈现场景时:
scene.paused = NO;

要实际绘制场景,我们需要提供命令缓冲区和渲染 channel 描述符。假设您使用的是 MTKView处理运行显示链接计时器和管理 CAMetalLayer ,你可以写一个像这样的委托(delegate)方法,它通过渲染器更新场景的时间(和 Action ),然后绘制到 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];
}

记得设置 MTKViewframebufferOnly属性(property)给 NO如果你使用这种技术。

如果您想将屏幕外渲染到您创建的纹理中,您需要做更多的手动工作,但所涉及的概念是相同的。您可以通过创建额外的渲染 channel 描述符/编码器来对渲染到相同纹理的单独 channel 进行编码;只要记住设置 loadAction MTLLoadActionLoad 的原色附件跨 channel 保留纹理的内容。

您也可以使用 renderWithViewport:renderCommandEncoder:renderPassDescriptor:commandQueue:将所有绘图合并到一个 channel 中。

一些警告:
  • 据我所知,viewport参数被忽略。
  • 如果你想要 SKScene接收NSResponder操作,您需要手动转发它们或将场景插入到响应者链中。这尤其适用于关键事件,其中场景(或负责转发到它的对象)需要成为第一响应者。
  • 当场景不是由 SKView 呈现时,任何用于转换触摸或鼠标事件位置的便捷方法都不起作用。 ;你需要做一些手动翻译。
  • 关于sprite-kit - SKRenderer——神秘类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50934928/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com