【问题标题】:What's the strategy in game engines to perform secure state changes?游戏引擎中执行安全状态更改的策略是什么?
【发布时间】:2012-05-17 15:32:34
【问题描述】:

我在 OpenGL ES 中创建了一个运行循环,它由 CADisplayLink 以 60fps 的速度调用。 AFAIK CADisplayLink 在后台线程上调用它的目标。

我有大约 100 个状态变量供运行循环使用。

问题:从主线程,我想改变在运行循环中使用的状态变量来绘制一些东西。只有在所有状态变量都设置为它们的目标值之后才能绘制框架。

恐怕在某些时候当我更改状态变量时,我还没有完成所有更改(在主线程上的同一运行循环迭代中的一个大方法中),例如几何形状的位置,存在与多线程相关的崩溃或问题,CADisplayLink 将在我更新状态变量的方法中间启动,然后绘制垃圾或崩溃。

显然,当我只使用同步或原子属性时,它无济于事,因为它仍然不是事务性的。我想我需要交易。

我的幼稚做法是这样的:

运行循环读取的实例变量:

BOOL updatingState;

如果updateState 为YES,run loop 方法将跳过绘图。

然后在开始更改状态之前,我将其设置为“是”。当一切都改变时,我将其设置回 NO。

当然,问题是:如果 - 当我改变这个时 - 运行循环方法正在读取值?

游戏引擎如何处理这个问题?它们有什么样的锁定机制,可以在下一帧绘制之前完成状态变量的更改?

【问题讨论】:

    标签: iphone ios multithreading opengl-es concurrency


    【解决方案1】:

    您可能会发现读取-复制-更新策略很有用。一种可能的实现是每个对象实际上包含两个渲染参数副本,并且使用一个原子标志来告诉渲染线程使用哪个。您将需要在渲染器中使用读取内存屏障以确保在读取任何参数之前读取标志,并在更新程序线程中使用写入内存屏障以确保在翻转标志之前写入所有参数更新.

    【讨论】:

    • 更好的策略是拥有一个顶级指针或对象引用或数组索引和两个完整的状态树。应使用原子指令读取和写入顶级指针。只读树用于创建新状态,渲染引擎也从只读树中读取。当新状态准备好时,更新顶级指针/索引/引用。
    【解决方案2】:

    通常的做法是,所有状态更新都发生在每次运行循环迭代中,在绘制完成之前。也就是说,运行循环的示意图如下所示:

    updateState();
    draw();
    

    使用此模型,只有在达到一致状态后才会进行绘制。

    为此,您需要有一个模型,其中在每个 updateState() 上轮询诸如按键之类的事件,而不是异步发生,并在每次迭代中进行时间测量,以告诉您自上次以来经过了多少时间框架。

    不过,我无法帮助您如何在 iOS 编程的具体案例中实现这一点,因为我对此一无所知。但我希望我能为您指明正确的方向。

    【讨论】:

      【解决方案3】:

      我认为这是并发中的一个常见问题,所以有几种方法可以做到:

      1. 使用不可变的状态类来保存状态变量。
      2. 使用锁定机制(如果不能使用不可变类)来保护状态变量。
      3. 有多个可以修改的状态,但只有一个是“活动的”。这将允许您重用状态并减少复制和内存分配。

      另外,考虑一下这种情况:

      线程 1. 开始画一些东西。
      线程1.读取状态01参数的1/2(第一个状态)。
      线程 2. 将状态 01 换成状态 02(第二个状态)。
      线程 1. 读取状态 02 的另外 1/2,但它与状态 01 参数不同。

      所以最好的选择是不允许在绘图期间更新状态,所以选项 3 可能是最好的方法,因为您只需选择最新的状态并绘制它。假设您有两个状态:drawingStatenonDrawingState。在您的绘图函数中,您将始终使用drawingState 进行绘图,而其他线程则修改nonDrawingState。完成绘图后,您可以交换状态并使用最新的状态修改继续绘图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 2021-05-22
        • 2023-02-14
        • 1970-01-01
        • 1970-01-01
        • 2018-06-25
        • 2020-09-19
        相关资源
        最近更新 更多