Unreal基础多线程及渲染多线程

news2025/1/12 6:00:55

基础多线程:

UE4中的多线程模型主要基于FRunnable和FRunnableThread两个核心概念。其中,FRunnable定义了一个可以在线程上运行的对象,而FRunnableThread则提供了一个平台无关的线程对象抽象,负责驱动FRunnable对象的初始化、执行和清理。

一、FRunnable的生命周期管理

  • 初始化(Init):当一个FRunnable实例被创建并准备执行时,首先需要调用其Init方法进行初始化。这个过程通常涉及资源的分配、状态的设置等,确保线程在执行前处于正确的状态。
  • 运行(Run):FRunnable的Run方法是线程执行的核心,它包含了线程需要完成的任务或计算。这个方法的设计旨在确保线程能够高效地完成其工作,同时避免阻塞其他线程。
  • 停止(Stop):如果需要提前终止线程的执行,可以调用Stop方法。这个方法允许线程安全地结束其操作,释放资源,并确保应用程序的稳定运行。
  • 退出处理(Exit):一旦FRunnable的Run方法执行完毕,无论是正常结束还是通过Stop方法强制终止,都会调用Exit方法进行清理工作,如释放内存、关闭打开的句柄等,保证资源的合理释放。

二、FRunnableThread的线程管理

  • 线程创建(Create):通过FRunnableThread的Create方法,可以创建一个新的线程并开始执行指定的FRunnable对象。这个过程包括分配线程堆栈、设置线程属性等,确保新线程能够正确地运行。
  • 线程控制:UE4提供了一套丰富的线程控制机制,包括暂停(Suspend)、恢复(Resume)、杀死(Kill)等方法,允许开发者根据需要精确地控制线程的行为。这些方法为调试和错误恢复提供了极大的便利。
  • 线程同步:为了确保线程间数据的一致性和避免竞争条件,UE4支持多种同步原语,如锁(Lock)、信号量(Semaphore)和原子操作(AtomicOperations)。这些工具帮助开发者构建高度并行且线程安全的应用。
  • 线程局部存储(TLS):UE4还支持线程局部存储,允许每个线程拥有其独立的数据副本。这对于提高多线程程序的性能和模块化非常有帮助,因为它减少了线程间的数据共享和竞争。

三、与C++标准库的互操作性

  • 模型映射:尽管UE4采用了独特的FRunnable和FRunnableThread模型,但它们与C++标准库中的std::thread(基于Callable和Thread)是可以相互转换的。这种映射关系使得UE4的多线程功能既可以利用引擎特有的优化,又能保持与标准C++代码的良好兼容性。
  • 功能实现:通过UE4提供的设施,开发者可以实现类似std::thread的功能,反之亦然。这意味着开发者可以根据自己的喜好和项目需求选择使用UE4的原生多线程接口或是标准库中的对应功能。
  • 性能考量:在选择使用UE4的多线程模型还是C++标准库时,性能是一个重要因素。虽然UE4的模型在游戏开发中经过了特别优化,但标准库的通用性可能在非游戏应用中更具优势。因此,开发者需要根据具体场景做出恰当的选择。
  • 代码移植性:为了确保代码具有良好的移植性和可维护性,开发者应当在编写多线程代码时考虑到两种模型的差异。理想情况下,代码应当足够模块化,以便能够在最少修改的情况下从一种模型迁移到另一种模型。

四、 AsyncTask系统

  • 基于线程池:UE4中的AsyncTask系统是基于线程池的概念构建的,允许开发者轻松地执行后台异步任务,而不需要直接处理线程的创建和销毁。
  • FNonAbandonableTask:这是所有异步任务类的基类,通过继承这个类并实现DoWork()方法,可以定义异步任务的具体行为。
  • 使用示例:文章提供了一个ExampleAsyncTask的代码示例,展示了如何创建和使用异步任务。这包括任务的启动、同步和异步执行以及如何确保任务完成。
  • 线程池实现:FQueuedThreadPool是UE4中线程池的实现,维护了一组工作线程和任务队列。这种结构优化了线程的使用,减少了线程创建和销毁的开销。

五、 TaskGraph系统

  • 从Tick函数谈起:TaskGraph系统紧密集成于UE4的主循环(Tick函数)中,允许在每帧更新时安排和执行任务。
  • 任务与线程:系统中的任务(如渲染、物理计算等)可以自动分配到可用的线程上执行,提高了引擎的并行处理能力。
  • 任务与事件:TaskGraph还支持基于事件的异步任务执行模式,这允许更复杂的依赖性和执行顺序管理。
  • 技术细节:虽然文章没有深入讨论TaskGraph的内部机制,但它显然是一个高度复杂和强大的系统,旨在最大化UE4引擎的性能和响应性。

六、LockFreeList

  1. 容器设计初衷

    • 问题解决:传统的TQueue存在一些问题,如内存分配效率低、不支持多生产者多消费者模式以及伪共享问题。这些问题在高并发场景下尤为明显,因此UE需要一种更高效的数据结构来支持其复杂的多线程需求。
    • 性能优化:LockFreeList通过使用锁自由(lock-free)算法,避免了传统锁定机制带来的性能损耗,特别是在高并发的情况下。
  2. 核心组件

    • 节点与回收池:LockFreeList定义了特定的节点结构,并实现了一个节点回收池。这种设计可以有效减少内存碎片和提高内存使用效率。
    • 专用Allocator:为了进一步优化内存分配,LockFreeList使用了专用的内存分配器(Allocator),这有助于避免内存碎片,确保数据的连续存储,从而提高缓存命中率。
  3. 数据结构实现

    • 基本容器类型:实现了栈和队列两种基本的容器类型,这些都是构建更复杂数据结构的基础。
    • 扩展容器:基于栈和队列,LockFreeList还实现了FStallingTaskQueue等专为TaskGraph设计的容器,以及TClosableLockFreePointerListUnorderedSingleConsumer等更复杂的容器类型。
  4. 多线程知识应用

    • CPU缓存利用:LockFreeList在设计时充分考虑了CPU缓存的行为,例如通过预分配特定大小的数据块来对齐CPU缓存行,从而减少缓存未命中的情况。
    • 避免伪共享:通过在数据结构中添加适当的填充(padding),确保不同线程访问的数据不会位于同一缓存行上,从而避免伪共享问题。
  5. 原子操作与CAS

    • Compare And Swap (CAS):LockFreeList广泛使用了CAS操作来实现线程安全的数据处理。这种非阻塞式的编程技术允许在不使用锁的情况下安全地更新数据。
    • ABA问题处理:通过引入计数器或其他状态信息,LockFreeList能够有效地识别并处理ABA问题,确保数据的一致性和完整性。
  6. TLS的使用

    • 线程局部存储 (TLS):在某些情况下,LockFreeList利用TLS来存储线程独有的数据,这样可以在不增加额外同步开销的情况下保证线程安全。

Unreal多线程渲染:

UE的多线程渲染源码执行流程非常复杂且高度优化

1. 背景和目标

  • 瓶颈问题: 在单线程渲染中,CPU很容易成为性能瓶颈,尤其是在处理重负载的场景(如包含大量人物、汽车和建筑的大型游戏场景)时。
  • 并行性提升: 为了充分利用现代硬件(尤其是GPU)的性能,UE5设计了一种新的多线程渲染架构,旨在通过提升渲染过程的并行性来解决这一问题。

2. 多线程RHI命令的生成和翻译

  • 命令生成: UE5中的RHI(Render Hardware Interface)命令生成过程是多线程的,这允许同时利用多个CPU核心来生成渲染命令,从而提高整体渲染效率。
  • 命令翻译: 这些命令还需要被有效地翻译为GPU可以执行的指令,这一步骤同样在多线程环境中完成,以确保命令的快速和准确转化。

3. RHI资源的创建和更新

  • 资源优化: 在UE5中,RHI资源的创建和更新也是多线程的,这样可以减少这些操作对主线程的影响,从而减轻主线程的负担,使其能够更快地响应其他任务。

4. RHI线程的引入

  • 专用RHI线程: UE5引入了一个单独的RHI线程,专门用于执行RHI命令。这样做的目的是让渲染线程专注于渲染逻辑(例如裁剪和场景设置),而将实际的渲染命令执行交由RHI线程处理。
  • 异步执行: 这种设计不仅提高了渲染效率,而且通过异步执行RHI命令,减少了对渲染线程的阻塞,使得渲染线程和RHI线程能够更加高效地协同工作。

5. RHI命令的记录与执行

  • 命令记录: UE5使用FRHICommandList来记录RHI命令,这些命令最终会被发送到RHI线程进行执行。
  • 异步操作: 这种异步操作模式允许渲染线程在一帧的中间阶段就开始向RHI线程发送命令,然后继续进行其他任务。这大大提高了渲染线程和RHI线程的并行工作效率。
  • 顺序保证: 为了确保命令按照正确的顺序执行,UE5实现了一套机制,即在创建新的Task时将之前发送的Task作为前置条件,确保命令的有序执行。

6. 跨平台支持

  • 框架通用性: 整个多线程RHI命令的生成和执行过程被设计为不直接依赖于特定的硬件,这意味着这套机制可以被各种平台使用,包括移动设备。
  • 图形API支持: 不同的图形API(如OpenGL, Vulkan, D3D12, Metal等)都可以通过实现各自的RHICommandContext来支持这一框架,无论是立即上下文还是延迟上下文。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1686416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程池(C++)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 线程池 实现线程类 #pragma once#include <pthread.h> #include <iostream> #include <vector> #include <string> #include <cstdlib> #include <cstring> #include <functional&…

AI大模型探索之路-实战篇4:DB-GPT数据应用开发框架调研实践

目录 前言一、DB-GPT总体概述二、DB-GPT关键特性1、私域问答&数据处理&RAG2、多数据源&GBI3、多模型管理4、自动化微调5、Data-Driven Multi-Agents&Plugins6、隐私安全 三、服务器资源准备1、创建实例2、打开jupyterLab 四、DB-GPT启动1、激活 conda 环境2、切…

【大比武07】人工智能技术赋能城建档案高质量发展

关注我们 - 数字罗塞塔计划 - # 大比武2024 本篇是参加“华夏伟业”杯第二届档案信息化公司业务与技术实力大比武&#xff08;简称“大比武 2024”&#xff09;的投稿文章&#xff0c;来自讯飞知喻&#xff08;安徽&#xff09;科技有限公司&#xff0c;作者&#xff1a;张海剑…

Flask 蓝图路由的模块化开发

基于 Flask 蓝图路由的模块化开发 1. 编程目标 为了提高Flask应用的可维护性和可扩展性&#xff0c;我们通过使用Flask的蓝图(Blueprint)功能&#xff0c;可以将不同的功能模块拆分到独立的文件中&#xff0c;方便后续的开发和维护。 2. 项目结构 项目结构树如下&#xff1…

基于Matlab实现声纹识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 声纹识别&#xff0c;也称为说话人识别&#xff0c;是一种通过声音判别说话人身份的生物识别技…

高效爬取Reddit:C#与RestSharp的完美结合

介绍 在数据驱动的时代&#xff0c;网络爬虫已经成为获取网页数据的重要工具。Reddit&#xff0c;作为全球最大的社区平台之一&#xff0c;以其丰富的用户生成内容、广泛的讨论话题和实时的信息更新吸引了大量用户。对于研究人员和开发者而言&#xff0c;Reddit提供了宝贵的数…

nextcloud 安装部署

php版本不对 ubuntu nginx 配置php 网站-CSDN博客 抄自chatgpt ubuntu完全卸载干净某个包-CSDN博客 以及设置基本的php nginx环境参照上面两篇博文 然后参照官方文档 Example installation on Ubuntu 22.04 LTS — Nextcloud latest Administration Manual latest document…

靶机hackNos Os-Bytesec练习报告

hackNos: Os-Bytesec靶机练习实践报告 下载地址*&#x1f617; https://drive.google.com/open?id1yBuih2CsBx45oTUDpFr4JldrzkaOTTeZ https://download.vulnhub.com/hacknos/Os-ByteSec.ova https://download.vulnhub.com/hacknos/Os-ByteSec.ova.torrent ( Magnet) …

# 分布式链路追踪_skywalking_学习(1)

分布式链路追踪_skywalking_学习&#xff08;1&#xff09; 一、APM 系统概述 1、什么是 APM 系统&#xff1f; APM &#xff1a;全称 Application Performance Management 即应用性能管理系统。是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。…

基于Django的美团药品数据分析与可视化系统,有多用户功能,可增删改查数据

背景 随着电子商务和健康产业的迅速发展&#xff0c;药品行业数据的分析和可视化变得愈发重要。基于Django的美团药品数据分析与可视化系统的研究背景凸显了对药品数据的深入挖掘和分析的需求。该系统不仅具备多用户功能&#xff0c;允许不同角色的用户进行数据管理和分析&…

【3DMAX教程插件】3DMAX泰森破碎插件使用方法

3DMAX泰森破碎插件&#xff0c;一键破碎物体&#xff0c;在保留体积的同时破碎网格对象。 【适用版本】 3dMax2009及更高版本 【安装方法】 3DMAX泰森破碎插件无需安装&#xff0c;使用时直接拖动插件脚本文件到3dMax视口中打开即可&#xff01; 【主要功能】 v1.0&#…

气膜建筑的工作原理与优势解析—轻空间

近年来&#xff0c;气膜建筑凭借其独特的结构设计和诸多优点&#xff0c;迅速成为建筑领域的热门选择。本文将详细介绍气膜建筑的工作原理、机械系统、智能控制、索网控制和空气净化等方面&#xff0c;为您提供全面了解气膜建筑的基础知识。 气膜建筑的工作原理 气膜建筑是一种…

翻译《The Old New Thing》- Which windows appear in the Alt+Tab list?

Which windows appear in the AltTab list? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071008-00/?p24863 Raymond Chen 2007年10月08日 有读者Phil Quirk询问&#xff0c;AltTab切换列表中显示哪些窗口的规则是什么。 规则其实相当…

WT2003HX-16S新能源电动汽车低速报警器方案

一&#xff1a;低速报警器应用场景&#xff1a; 为在工业化发展中对外实现弯道超车&#xff0c;其中新能源汽车行业就为国家战略布局方向之一&#xff0c;前景比较广阔。随之配套的各类警报系统方案也蓬勃发展&#xff0c;其中低速报警器&#xff08;AVAS&#xff09;作为关键安…

数字孪生时代来临,实景三维千亿级别市场爆发在即

想象一下&#xff0c;当我们将整座城市搬到虚拟世界&#xff0c;点点鼠标就能实时掌握城市运行情况&#xff0c;可以实现数字空间与现实空间的实时互联互通、在线治理&#xff0c;是不是听起来像科幻电影一样不可思议&#xff1f; 现在&#xff0c;通过运用遥感测绘、大数据、云…

前端项目使用docker编译发版和gitlab-cicd发版方式

项目目录 app/ ├── container/ │ ├── init.sh │ ├── nginx.conf.template ├── src/ ├── .gitlab-ci.yml └── deploy.sh └── Dockerfile └── Makefilecontainer目录是放nginx的配置文件&#xff0c;给nginx镜像使用 .gitlab-ci.yml和Makefile是c…

JetLinks物联网平台初步使用——TCP接入

基于上一篇&#xff0c;完整的搭建了前后端整个系统&#xff0c;可以在windows 7完美的运行使用。 目录 1、创建网络组件 2、创建协议管理 3、创建网关 ​4、创建产品 ​5、创建设备 6、模拟对接 1、创建网络组件 进入平台后&#xff08;用户名密码都是admin&#xff…

【代码随想录】【算法训练营】【第17天】 [110]平衡二叉树 [257]二叉树的所有路径 [404]左叶子之和

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 17&#xff0c;又是一个令人愉快的周五~ 题目详情 [110] 平衡二叉树 题目描述 110 平衡二叉树 解题思路 前提&#xff1a;平衡二叉树&#xff1a;左右子树高度差不超过1, 思路&#xff1a;…

高性能推理框架漫谈

传统模型分布式推理框架 Tensorflow servingPytorch ServingTriton Server 大语言模型的推理框架 其中&#xff0c; VLLM 后端接入了Ray 框架&#xff0c; 作为调度请求的分发处理&#xff1b;除此之外&#xff0c;还包括Nvidia 最新推出的TensorRT-LLM&#xff0c; 增加了对…

开放式耳机怎么选择!教你几招!2024开放式蓝牙耳机推荐

在面对市场上琳琅满目的开放式耳机时&#xff0c;许多用户可能会感到难以抉择。作为一名开放式耳机的爱好者&#xff0c;我根据自己的实际使用体验&#xff0c;整理了一些我认为值得推荐的开放式耳机&#xff0c;希望能为正在寻找合适耳机的朋友们提供一些参考和帮助。我将为大…