我想编写一个脚本,该脚本使用Nuke的内置性能计时器来“检查”当前组件。
为此,我要清除所有查看器缓存以重新开始。现在,我需要触发缓存。看来实现此目标的唯一方法是使用class DottedBackgroundView: UIView {
override func draw(_ rect: CGRect) {
guard let context = UIGraphicsGetCurrentContext() else { return }
UIColor.green.setFill()
context.fill(rect)
let drawPattern: CGPatternDrawPatternCallback = { _, context in
context.addArc(
center: CGPoint(x: 5, y: 5), radius: 2.5,
startAngle: 0, endAngle: CGFloat(2.0 * .pi),
clockwise: false)
context.setFillColor(UIColor.white.cgColor)
context.fillPath()
}
var callbacks = CGPatternCallbacks(
version: 0, drawPattern: drawPattern, releaseInfo: nil)
let pattern = CGPattern(
info: nil,
bounds: CGRect(x: 0, y: 0, width: 10, height: 10),
matrix: .identity,
xStep: 10,
yStep: 10,
tiling: .constantSpacing,
isColored: true,
callbacks: &callbacks)
let patternSpace = CGColorSpace(patternBaseSpace: nil)!
context.setFillColorSpace(patternSpace)
var alpha: CGFloat = 1.0
context.setFillPattern(pattern!, colorComponents: &alpha)
context.fill(rect)
context.addArc(
center: CGPoint(x: 5, y: 5), radius: 5.0,
startAngle: 0, endAngle: CGFloat(2.0 * .pi),
clockwise: false)
}
}
。使用此调用,我可以将时间轴缓存起来,但是没有迹象表明何时完全缓存了时间轴,以便能够停止和重置Performace计时器。
我知道我也可以使用nuke.activeViewer().play(1)
一次跳过一帧,直到我到达最后一帧,但在我看来,使用此调用不会导致comp缓存该帧。实际上,时间轴表明该帧已缓存,但是nuke.activeViewer().frameControl(+1)
返回了nuke.activeViewer().node().frameCached(nuke.frame())
。
尽管如此,我写的东西仍然有效,但几乎没有。
这里是:
false
我知道这不是一段很好的代码,但是有时候这些行执行得很好,而在其他时候,它只是挂了一段随机的(至少看起来是这样)时间。
那么Nuke中的Viewer是否有可用或可写的回调或类似的东西?
非常感谢您的帮助!
答案 0 :(得分:0)
您要达到什么特定的性能要求?
Nuke具有内置功能
“ Nuke可以在屏幕上显示准确的性能计时数据或将其输出到XML文件,以帮助您解决速度较慢的脚本中的瓶颈。启用性能计时后,计时信息会显示在“节点图”中,并且节点本身会根据从绿色(快速节点)到红色(慢速节点)所花费的总处理时间的比例。” -
答案 1 :(得分:0)
Mimicking callbacks on the viewer timeline is only achievable using Threads.
Just create a Thread, check for the current frame to be cached and step to the next frame using nuke.activeViewer().frameControl()
from that Thread.