c# imager让图片有圆角unity_从美术的角度理解Unity的D.O.T.S系统(第三篇 Job+Burst)...

前面的话:现在介绍ECS,DOTS的文章越来越多,真正的大佬都浮出水面,从发展历史到代码结构,再到细节怎么写,都非常详细,知乎上很多大佬在几年前就对Entitas做了很多介绍(最早的ECS这种代码架构的插件)都是非常值得学习、研究。

想了很久该从什么角度来写,作为一个TA,就还是从美术的角度出发,说说一些奇奇怪怪美术很少机会去了解的知识吧,希望能给大家一点点启发

前两篇传送门:

从美术角度理解Unity的D.O.T.S系统之一(概念篇)

公众号:游戏技术动画师从美术的角度理解Unity的D.O.T.S系统之一(概念篇)

从美术角度理解Unity的D.O.T.S系统(第二篇ECS系统)

公众号:游戏技术动画师从美术的角度理解Unity的D.O.T.S系统(第二篇 ECS系统)

正文开始:

1. DOTS 三大部分之二 ——  Job System 任务管理系统

eb046a2c84b754294152c9fdd07dad46.png

一句话:从cpu内核层面,对线程、执行内容做优化

什么是线程???(大佬可以掠过这里)

什么是线程?官方介绍太多,定义什么的就不贴在这里了,我们拿生活中的实例来类比线程:

  • 1. 高架桥,上、下通车,这是双"线程"

  • 2. 渲染农场在渲染的时候,n个机器渲染,每一个机器都是一个单独的线程,n个机器就是多线程渲染

  • 3.  机场自助买票、取票的机器,每个机器独立工作,一堆机器对于购票系统算是多"线程"

这些多线程的例子共同特点就是:并行、独立做事情,每条"线程"之间工作互不影响

但是,所有的多线程工作,都需要解决一个问题,就是当主线任务发出支线任务时、以及支线任务结束回到主线任务时,可能出现的重复、丢失、拥堵的问题,例如上面的几个例子:

  • 1. 高架上的车子汇入桥下的时候,怎样避免拥堵?

  • 2. 每个机器渲染好的图片存在主机器的文件夹中,怎样避免重复、重名的图片?

  • 3. 机场机器上显示的机票剩余数量,怎样保证准确?

解决方案无非是:

  • 1. 强制顺序,比如增加红绿灯,让汇入的车流分段进入主干道,虽然慢,但是保证准确汇入,主线不拥堵

  • 2. 加锁。当渲染农场中某个机器确定要渲染一张图片的时候,这张图片就被锁定了,不能再被其他的机器拿到。

  • 3. 增加延时。为了保证主线程中的数据准确性,分线程在修改数据的时候,需要输入验证码或者很多操作,来延迟用户对主服务器的操作、修改,从而降低错误的风险

----------------------------------------------

同样的,计算机里面的多线程,基本上也是类似的原理。

计算机中,主线程的任务可以分配给其他线程,线程之间理论上互不影响,但问题一般发生在任务回到主线程的时候,当主线程拥堵、卡顿,该如何处理?

在互联网的世界中,各种大数据、高并发的情况,线程的问题会在这样的情况下被放大,极端情况下处理不好,轻则发生用户数据回滚,重则可能整个数据库被击溃。

到这里,只能让大家对多线程的概念有个大致了解,而多线程所要解决的问题,是每个公司服务端大佬们需要解决的问题,在这里我这个小TA真心不敢乱说

我们说回Unity的Job System,理论上它就是用来帮助解决这些线程问题,主线程、支线线程之间的分配、整合、调用,以及debug,Unity开发了一套job system的API接口供程序大大们使用,从而降低开发、维护成本。

b040bc1f5744a75c6b001455b3bb8f87.png      API的接口,从代码层面找到最合适的检索、排序、组合的方式

总结,使用Job System效率提升35倍

--------------------这里增加个冷知识--------------------

问:目前纵观整个互联网,需要处理数据量、高并发最大最大最大的app是哪个?

(...... 文章最后给出答案)

2. DOTS 三大部分之二 ——  Burst Compiler 编译系统

(这个编译系统就更加硬核向了,,,)

首先我们都知道,Unity底层是C#写的,而引擎经常会有编译的时候,这就是把当前的代码,编译成机器代码。

做个解释:什么是机器代码?cpu这样的硬件是如何识别数据的?

硬件的本质上就是一个二极管,一个个正、负极的组合,从而识别二进制数字。我们的C#这样高级语言,需要降维成低级的二进制语言,让机器真的认识的语言才能在硬件上运行。

所以,一句话,Burst Compiler编译系统就是编译出高度优化的机器代码

d472c58cf879b76a1e6ab1551a16ecd7.png

图片中有LLVM、SIMD这些特别特别程序、硬核向的名词,大概理解一下就好(实在不理解也没什么关系)

LLVM,一种后端编译的框架系统,把前端的源代码(C#)都翻译成中间代码(IR),然后优化这个IR代码,再编译成机器码。(可以理解为一种平台)

SIMD是一种汇编指令,全称Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。从对内存的访问上优化设计、工作模式,从而达到快速反馈的目的

在Unity上如何使用Burst?

非常非常简单,只需要在需要的代码头加上一句 [BurstCompiler] 即可执行Burst

另外,使用Burst,不一定需要跟Job System,如果只用Unity新开发的数学运算API,就可以使用Burst进行编译加速

总结,使用Burst效率提升2250倍

3. 系列文章,Unity中的D.O.T.S介绍总结:

DOTS的三个部分:ECS + Job + Burst,如果一个项目使用了这三个功能,并且游戏类型适合,程序大大给力的话,那么游戏运行速度将快的飞起,性能将毫无压力。

不过理论归理论,真正在国内实操起来还是有很大难度,需要时间、项目、人力的积累,但是n年之后,如果我们还在游戏行业,还在使用unity,或许这套系统已经成为项目标配了。

到这里,我们已经把D.O.T.S.的所有组成部分以及大致概念都说明了,其实每一小点都可以引发出很多知识点,甚至成为一门学科。而且每一个部分都是有行业大佬可以深入发言讲解的,所以这里的文章,就是从一个普普通通技术美术的角度出发,记录所见、所得、所想、所思。

希望这个小系列给大家点帮助,有疑问请留言,有问题请指正!

(后面继续开新坑)

----------------- 回答奇怪问题的时候----------------

问:哪个app并发最高?

铁路12306(并不是某宝的双11)

因为某宝面对的是那一天的上千万用户排队买东西,而12306的服务器,面对的是成百上千个千万高并发的抢票软件!所以我也不好意思吐槽12306了,,,,

-------------------------------------------------------

参考:

https://www.youtube.com/watch?v=dDjsS4NPqFU

https://www.youtube.com/watch?v=QbnVELXf5RQ&list=RDCMUCG08EqOAXJk_YXPDsAvReSg&start_radio=1&t=44

Unity社区直播 UUG线上系列 雨松MOMO直播:DOTS从原理到应用 - Unity Connect

Unity DOTS技术详解 - 宣雨松_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值