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…

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 (5) Shader优化

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

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的连续正数序列

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

反走样技术相关文章

https://zhuanlan.zhihu.com/p/28800047 https://zhuanlan.zhihu.com/p/57503957 https://zhuanlan.zhihu.com/p/33444125 https://zhuanlan.zhihu.com/p/33444429 走样的原因及其分类 说到走样,首先要说的就是采样。这也算是很多图形学专著中提到反走样相关技…

求n的阶乘的算法框图_单片机常用的14个C语言算法

问:怎么每天看到这种文章?答:只需搜索公众号"51单片机学习网"免费关注算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述&#xff…

LeetCode 286. 墙与门 多源BFS和DFS

思路1&#xff1a; DFS&#xff0c;对于每个门进行一次DFS搜索&#xff0c;记录每个位置对每个门的距离&#xff0c;当有更小距离的门时更新这个数值 public void WallsAndGates(int[][] rooms) {for (int i 0; i < rooms.GetLength(0); i){for (int j 0; j < rooms[i]…

贝塞尔曲线

文章参考于&#xff1a;https://www.jianshu.com/p/0c9b4b681724 https://gameinstitute.qq.com/community/detail/129188 贝赛尔曲线的前世今生&#xff1a; 贝塞尔曲线&#xff0c;这个命名规则一眼看上去大概是一个叫贝塞尔的数学家发明的。但&#xff0c;贝塞尔曲线依据…

如何控制局域网网速_单臂路由|N1盒子(OpenWRT)单线多拨实现网速叠加

受于某些现实条件&#xff0c;有些同学苦于家里的网络带宽太小无法尽情冲浪。如何在不额外花钱升级宽带的情况下提升家里网络呢&#xff1f;且看一个盒子加路由器即可实现网络单线多拨&#xff0c;成倍提升网速完成网速叠加。题图是我家里的路由器加N1盒子。前置条件光猫有超级…

linux离线安装redmine_Linux 下一款非常好用的翻译软件

前面有一个半月的时间&#xff0c;我非常详细且非常基础的介绍了 Ubuntu 18.04 desktop 桌面系统的安装和基本使用&#xff0c;在知乎上也开了一个专栏《Linux 漫游之旅》&#xff0c;上面记录了所有的文章&#xff0c;这个专栏的目的呢是手把手教新接触 Linux 操作系统的朋友如…