我在 OpenGL ES 中创建了一个运行循环,它由 CADisplayLink 以 60fps 调用。AFAIK CADisplayLink 在后台线程上调用它的目标。
我有大约 100 个状态变量供运行循环使用。
问题:从主线程,我想改变在运行循环中使用的状态变量来绘制一些东西。只有在所有状态变量都设置为其目标值之后,才必须绘制框架。
恐怕在某些时候,当我更改状态变量时,我还没有完成所有更改(在主线程上的同一运行循环迭代中的一个大方法中),例如几何形状的位置,有多个- 线程相关的崩溃或问题,CADisplayLink 将在我更新状态变量的方法中间启动,然后绘制垃圾或崩溃。
显然,当我只使用同步或原子属性时,它无济于事,因为它仍然不是事务性的。我想我需要交易。
我天真的方法是这样的:
运行循环读取的实例变量:
BOOL updatingState;
如果updateState 为YES,run loop 方法将跳过绘图。
然后在开始更改状态之前,我将其设置为 YES。当一切都改变了,我把它设置回NO。
当然,现在的问题是:如果 - 当我改变这个时 - 运行循环方法正在读取值怎么办?
游戏引擎如何处理这个问题?他们有什么样的锁定机制,以便在绘制下一帧之前完成状态变量的更改?