如果你制作的游戏架构将系统组件(IE,渲染,物理,逻辑,输入,脚本等)分成不同的线程,你如何处理需要实时通信的情况呢?
例如,如果脚本想在屏幕上绘制一个框,理想情况下,当渲染组件发出“FrameDrawn”事件时,这样就可以在屏幕顶部绘制框,每一帧抽奖。如果脚本组件和呈现组件彼此位于不同的线程上,这怎么可能呢?
答案 0 :(得分:1)
通常,渲染线程是唯一一个将内容绘制到屏幕上的线程。但是,由于线程可以通信,所以脚本线程可以告诉渲染线程“嘿,我想在下一帧绘制一个框”。
我们的项目处理线程通信的方式有两种。对于动态编辑的东西 - 对象列表,移动车辆等等,我们创建了一个互斥锁,可以在数据被更改时锁定数据。如果渲染器想要绘制它,但更新线程正在删除该对象,则渲染器必须等待。对于其他东西,比如ui,我们只有由ui线程写的全局标志,并由渲染器读取,因此不需要互斥锁。
答案 1 :(得分:1)
大多数游戏将拥有大量数据,并且几个线程根据需要引用该数据的某些子集。线程之间的通信很少是显式的,更常见的是隐式的,通过由一个线程引起的数据更改来完成,稍后由第二个线程注意到。这些更改受互斥锁,信号量或其他低级同步原语的保护。
对于您的绘图示例,脚本线程将更改GUI组件和渲染线程中的某些数据,下次呈现GUI时,会看到新数据并相应地绘制框。
请记住,大多数游戏开发人员并没有像你的例子中那样解决问题,部分原因是因为使用共享如此多数据的模型并依赖于低级别锁定来确保正确性而难以有效地做到这一点。理想情况下,更多游戏开发者会转向共享较少数据的模型,但由于软实时演示响应要求而难以实现。
答案 2 :(得分:0)
你要求的是不可能的,这就是为什么一般规则只有一个UI线程。如果另一个线程想要在屏幕上显示某些内容,它应该向UI线程发送一条消息,该消息将在呈现时显示该消息。