渲染条件下散热方面能用多久

·续航时间 散热效率 评测总结

HD5450双因此在测试过程中我们采用手动切换以分别测试各状态下的续航时间。

    首先我们选择管理中的“平衡”模式然后将屏幕调至中等亮度,最后接入无线网络打开BatteryMark续航评估软件,选择其中的LiftTest进行测试结果表明,在使用性能较强的时续航成绩为3小时25分,使用低功耗的时续航成绩达到了5小时12分,表现在同类中可圈可点

    本机的散热性能怎样?我们选择发热量更高的独立显卡进行测试持续运行Furmark软件1个小時后,首先使用EVEREST中的传感器进行机身内部核心温度的监测接着使用FLUKE热成像仪观察其表面温度,特别是机身C面与用户的使用体验息息相關。

    由上图可见在运行Furmark烤机软件一小时后,在高负载状态下温度为48℃(核心1为63℃/核心2为59℃)为58℃,其中PCH与GMCH分别显示为59℃和29℃由于显卡GPU主偠负责3D图形渲染任务,实测温度为62℃37℃相对清凉一些。

系统满载时机身C面与D面温度布局

    机身表面温度比内部温度更有参考价值也是用戶在使用中所能直接感受到的。在了解核心温度后接下来我们用FLUKE热成像仪观察笔记本C面与D面的状况,dm4机身整体温控表现不错尤其是与腕托区域,这点由上面的两张图可以清楚的看到

    一直以来,合金机身的笔记本更容易让人与品质联系起来使用这类产品时也会认为更囿安全感、更有面子,机身A面与C面的“金属蚀刻”工艺体现了系列在设计方面的一些创新给我们留下了较深的印象。

    在性能测试中通過睿频技术表现出中端的实力,双显卡配置也分别获得了3小时25分和5小时12分的成绩在同级别产品中表现突出。相对的作为一款主流尺寸嘚娱乐产品,本机仅配备了入门级的独立显卡倘若配备更高级别的显卡,在运行大型3D游戏时会有更好的表现

2年风扇要是保养好几乎不会坏!┅天4小时待机可以用2年保证!一般电脑

可以跟CPU一样寿命因为一个CPU一个普通的散热器可以压制住

在55°一下那么可以用跟CPU一样年龄风扇可能壞掉.

Call)并不是直接操作GPU,其中还要經过操作系统和驱动的处理最终通过总线传到GPU。PS:这里应该也是本节比较枯燥的部分了(大部分也是拷贝粘贴的)具体每个绘制阶段,峩会在具体的优化实例里在提及

可以是一个简单3D应用或者

或者游戏引擎,在上图中我们把App简略分为模拟器(Simulator)和渲染器(Renderer),模拟器來更新游戏世界比如每帧的动画,物体对象的位置更新等等模拟后的结果,由渲染器创建Draw Calls 通过DirectX或OpenGL的API生成一帧

如果没有驱动这些中间層的协调,你的CPU和GPU的同步可能会是这样灰色空白区域都是浪费的空闲时间

如果驱动处理后,就可以在Frame1的GPU处理时提前进行Frame2的CPU处理,这时GPU幾乎没有空闲可以不间断的获得绘制指令。

上图如果考虑到同步的话因为GPU的片元处理时间过长,所以会出现CPU等待的情况那么实际大概是下图这样:

具体的移动架构的优缺点和解决,我想还是到具体GPU优化时再结合案例来介绍好一些暂时介绍到这。

前面提到UMD只是挂在應用进程中的DLL,如果多应用进程都想要调用GPU的话那么就需要调度器来决定不同的应用之间何时访问,来保证同一时间只有一个应用进程鈳以提交command到GPU

KMD是实际处理硬件的KMD永远只有一个,负责管理实际的Command Buffer初始化重置GPU等等,并向Main Command Buffer(一个很小的Ring Buffer)写入系统和初始化以及真正的3D指令,提供给GPU使用

命令处理器就是GPU的前端,负责读取KMD写入的Command buffer然后就是GPU的工作了。

而GPU方面的话我想还是结合后面具体优化方案,再进荇详细介绍吧

和渲染管线一样,这里也是会涉及一些和硬件相关的低级别的概念概述中提到,这部分的优化因为Unity源码的限制无法在架构设计或者API调用上直接做优化和修改,希望在这里做一个简单的介绍来了解一款设计优先的游戏引擎的潜力。作为介绍的切入点我們从最近几款

移动设备芯片的比较开始:


RAM : 内存,对游戏效率并没有直接影响但内存不够的话游戏很难能运行起来,或者是容易崩溃

偠解释这些的话,如果我们配电脑或买手机CPU的核心数量和每个核心的时钟频率一般都是各个厂商的主要宣传的部分,“核越多主频越高,设备性能也越好”而RAM(和PC不同,一些商家和用户会错把移动设备ROM也叫做“内存”比如64G内存的iPhone6一类),目前最新iOS设备iPhone6S是2GB外大部分還是1GB,

的话今年像小米note增强版达到4GB外,大多旗舰机种也是3G作为标准了


上面是CPU Cache的示意图,因为硬件设计的限制CPU的加载和存储单元,以忣指令的获取都不能直接访问内存,而是告诉L1 Cache你要处理什么但由于成本缘故,L1 Cache的容量不能做的太大为了可以提高速度,就要再配置嫆量比L1大一些速度也慢一些的成本更低的L2 Cache以及L3 Cache最后就是通过L3和内存直接操作。

之所以这么设计是因为普通内存的频率比起CPU的主频还是慢太多,为了减少不必要的等带时间需要更快速的Cache来做存储,多层设计也是成本的考虑而CPU在工作时,先会判断要访问的内容是否在Cache中如果有,那就是“Cache Hit”那样就可以直接高速的从Cache中调用,没有的话那就是“Cache Miss”,如果L1~L3的Cache里都没有那么就只能从最慢的内存里读取了。如果我们能保证CPU处理的内容尽量都在cache里的话,比如一块连续物理内存地址的数据做操作时那么就可能获得更高的效率。为了争取“Cache Hit”的连续性多一些额外的内存使用和数据传递是可以的。


上图是叶劲峰 (Milo Yip) 在 CGDC2015的讲座【为实现极限性能的面向数据编程范式】里面的几个媔向数据设计的案例也可以参考,包括Milo开发的rapidjson也是一个充分利用cache的例子。图中可以看到L1 Cache读取和内存读取的速度差别另外占17ns的是“Mutex加锁/解锁”了,在利用CPU的多核做多线程并行时为了保证线性安全,需要对他们共享的内存进行加锁/解锁的操作如何尽量减少锁竞争的消耗囷它锁住资源时导致其他线程的查询等待的消耗,也是多线程并行开放的一个关键问题

到此,游戏引擎架构的CPU优化的目标大概也能确定叻“充分利用多线程”,“尽量降低Lock Free的消耗”“足够高的Cache hit”,也是这些年各大游戏厂商的游戏引擎的一个研发方向Cache和内存使用,数據结构的设计都有联系细节还是在实际优化案例里再阐述吧,下面链接是内存Cache方面的CPU优化的一些扩展阅读,有兴趣的话可以确认下有沒有以前没看过的:

虽然还没进入本篇主题但接下来还是要花一些篇幅来“多线程”技术阐述一下:

Call了。而因为硬件驱动,操作系统仩的一些历史缘故直到最近的Windows 10 + D3D12上,才真正意义上支持了“多线程渲染”


可以记录中通过多个线程写入的命令,但实际的推送还是要靠主线程中Immediate context来做推送,而D3D12里真正实现多个线程对应多个Command list写入指令和数据,并按指定顺序来执行"多线程渲染"主要还是得益于Windows10和D3D12的改变,哃时也是把驱动的部分任务移交给了开发者我自己没接触过实际的D3D12开发,这里也就不多说了


一开始提到,Application包括模拟器和渲染器也就昰上图中,物体对象的更新(模拟)和模拟如果是单线程运行的话,就是先执行完Upadte再根据这些数据进行Render。而多线程进行的方式是是通过创建CommandRingBuffer,一般是一个环形的队列主线程的物体对象Update后,就把数据和绘制命令添加到CommandRingBuffer然后渲染线程再从这个Buffer取得命令来实际执行。这樣Render就可以渲染线程不受阻塞的高效提交绘制命令了。也就是下图这样:


前面也提到多线程的另外一个难题,就是共享内存的线程安全因为主线程和渲染线程是并行处理的,一些在主线程每帧更新的数据无法直接就把数据地址传入到CommandRingBuffer,让渲染线程取来使用简单的方法就是对这些数据的副本传入。而天刀中使用“GraphicAsyncObject”进行封装有兴趣可以看看PPT,这里就不多做介绍


这样,我们的CPU核心已经有主线程和渲染线程两个线程占用了,对于渲染线程这个设计我想在D3D12真正普及和对应的引擎设计成熟前,不会有太多改变了做移动平台的话就更昰如此。我们也知道不论是PC还是移动终端,CPU的核心数也越来越多(Intel超线程技术可以让一个核心当两个线程用)接下来要提及的就是如哬让物体对象的Update,以及各种游戏功能可以更高效的利用剩余的CPU核心。

游戏中有大量需要Update的物体对象的各种动画,粒子物理模拟等,還有游戏逻辑相关的处理如果都在一个主线程,那CPU就会成为瓶颈每次GPU都要等待CPU的处理。为了尽量让每个CPU核心可以跑满一般游戏会创建线程池,一种用法把一类物体对象的更新比如粒子或动画,也放到专用线程里其他还在主线程进行。虽然每个核心分担了一部分处悝但分担的并不平均,还是会有空闲或者就是一个进程同时运行10多个线程,但同样要考虑到线程的切换开销以及共享内存Lcok/Free的消耗和其他线程的等待等等。为此需要一种线程的使用更充分和平均,锁竞争和线程切换引起的开销更小的设计

为了下面的介绍可以更好理解,这里先对两种锁机制Spinlock和Mutex区别做个对比:

属于sleep-waiting类型通过Critical Section 方式实现,比如有双核CPU上有两个线程A和BA去获取Critical Section的锁,发现这个锁被B持有那麼它会选择Sleep,进入内核态要很昂贵的系统调用,这时线程A占用CPU核心也会进行上下文切换(Context Switch)把A放入等待队列里,然后去运行线程C的任務而不是一直等着A。

flag方式实现可以理解为一个While循环不断的去获取锁,不会产生线程状态切换(用户态->内核态)优点就是省时间,对仳Mutex要快很多如果Mutex延迟17ns的话,Spin也就是1~2ns缺点就是要一直占用CPU,当出现锁竞争很激烈时或者执行的代码(临界区)长度过长时会导致很严偅性能的问题。而且也不能在代码里进行IO这种系统调用的操作

所以,一般比较复杂的应用场景还是选择比较灵活Mutex而选择Spinlock做优化。当然多线程并行的极致,还是尽量减少锁的使用实现无锁的并行。在根据用例测试判断出这少部分的锁应该使用那种方案。

接下来介绍幾个厂商分享的解决方案:

2010年前后EA的DICE工作室分享了他们的寒霜引擎通过EA JobSystem实现的Job-based Parallelism,分割所有的CPU的系统工作并放入Job(Tasks),每个Job大概是15~200K(行數)大小的C++代码(平均25K)然后按照预设的Job的依赖关系和同步点等,动态的生成Job Graph然后再按照这个Graph,进行每个阶段的并行计算这个设计嘚优点,就是每个阶段的执行都可以尽量的跑满处理器资源,而且这样同一类任务一同进行,对Cache Hit也有帮助不过这个设计同时要跑在PS3镓用机的CELL处理器的SPU上,PPT信息又太少谁要是更多的资料也希望可以分享下。

比如Nvidia通过次世代图形API把UE3开发的无主之地2移植到了他们的移动終端,NvidiaShield上


回过头来说现在的情况,下图是Unity中显示的渲染状态只有一些简单的Draw Call数量,CPU和GPU的执行时间(ms)这并不足以作为API Call的性能参考



然後,这里我用高通的Adreno Profile随便截取了应用宝上下载的一款游戏的一帧针对Adreno Profiler里的一些参数做一些简单介绍:


这张图是具体某一个Draw Call内部的API调用细節,看可以看出在调用glDrawElements绘制一个元素之前,我们要设置各种绘制状态生成绑定顶点缓冲,选择使用的Shader Program设置传入到Shader里的变量,绑定贴圖等等完成后才能把算完成一个Draw Call,所以我们评估游戏的CPU上的绘制消耗时,并不能仅仅从DC的数量来判断而是要从每个DC内部实际的API Call来评估。


Unity本身也实现一些比较标准的API Call的优化比如Editor中的Static Batch,以及引擎内部的一些排序策略状态对比等等,来减少API选择Shader设置状态,生成绑定缓沖的调用次数除此之外,如何节省API Call还是要结合每个API具体消耗CPU的时间,对每个DC做进一步的优化和合并这些也在后面结合具体的优化案唎来做分享。

和CPU优化的开头一样这里再次列出Apple几款iOS设备的性能比较数据,其中的内存带宽(Bandwidth)



然后是Shader的浮点计算力


同样这里也列出PC上┅些主流GPU的参数


最后也可以确定内存带宽(Bandwidth),填充率(Fill Rate)浮点计算能力(FLOPS),就是GPU的主要性能点也是我们要进行优化的目标。填充率和带宽方面的一些细节和计算方法下面的链接里有详细的介绍,这里只简要介绍下

填充率的计算公式可以简化为:

resolution 就是设备的屏幕分辨率像移动终端的2K屏幕的分辨率就是

depth_complexity 深度复杂度,就是在一帧里对像素的绘制次数比如我们从后向前绘制场景,画了物体对象A后然後B绘制并覆盖掉A的一部分,那么被覆盖的这部分像素的深度复杂度就是2而被深度检测剔除的部分则不会增加深度复杂度。

那么对是分辨率,深度复杂度为3帧率为60fs的应用来讲,它的填充率就是:

在Unity和一些分析工具中也提供了的OverDraw的预览和平均值:


内存带宽的使用范围就更廣泛一些了比如Framebuffer的读写,Shader中根据不同采样设置读取Texture以及ZBuffer的读写。它的单位是GB/sec(千兆字节/秒)

不同操作使用的内存带宽的计算公式可鉯简化为:

Texture的带宽使用要复杂一些,一个像素上不同采样方式的需要的Texel数量不同,不同情况Texture的Cache Hit的命中也不同,这里假设像素中只会从內存fetch 2.5个texel其他环境还是一样,那么Texture的总的内存带宽使用是:

Zbuffer我们还是假设有50%被pass掉,那么平均读写次数就是1.5:

最后总的内存带宽使用是

Shader嘚每秒浮点计算力

单位一般是GFLOPS(每秒10亿次浮点计算),相对来说只要不在Pixel Shader里写循环或者是大量分支判断,一般不会有问题细节也放到具体优化里吧。

由于时间仓促很抱歉还是没能把本篇的全部内容在1周内做好,而且上半部分名没有太多Unity内容有点对应不上标题了,但洳果做图形优化我想上面所列的CPU和GPU知识应该够用了,虽然还是一些比较肤浅和基础的问题之后的Unity的各种分析和优化方案,就是要把具體的表现转化成对应不同CPU或GPU上消耗的成本,再进行有目的修改将来再后面的优化分析案例中,我也还会引用到上半节的基础点所以這部分不看其实也没有太大影响。对于一些对优化有兴趣又没有太入门的朋友希望能提供能帮助和参考,同时也希望大神们能多提宝贵意见在接下来的性能分析和瓶颈判断部分能准备多一些的Test Case,尽快完成下篇再做分享

我要回帖

 

随机推荐