作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在观看了 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;
SKView
完成。呈现场景时:
scene.paused = NO;
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];
}
MTKView
的
framebufferOnly
属性(property)给
NO
如果你使用这种技术。
loadAction
MTLLoadActionLoad
的原色附件跨 channel 保留纹理的内容。
renderWithViewport:renderCommandEncoder:renderPassDescriptor:commandQueue:
将所有绘图合并到一个 channel 中。
viewport
参数被忽略。 SKScene
接收NSResponder
操作,您需要手动转发它们或将场景插入到响应者链中。这尤其适用于关键事件,其中场景(或负责转发到它的对象)需要成为第一响应者。 SKView
呈现时,任何用于转换触摸或鼠标事件位置的便捷方法都不起作用。 ;你需要做一些手动翻译。 关于sprite-kit - SKRenderer——神秘类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50934928/
在观看了 WWDC2017 的 session 609 视频后,我对从 SpriteKit 中提取屏幕外 Metal 纹理感到非常兴奋。 这是一年多以前的事了! 然而,SKRenderer 上绝对没有
我是一名优秀的程序员,十分优秀!