问题。
UI线程处理键/指针事件并将其写入名为InputState的类中。
渲染线程从InputState读取并连续更新其状态。
我看到3个解决方案
在synchronized
的所有get / set方法中使用 InputState
关键字。但这意味着每次Render
个线程检查事件的可能性(每个循环约50次),它必须获得一个锁。效率不高但允许UIThread
和Render
线程之间的精细多线程。
同步InputState
单个引用。渲染线程在整个对象上进行同步,并在持有锁的同时按顺序获取50,然后释放锁。
拥有InputState
的2个实例。假设1和2.渲染线程使用volatile关键字访问“live”(InputState1)。 InputState
方法均未同步。
当UI线程处理新事件时,UI线程更新InputState
,InputState2的卷影副本,然后一旦完成,就更新实时volalite引用。那个关键的操作是原子性的吗?现在渲染线程将InputState2视为“实时”。 InputState1现在是影子InputState。但!
UI线程必须确保一些东西。 UIThread现在必须等待渲染线程在再次使用之前退出任何方法。因为Render线程可能太慢而无法在InputState1中的get方法中停留,而在一行中通过 UIThread 处理2个事件。不是吗? 我还不确定如何解决这个问题。因此我的问题在这里。 我可以使用第三个InputState而不是2并在检查渲染线程的易失性循环计数时旋转它们。
您认为哪种选择最佳?