UE4里的渲染线程

本文探讨了UE4渲染线程的设计,指出其与响应式编程框架如UniRx的事件流处理有诸多相似之处。通过解析 UniRx 的事件处理机制,解释了UE4中FBaseGraphTask、TGraphTask、FTaskThreadBase等关键类的作用,展示了渲染线程如何通过FRenderingThread、FRunnableThread和FTaskGraphInterface进行管理和执行。同时,介绍了渲染线程与游戏线程的同步机制,如FRenderCommandFence和FFrameEndSync,确保游戏与渲染的正确同步。
摘要由CSDN通过智能技术生成

  记的上次看过UniRx里的源代码,说是参考微软的响应式编程框架,响应式编程里的一些理论不细说,只单说UniRx里的事件流里的事件压入与执行,与UE4的渲染线程设计有很多相同之处,如果有了解响应式编程相关源码如UniRx,应该对UE4的渲染线程流程容易理解。

  在这先说下UniRx相应事件流的处理,让不了解的同学大致有点印象,如当前线程计划,一般首先有个队列,在相应事件响应后,把相应处理方法填充到队列中,另一边则在队列里,根据先进先出的原则,不断执行队列里的方法。说起来比较简单,主要是这里只拿出UniRx里的一个执行计划的事件流来说,另外的相关响应式编程概念与本文无关,也就不提起来说。

  回到正题,说了UE4渲染流程的设计与上面很多相同,如此,我们先简单来说明下相关UE4里的类,与上面说的来对应。

  FBaseGraphTask: 上面说到事件流,那么这个类在这,就是事件流里的每个事件。

  TGraphTask: FBaseGraphTask的一个子类模版类,模版类要求有方法DoTask.(注意这里,后面要说。相应在此处简单理解成C#里的泛型约束,虽然C#直接做不到这点,可以简接使用泛型约束加接口实现)

  FTaskThreadBase: 简单来说,这个类里放的是事件流,以及相应处理事件流的一些方法,如

    EnqueueFromThisThread: 压入事件流中。

    ProcessTasksUntilQuit: 循环执行事件流里方法,直到有要求结束信号。

    IsProcessingTasks: 是否正在执行方法。

  FNameTaskThread: FTaskThreadBase的子类,简单来说,UE4里内置的用这个,如游戏线程,渲染线程。

  FTaskThreadAnyThread: FTaskThreadBase的子类,简单来说,没有固定用途的用这个,如自己用来做啥做啥。

  FRunnable: 说是线程执行体,是不是有点搞晕了,其实你看下面他渲染线程的子类就明白了。

  FRenderingThread: FRunnable的子类,主要有方法Run调用执行渲染线程的事件流,上面的FTaskThreadBase::ProcessTasksUntilQuit这个方法。

  FRunnableThread: 包含一个FRunnable与相应的TLS实现,TLS搜了一下,简单来说,相同的变量,每个线程可以有不同的值。

  FWorkerThread: 包含FTaskThreadBase(事件流)与FRunnableThread(线程执行与TLS)的引用。封装相应对象FTaskThreadBase与FRunnableThread公开。

  FTaskGraphInterface: 可以理解成一个单例管理类,管理所有FWorkerThread(线程与事件流),一般管理类的方法,根据类型得到对应的FWorkerThread等。

  好吧,到这肯定有点晕了,大家最好对着相应代码来理解,那么这些类是如何组成一个渲染线程。

  1。初始准备,FTaskGraphInterface初始化相应的渲染线程所需的FNameTaskThread,以及调用StartRenderingThread,创建渲染线程执行体FRunnable的子类FRenderingThread。注意有个全局变量GIsThreadedRendering开始标为true。

  2。FRenderingThread开始执行RenderingThreadMain,找到渲染线程的FWorkerThread,初始化相应TLS的ID值。如上所说,循环执行FTaskThreadBase::ProcessTasksUntilQuit里的事件

  3。点程序退出等,ProcessTasksUntilQuit中断,相应渲染线程上的数据开始清理。

  看到如上,我们肯定会想到2里渲染线程执行的事件是如何来的,在这我们引入一些宏,大家看UE4的源码时,肯定会常见,ENQUEUE_UNIQUE_RENDER_COMMAND,ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER后面多参数的版本等。

  这些宏拆开来,都有一个类和一段执行代码,我们根据ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER来说,如下:

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值