【发布时间】:2017-07-28 14:05:48
【问题描述】:
我正在使用 MTKView 来绘制 Metal 内容。配置如下:
mtkView = MTKView(frame: self.view.frame, device: device)
mtkView.colorPixelFormat = .bgra8Unorm
mtkView.delegate=self
mtkView.sampleCount=4
mtkView.isPaused=true
mtkView.enableSetNeedsDisplay=true
setFrameSize 被覆盖以触发重新显示。
每当视图调整大小时,它都会在重绘所有内容之前缩放其旧内容。这给人一种抖动的感觉。
我尝试将 MTKView 图层的contentGravity 属性设置为不可调整大小的值,但这完全弄乱了内容的比例和位置。看来 MTKView 不想让我摆弄那个参数。
如何确保在调整大小期间始终正确重绘内容?
【问题讨论】:
-
将
layerContentsRedrawPolicy设置为NSViewLayerContentsRedrawDuringViewResize(Swift 中为.duringViewResize)有帮助吗? -
不,我也尝试了其他一些选项,但没有区别。
-
你是如何配置
MTKView的?例如,paused、enableSetNeedsDisplay和autoResizeDrawable属性的设置是什么? -
我编辑了问题以包含视图的设置代码。
-
其他尝试:将
presentsWithTransaction设置为 true。如果这还不够,您可能需要遵循docs 最后一段中针对该属性的建议。问题是金属绘图是异步的。您提交一个命令缓冲区。它实际上是在一段时间后安排的。如果你使用它的present(_:),那么此时它会调用drawable的present()方法。即便如此,也延迟了。它将等到对其纹理的所有渲染完成(不仅仅是计划的)。
标签: macos core-animation metal