【问题标题】:can drawRect be triggered on a SCNView (macOS)?可以在 SCNView (macOS) 上触发 drawRect 吗?
【发布时间】:2017-03-18 19:27:52
【问题描述】:

我有两个非常相似的 macOS 应用程序。一个应用程序通过 Quartz 调用在 NSView 的子类中渲染 2-D 动画,另一个应用程序使用 SceneKit 几何图形在 SCNView 的子类(本身是 NSView 的子类)中渲染 3-D 动画.在每种情况下,“视图”都由视图控制器拥有,并且该所有权在情节提要中设置。在每种情况下,我都使用一个计时器来每秒弄脏视图,因此它的drawRect 被触发以驱动动画运动。在每种情况下我都使用过:self.view.needsDisplay = true

在 2-D 情况下,drawRect 在视图实例中被调用,而在 3-D 情况下则不被调用(即使对于初始渲染也是如此)。

我很困惑! SCNView 是否抑制对 drawRect 的调用?如果是这样,我该如何解决这个问题?如果没有,我错过了什么巫术秘密?

如果这种行为不是读者所期望的,我将发布一个展示它的示例项目。

我知道 SceneKit 可以利用 Core Animation,但我想在两个应用程序中保持相同的通用计时器机制,因为动画内容本质上是相同的动作,二维中的平面是球形的在 3-D 中,因此使用 SceneKit 渲染是有意义的。

添加了一个 Xcode 项目以显示不同的 NSViewSCNView 行为: https://www.dropbox.com/s/qtymzitkqcqhfje/SCN.zip?dl=0

【问题讨论】:

    标签: macos scenekit drawrect


    【解决方案1】:

    你正在与框架作斗争。

    SceneKit 有自己的渲染和动画计时器。挂钩这些以更新对象的属性(位置、颜色等)。让 SceneKit 处理绘图调用。

    您需要的方法可能在意想不到的地方。查看SCNSceneRendererSCNSceneRendererDelegate 协议的文档。 renderer delegate documentation 解释了渲染循环并向您展示了在哪里自定义应用的动画和物理效果。

    【讨论】:

    • 我现在正在使用这些回调并实现我的目标,所以,谢谢。我发现我在委托调用中做了很多计算,其中一些是不必要的,因为许多对象的属性不会变化得那么快,所以我在每个渲染循环上增加一个计数器,但只更新“慢”属性每 60 个(或更多)循环。这感觉有点笨拙,但它完成了工作。谢谢哈尔
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2016-10-14
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多