Unity 2017 Game Optimization 读书笔记(2)Scripting Strategies Part 2

1. Share calculation output

和上一个Tip很像,可以缓存计算结果或者各种信息,避免多次重复的计算,例如在场景里查找一个物体,从文件读取数据,解析Json等等。

容易忽略的点是常常在基类了实现了某个方法,在子类里只是不断的使用而不再去注意基类里的这个方法是否消耗很大,如果遇到性能问题可以通过Profiler定位函数,进而优化,作者的建议是除非真的遇到了性能瓶颈,否则提前的优化并没有必要。个人理解是过度的优化未必是合理的,会影响代码的可读性以及简洁性,需要和性能达到合理的平衡。

 2. Update, Coroutines, and InvokeRepeating

我们经常使用Update去处理一些事务,但是其实有很多时候并没有必要需要这么频繁(每帧)比如下边这个例子:

并没有必要每帧都去调用AI系统处理,可以这样写减少调用频率,降低CPU开销

 也可以使用Coroutine来完成这个功能,千万别搞混Coroutine和线程,它俩完全是俩码事,Coroutine是跑在主线程的。

这么写的好处就是可以根据_aiProcessDelay变量随心所欲控制调用频率,但是也有很多缺点。

1.Coroutine 会有额外的CPU开销,大概是3倍于普通函数,而且会有额外的一些内存消耗(用来存储状态变量等)。Coroutine会不停的调用yield,这玩意也会不断的产生开销,所以我们要权衡是否降低调用频率带来的好处值得这么干。

Coroutine 消耗大概是3倍
Coroutine消耗大概是3倍
​​​​​​

2.一旦初始化后,Coroutines就放飞自我了,Component甭管是否disabled掉,它们会一直的在调用。

3.当GameObject 变成inactive时(whether it was set inactive or one of its parents was),Coroutine 会自动挂掉并且再也不会自动启动,即使重新变成active也没辙,停了就别想让我自动活过来。

4.改成Coroutine只是降低了频率,如果函数消耗特别大,即使调用次数变少,被调用的那一帧依然会产生很大消耗,造成帧率下降。所以对于是因为函数消耗大的情形,使用coroutine也没鸟用的,只能去优化该函数降低消耗才是正途。

当使用Coroutine时,有多种yield 种类可以供我们选择。包括WaitForSeconds 和 WaitForSecondsRealTime等(WaitForSecondsRealTime不受Time.Scale影响)。如果Coroutine够简单,可以直接改造成使用InvokeRepeating,它使用起来更简单而且消耗会稍微小一丢丢。

InvokeRepeating和Coroutines的最主要区别是InvokeRepeating已经完全独立于MonoBehaviour和GameObject的状态,放飞自我的更狂野,想停下InvokeRepeating, 只能通過CancelInvoke函数或者直接Destory掉相关的Monobehaviour或者GameObject,disable掉Monobehaviour或者GameObject都拦不住这个已飞起来的InvokeRepeating

3. Faster GameObject null reference checks

GameObject 和 Monobehaviour对于传统的C# object是很特殊的,它俩在内存中会有两种形式,一种是存在于Managed memory(和C#代码存放的内存一样 Managed Code),一种是存在于Native memory(Native Code),更多的原理将在第八章中介绍。这里我个人解释几句,Unity的内存可以分为两种,托管堆(Managed),和Native。托管堆是我们写的C#代码,Native是Unity底层的代码,Unity底层其实是C++写的。像GameObject 和 Monobehaviour这种由Unity提供的类,它们将会在两种内存中存在,数据可以在这两种内存中传输,但是每次传输都会有开销。这种行为可以叫做Native-Managed Bridge,就想Native和Managed两部分内存的桥梁一样,当需要从这部分内存传到另一部分时,就会产生内存数据的copy,也会需要GC。

对于判断GameObject是否为Null这件事,一种简单写法是:

但是这种写法会触发Native-Managed Bridge,GameObject从native到managed。所以开销会大一些。更有效的写法是:

但是其实经过测试,即使直接用null进行判断,速度也没慢到哪去,只是快和更快一点的区别,真的是了胜于无。所以这里作者原话意思是也没多点性能提升,但是重要的是引入了Managed和Native的概念,这个是非常重要的,在之后会非常经常的提及,因为内存的优化主要就是跟这俩货打交道。

 

 

 

 

 

 

 

 

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

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

相关文章

Unity 2017 Game Optimization 读书笔记(3)Scripting Strategies Part 3

1.Avoid retrieving string properties from GameObjects 通常来讲,从C#的object中获取string 属性没有额外的内存开销,但是从Unity中的Gameobject获取string属性不一样,这会产生上一篇讲到的 Native-Managed Bridge(Native内存和…

Unity 2017 Game Optimization 读书笔记(4)Scripting Strategies Part 4

1.Avoid Find() and SendMessage() at runtime SendMessage() 方法和 GameObject.Find() 相关的一系列方法都是开销非常大的。SendMessage()函数调用的耗时大约是一个普通函数调用的2000倍,GameObject.Find() 则和场景的复杂度相关,场景越复杂&#xff0…

团队行为心理学读书笔记(1)

阿伯拉罕马斯洛需求五个层次: (1)生理需要:食物、水、住所、性满足等方面的需要。 (2)安全需要:保护自己免受身体和情感伤害的需要。 (3)爱和归属的需要:渴…

团队行为心理学读书笔记(2)招聘背后的心理学

招聘时,不要只看应聘者的知识和技能 美国著名心理学家麦克利兰1973年提出了一个著名的素质冰山模型。所谓“冰山模型”,就是将人员个体素质的不同表现形式划分为表面的“冰山以上部分”和深藏的“冰山以下部分”。其中,冰山以上部分包括基本…

团队行为心理学读书笔记(3)领导力背后的行为心理学

有小缺点的主管,在下属眼里更有魅力 一位心理学教授曾做了一个关于管理者魅力的实验,他给被测试的对象播放了四段情节类似的访谈录像:出现在第一段录像里的是一个非常优秀的成功人士,他成就辉煌,面对主持人的采访&…

团队行为心理学读书笔记(4)带队伍背后的行为心理学

成就高效团队的基础:信任 信任具有三个特征:第一,信任者承担着一定的风险,信任者要承受被信任者失信的损失;第二,被信任者的行为不在信任者的控制之内;第三,如果某一方违约&#xf…

Unity HDRP中的光照烘焙测试(Mixed Lighing )和间接光

部分内容摘抄自:https://www.cnblogs.com/murongxiaopifu/p/8553367.html 直接光和间接光 大家都知道在Unity中,我们可以在场景中布置方向光、点光、聚光等类型的光源。但如果只有这些光,则场景内只会受到直接光的影响,而所谓的…

聊聊Unity项目管理的那些事:Git-flow和Unity

感谢原作者https://www.cnblogs.com/murongxiaopifu/p/6086849.html 0x00 前言 目前所在的团队实行敏捷开发已经有了一段时间了。敏捷开发中重要的一个话题便是如何对项目进行恰当的版本管理。项目从最初使用svn到之后的Git One Track策略再到现在的GitFlow策略,中…

聊聊网络游戏同步那点事

写的非常好的一篇博文,转载自https://www.cnblogs.com/murongxiaopifu/p/6376234.html 0x00 前言 16年年底的时候我从当时的公司离职,来到了目前任职的一家更专注于游戏开发的公司。接手的是一个platform游戏项目,基本情况是之前的团队完成…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics(1)

The Rendering Pipeline 渲染表现差有可能取决于CPU端(CPU Bound)也有可能取决于GPU(GPU Bound).调查CPU-bound的问题相对简单,因为CPU端的工作就是从硬盘或者内存中加载数据并且调用图形APU指令。想找到GPU-bound的原因会困难很多&#xff…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics(2)

Lighting and Shadowing 现代的游戏中,基本没有物体能在一步就完成渲染,这是因为有光照和阴影的关系。光照和阴影的渲染在Fragment Shader中需要额外的pass。 首先要设置场景中的Shadow Casters和Shadow Receivers,Shadow Casters投射阴影&…

Unity 2017 Game Optimization 读书笔记 The Benefits of Batching

batching(合批) 和大量的描述一个3D物体的数据有关系,比如meshes,verices,edges,UV coordinates 以及其他不同类型的数据。在Unity中谈论batching,指的是用于合批mesh数据的两个东西&#xff1a…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (3)

Rendering performance enhancements Enable/Disable GPU Skinning 开启GPU Skinning可以减轻CPU或GPU中Front End部分中某一个的负担,但是会加重另一个的负担。Skinning是mesh中的顶点根据动画中骨骼的当前位置进行计算,从而让角色摆出正确的姿势。 …

Unity手游开发札记——布料系统原理浅析和在Unity手游中的应用

原文:https://zhuanlan.zhihu.com/p/28644618 0. 前言 项目技术测试结束之后,各种美术效果提升的需求逐渐成为后续开发的重点,角色效果部分的提升目标之一便是在角色选择/展示界面为玩家提供更高的品质感,于是可以提供动态效果的…

行为树(Behavior Tree)实践(1)– 基本概念

原文:http://www.aisharing.com/archives/90 行为树(Behavior Tree)实践(1)– 基本概念 自从开博以来,每天都会关心一下博客的访问情况,看到一些朋友的订阅或者访问,不胜欣喜&…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (4)

Optimizing Unity UI 本章讲探讨一些能够提升UGUI性能的优化方法。 1.Use more Canvases 一个Canvas的主要任务就是管理它层级下的所有UI元素,并且通过Draw Call去渲染它们。其中Canvas一个重要的事儿就是对这些元素进行合批来减少draw call。但是如果对Canvas或…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (5) Shader优化

Shader optimization Fill Rate和 Memory Bandwidth开销最大的地方就是Fragment Shader。开销多大取决于Fragment Shader的复杂程度:多少纹理需要采样,多少数学计算函数需要使用等等。GPU的并行特性意味着在线程中如果任何地方存在瓶颈,都会…

团队行为心理学读书笔记(5)执行力背后的行为心理学

违纪行为若没有得到及时惩处,就会蔓延 破窗效应 美国斯坦福大学心理学家菲利普辛巴杜在1969年进行了一项实验,他把两辆一模一样的汽车停在了不同的两个社区,其中,一个社区是加州帕洛阿尔托的中产阶级区,另一个则是治…

Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (6)

1. Use less texture data 这条优化技巧非常直接,减少texture的数据量,减少分辨率或者降低位数,虽然可能会降低渲染质量。但是通常使用16-bit textures并不会明显的感觉到渲染效果下降。 MipMap技术可以有效减少VRAM和Texture Cache之间来回…

LeetCode 面试题57 - II(剑指offer) 和为s的连续正数序列

今天毕业五年了,一直忙于工作和享受,自从当年找完工作后就一直没有再刷过题,作为搬砖的码农,觉得还是应该养成长期刷题的习惯坚持下去。之前坚持了每天被一会单词,如今雅思一本也快看完了,从今天开始准备在…