Unity Burst编译
官网文档:https://docs.unity3d.com/Packages/com.unity.burst@1.8/manual/index.html
Unity 之Burst 底层原理:https://zhuanlan.zhihu.com/p/623274986
Burst 编译器入门(五):https://developer.unity.cn/projects/5e62f15eedbc2a1feeebb83e
LLVM:https://llvm.org/
LLVM:https://aosabook.org/en/v1/llvm.html
編譯器 LLVM 淺淺玩:https://medium.com/@zetavg/%E7%B7%A8%E8%AD%AF%E5%99%A8-llvm-%E6%B7%BA%E6%B7%BA%E7%8E%A9-42a58c7a7309#20b5
一个故事看懂CPU的SIMD技术:https://www.cnblogs.com/xuanyuan/p/16048303.html
介绍
- Burst 是一个编译器,目的是把代码跑的更高效。主要优化技术密集的任务。
- LLVM的激进优化。
- SIMD向量化:循环操作转为单指令多数据指令。(一个加法变四个加法一起算)
- 循环展开:if等分支展开,比如经常true的再优化。Hint intrinsics
- 自动内联:把小函数自动内联展开。
- 无GC检测:因为操作都是非托管数据,所以省去一些不必要的检测。
- LLVM的激进优化。
- 2019年官方说的: Burst必须只能在JobSystem中使用,其他地方是不能用的。
- 从 IL/.NET 字节码转换为使用 LLVM 编译器的优化原生 CPU 代码。
- C#代码 -> IL -> LLVM IR -> 原生机器码
- 适用于:
- 物理碰撞。
- 粒子系统刷新。
- 图形算法处理。
LLVM
- 模块化编译器,是一组库,可以针对特定问题优化。


和 IL2CPP 的关系
-
互不影响,两套编译方式。
-
普通代码走IL2CPP编译成C++机器码。
-
标记
[BurstCompile]的代码,有Burst单独编译优化,生成更高效的机器码。
调试
-
https://docs.unity3d.com/Packages/com.unity.burst@1.8/manual/editor-burst-inspector.html
-
Unity菜单:
Jobs/Burst/Open Inspector

测试
-
对比各种遍历耗时
- 测试了
List<T>和 定长数组,相同操作都是定长数组更快一点。
- 测试了
-
测试长度遍历一千万,测了一百万差异差不多。
测试代码
private const int TEST_COUNT = 10000000;
private float[] _managedArray = new float[TEST_COUNT]; // 托管
private NativeArray<float> _nativeArray; // 非托管private void Run()
{_nativeArray = new NativeArray<float>(TEST_COUNT, Allocator.Persistent);for (int i = 0; i < TEST_COUNT; i++) {_managedArray[i] = i;_nativeArray[i] = i;}// 测试List,同下面Array...// Debug.LogError("Test Array");using (new MyStopWatch("ManagedArray")){for (int i = 0; i < TEST_COUNT; i++) _managedArray[i] = i + 5;}using (new MyStopWatch("TestNativeArray")){for (int i = 0; i < TEST_COUNT; i++) _nativeArray[i] = i + 5;}using (new MyStopWatch("TestNativeList Job")){var job = new NativeArrayJob { Data = _nativeArray };job.Run();}using (new MyStopWatch("TestNativeList Burst Job")){var job = new NativeArrayBurstJob { Data = _nativeArray };job.Run(); }using (new MyStopWatch("TestNativeArray Burst JobParallelFor")){// List动态扩容,不支持多线程写入var job = new NativeArrayBurstJobParallelFor() { Data = _nativeArray };job.Schedule(TEST_COUNT, 64).Complete(); }using (new MyStopWatch("TestNativeArray Burst")){TestNativeArrayBurst(ref _nativeArray);}using (new MyStopWatch("TestNativeArray Burst Break")){TestNativeArrayBurstBreak(ref _nativeArray);}// Natvie容器要自己释放_nativeList.Dispose();
}// 普通带Burst编译
[BurstCompile]
private static void TestNativeArrayBurst([NoAlias]ref NativeArray<float> list)
{for (int i = 0; i < TEST_COUNT; i++) list[i] = i + 5;
}// 带Burst编译,但是加分支打断SIMD向量化
[BurstCompile]
private static void TestNativeArrayBurstBreak([NoAlias]ref NativeArray<float> list)
{for (int i = 0; i < TEST_COUNT; i++){if (i == 0) list[i] = i + 7; // 加个分支,打断Loop vectorizationlist[i] = i + 5;}
}// 普通Job
struct NativeArrayJob : IJob
{public NativeArray<float> Data;public void Execute(){for (int i = 0; i < TEST_COUNT; i++) Data[i] = i + 5;}
}// 带Burst的Job
[BurstCompile]
struct NativeArrayBurstJob : IJob
{public NativeArray<float> Data;public void Execute(){for (int i = 0; i < TEST_COUNT; i++) Data[i] = i + 5;}
}// 带Burst的多线程Job
[BurstCompile]
struct NativeArrayBurstJobParallelFor : IJobParallelFor
{public NativeArray<float> Data;public void Execute(int index){Data[index] = index + 6;}
}
测试结果
-
PC端跑一千万次循环
array[i]=i+5
-
MUMU模拟器 64位,跑一亿次循环
array[i]=i+5
| 安卓跑一亿次array[i]=i+5 | 耗时 | 代码 |
|---|---|---|
| 普通数组 | 80ms | ![]() |
| NativeArray | 32ms | ![]() |
| 丢到Job中执行 | 34ms | ![]() |
| Burst编译的Job | 31ms | ![]() |
Burst编译的多线程Job。不支持NativeList<T>,因为可能出现动态扩容,导致线程不安全。 | 28ms | ![]() |
| 普通Burst函数 | 34ms | ![]() |
| 普通Burst函数,但是打断SIMD向量化 | 78ms | ![]() |
- 跑一亿次循环
array[i]=math.sin(i+5),左图:MUMU模拟器 64位,右图:RedmiNote12


| 安卓跑一亿次sin(i+5) | 模拟器耗时/ms | 真机耗时/ms |
|---|---|---|
| 普通数组 | 6080 | 15570 |
| NativeArray | 5922 | 15533 |
| 丢到Job中执行 | 5903 | 15415 |
| Burst编译的Job | 2125 | 1505 |
| Burst编译的多线程Job | 573 | 332 |
| 普通Burst函数 | 2116 | 1503 |
| 普通Burst函数,但是打断SIMD向量化 | 23520 | 8047 |
| Burst编译的Job,但是打断SIMD向量化 | 23165 | 8036 |
| Burst编译的多线程Job,但是打断SIMD向量化 | 5944 | 1738 |
- 模拟器下,同样循环内容下(有
if和math.sin),burst编译反而跑的更慢了。可能中低端设备负优化了?
SIMD向量化
-
https://docs.unity3d.com/Packages/com.unity.burst@1.8/manual/optimization-loop-vectorization.html
-
如果有分支或者计算结果有前后依赖,就无法向量化。简单的计算可以手动向量化用
float4等。

总结
-
复杂计算效率
Burst + JobParallelFor>Burst + Job>=Burst>Job>= 常规。 -
平常开发不涉及大量计算,直接用托管
List<T>等常规容器就好了。托管环境Native容器虽然也快一点,但需要自己释放。
相关文章:
Unity Burst编译
官网文档:https://docs.unity3d.com/Packages/com.unity.burst1.8/manual/index.html Unity 之Burst 底层原理:https://zhuanlan.zhihu.com/p/623274986 Burst 编译器入门(五):https://developer.unity.cn/projects/5e…...
软件测试中的BUG
文章目录 软件测试的生命周期BugBug 的概念描述 Bug 的要素案例Bug 级别Bug 的生命周期与开发产生争执怎么办?【高频面试题】先检查自身,Bug 是否描述的不清楚站在用户角度考虑并抛出问题Bug 的定级要有理有据提⾼自身技术和业务水平,做到不仅…...
LabVIEW基于IMAQ实现直线边缘检测
本程序基于 NI Vision Development 模块,通过 IMAQ Find Straight Edges 函数,在指定 ROI(感兴趣区域) 内检测多条直线边缘。用户可 动态调整检测参数 或 自定义ROI,实时观察识别效果,适用于 高精度视觉检测…...
C#:LINQ学习笔记01:LINQ基础概念
一、LINQ 架构体系 1. LINQ 的核心思想 统一查询模型:对对象、XML、数据库等不同数据源使用一致的语法。强类型检查:编译时类型安全,减少运行时错误。 2. 核心组件 技术数据源典型场景LINQ to Objects内存集合 (IEnumerable)过滤/排序集合…...
15Metasploit框架介绍
metasploit目录结构 MSF ——the metasploit framework 的简称。MSF高度模块化,即框架结构由多个module组成,是全球最受欢迎的工具 是一筐开源安全漏洞利用和测试工具,集成了各种平台上常见的溢出漏洞和流行sheellcode,并且保持…...
NLP如何训练AI模型以理解知识
一、自然语言处理(NLP)的定义与核心目标 1. 什么是自然语言处理? NLP是计算机科学与人工智能的交叉领域,旨在让机器具备以下能力: • 理解:解析人类语言(文本或语音)的语法、语义和…...
【树莓派学习】树莓派3B+的安装和环境配置
【树莓派学习】树莓派3B的安装和环境配置 文章目录 【树莓派学习】树莓派3B的安装和环境配置一、搭建Raspberry Pi树莓派运行环境1、下载树莓派镜像下载器2、配置wifi及ssh3、SSH访问树莓派1)命令行登录2)远程桌面登录3)VNC登录(推…...
python连接neo4j的方式汇总
python连接neo4j的方式汇总 1.官方驱动(neo4j)特点代码示例 2. 全功能ORM(py2neo)特点代码示例 3. 领域驱动设计框架(neomodel-odm)特点代码示例 4. 异步高性能驱动(asyncneo4j)特点…...
Graph RAG 迎来记忆革命:“海马体”机制让问答更精准!
随着生成式 AI 技术的快速发展,RAG(Retrieval-Augmented Generation)和 Agent 成为企业应用大模型的最直接途径。然而,传统的 RAG 系统在准确性和动态学习能力上存在明显不足,尤其是在处理复杂上下文和关联性任务时表现不佳。近期,一篇论文提出了 HippoRAG 2,这一新型 R…...
Spring(三)容器-注入
一 自动注入Autowire 代码实现: package org.example.spring01.service;import org.springframework.stereotype.Service;Service public class UserService {}package org.example.spring01.controller;import lombok.Data; import lombok.ToString; import org.…...
剧本杀门店预约小程序:市场发展下的刚需
在剧本杀爆发式增长下,门店数字化运营的模式正在市场中逐渐展开,线下门店的竞争方向已发生了全新转变! 目前,数字化发展已经成为了消费市场的刚需,利用网络的便捷性提高服务,优化运营,提高自身…...
stable-diffusion-webui 加载模型文件
背景 stable-diffusion-webui 安装完毕后,默认的模型生成的效果图并不理想,可以根据具体需求加载指定的模型文件。国内 modelscope 下载速度较快,以该站为例进行介绍 操作步骤 找到指定的模型文件 在 https://modelscope.cn/models 中查找…...
Ubuntu20.04双系统安装及软件安装(十一):向日葵远程软件
Ubuntu20.04双系统安装及软件安装(十一):向日葵远程软件 打开向日葵远程官网,下载图形版本: 在下载目录下打开终端,执行: sudo dpkg -i SunloginClient(按tab键自动补全)出现报错: …...
华为云 | 快速搭建DeepSeek推理系统
DeepSeek(深度求索)作为一款国产AI大模型,凭借其高性能、低成本和多模态融合能力,在人工智能领域崛起,并在多个行业中展现出广泛的应用潜力。 如上所示,在华为云解决方案实践中,华为云提供的快速…...
printf 与前置++、后置++、前置--、后置-- 的关系
# 前置和前置-- 先看一段代码 大家是不是认为printf输出的是 2 3 3 2 1 1 但是实际输出的是 3 3 3 1 1 1 在这两行printf函数代码里,编译器会先计算 a 和 --a 的值,然后再 从右向左 开始输出。 printf函数中,如果有多个…...
centos7操作系统下安装docker,及查看docker进程是否启动
centos7下安装docker,需要用到的yun命令 (yum命令用于添加卸载程序) 1.设置仓库: yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 2.安装 Docker Engine-Community yum in…...
【向量数据库Weaviate】 和Elasticsearch的区别
Weaviate 和 Elasticsearch 是两种不同类型的数据库,设计目标和应用场景有显著差异。以下是它们的核心区别和适用场景的详细对比: 1. 设计目标与核心能力 维度WeaviateElasticsearch核心能力向量数据库 图数据库(语义搜索优先)全…...
深度学习-大白话解释循环神经网络RNN
目录 一、RNN的思想 二、RNN的基本结构 网络架构 关键点 三、RNN的前向传播 四、RNN的挑战:梯度爆炸和梯度消失 问题分析 示例推导 五、LSTM:RNN的改进 核心组件 网络架构 3. LSTM 的工作流程 4. 数学公式总结 5. LSTM 的优缺点 优点 缺点 6. LSTM 的…...
python3.13安装教程【2025】python3.13超详细图文教程(包含安装包)
文章目录 前言一、python3.13安装包下载二、Python 3.13安装步骤三、Python3.13验证 前言 本教程将为你详细介绍 Python 3.13 python3.13安装教程,帮助你顺利搭建起 Python 3.13 开发环境,快速投身于 Python 编程的精彩实践中。 一、python3.13安装包下…...
RocketMQ的运行架构
目录 1. 核心组件(1) NameServer(2) Broker(3) Producer(4) Consumer 2. 消息流转流程3. 高可用机制4. 扩展性与负载均衡5.容错机制5. 特殊功能支持6. 典型部署架构总结 RocketMQ 是一款高性能、高可靠的分布式消息中间件,其运行架构设计为分布式、可扩展、高可用的…...
从串口通信到内存总线:手把手拆解‘波特率’、‘比特率’与‘总线带宽’的异同与实战计算
从串口通信到内存总线:深度解析波特率、比特率与总线带宽的实战差异 在嵌入式开发和计算机体系结构领域,数据传输速率的计算是工程师日常工作中无法绕开的基础技能。但令人困惑的是,同样的"速率"概念在不同场景下却有着完全不同的…...
3个核心方法实现暗影精灵硬件控制与性能调优:告别原厂软件烦恼
3个核心方法实现暗影精灵硬件控制与性能调优:告别原厂软件烦恼 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 一、痛点解析:原厂游戏控制软件的三大致命伤 1.1 隐私安全隐患:网络连接背…...
从‘调不出来’到‘一次过流片’:折叠共源共栅放大器设计中那些没人告诉你的‘坑’与调试技巧
从‘调不出来’到‘一次过流片’:折叠共源共栅放大器设计中那些没人告诉你的‘坑’与调试技巧 在模拟电路设计的江湖里,折叠共源共栅(Folded Cascode)放大器就像一位身怀绝技却性格古怪的武林高手——性能强悍但极难驯服。许多工…...
突破性解决方案:3步解决Calibre中文路径乱码,实现100%原生中文支持
突破性解决方案:3步解决Calibre中文路径乱码,实现100%原生中文支持 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文&#x…...
AI驱动关键词优化的SEO未来趋势与实际应用解析
本文旨在探讨AI在搜索引擎优化(SEO),特别是关键词优化领域的重要角色。文章分析了AI技术如何通过数据分析和用户行为洞察,帮助企业制定更加有效的关键词策略。AI能够实时监测市场趋势,识别用户意图,并根据这…...
从零到一:STM32手动移植FreeRTOS的工程化实践与源码解析
1. 为什么需要手动移植FreeRTOS? 第一次接触FreeRTOS时,很多人会选择用STM32CubeMX自动生成工程。这确实方便,就像用预制菜做饭,但真正想掌握RTOS内核,手动移植才是"从买菜到炒菜"的完整过程。我遇到过不少项…...
zotero-style:提升文献管理效率的3个核心方案
zotero-style:提升文献管理效率的3个核心方案 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件,提供了一系列功能来增强 Zotero 的用户体验,如阅读进度可视化和标签管理,适合研究人员和学者。 项目地址: https:/…...
告别手动操作!用Word宏/VBA实现doc批量转docx的隐藏技巧
职场效率革命:Word宏/VBA零代码实现文档格式批量升级 每天面对堆积如山的.doc文件,行政文员小张总要手动打开每个文件另存为.docx格式——这个机械操作不仅耗时费力,还容易遗漏文件。其实微软Office内置的自动化工具能完美解决这个问题&#…...
ai全程护航:让快马智能助手帮你搞定proteus安装与初学难题
最近在折腾Proteus仿真软件时,发现从安装到入门会遇到不少"坑"。好在发现了InsCode(快马)平台的AI辅助功能,整个过程变得轻松多了。这里分享下如何用AI搞定Proteus全流程难题的实践心得。 智能安装诊断 第一次安装Proteus时,遇到许…...
Python异常处理最佳实践:从原理到实践
Python异常处理最佳实践:从原理到实践 1. 背景与动机 在Python编程中,异常处理是一个重要的编程实践。良好的异常处理可以使程序更加健壮,提高代码的可维护性和可读性。然而,许多开发者在处理异常时存在一些常见的问题,…...







