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

1.Avoid Find() and SendMessage() at runtime

 SendMessage() 方法和 GameObject.Find() 相关的一系列方法都是开销非常大的。SendMessage()函数调用的耗时大约是一个普通函数调用的2000倍,GameObject.Find() 则和场景的复杂度相关,场景越复杂,调用自然越慢。有时候在场景的初始化时,比如Awake和Start函数中调用Find函数是可以理解的,但是即使是这样,也应该是用来获取一定已经存在于这个场景的objects并且场景内的物体最好越少越好。在runtime运行时调用这些函数,都将会带来很大的开销,从而有可能会引起帧率下降。

 依赖Find()和SendMessage()函数是架构设计代码设计中一个典型不给力的表现, 这通常是初学者经常犯的错,尽管Unity已经在文档中一遍又一遍的建议大家避免使用这些函数。

尽可能的不使用这些函数甚至打破了我们之前的原则:只有需要优化的时候再优化,不要过度的提前优化。为了避免使用这些函数,我们应该在代码的原型阶段就设计好。

让我们举个栗子,下边的是一个简单的EnemyManagerComponent类,它的作用是存储一个GameObject的List,用来表示游戏中的敌人,并且提供一个KillAll()方法在需要的时候去销毁他们

 之后我们会在Scene中放置一个GameObject并且加入这个脚本,把这个物体叫做EnemyManager。

下边的代码会通过Prefab生成一些敌人,并且通知EnemyManager它们的存在

 在循环体内初始化数据和调用函数是一个很危险的行为,这会有可能带来很差的性能表现,但我们调用的是开销很大的函数例如Find()时,我们应该尽可能的寻找方法减少调用次数。因此,一个优化点就是用一个本地变量用于保存,将函数调用提到循环外边。另一个很重要的优化是用GetComponet()代替SendMessage(),这开销会小很多。优化后的代码如下:

 有很多种方法都能给这个小节提出的问题带来优化,每一种有各自的优缺点:

1.用已经存在的Object保存引用

2.Static 类

3.单例

4.全局的消息系统

 

2.Assigning references to preexisting objects

一个简单的解决 interobject communication 问题的方法是使用Unity内置的序列化系统可以解决。也就是俗称的在Hierarchy里直接拖拽GameObject或者Prefab到面板对应变量上。但是public属性违反了类的封装原则,这是很危险的,因此可以使用[SerializeField]这个attribute(特性),这样可以使得private 和 protect的属性也能在Inspector中序列化。比如下边的例子:

 但是要注意的是拖拽的操作有可能拖拽不合适类型的物体或者忘记处理而变成null。还有就是Unity不能序列化static 和 readonly修饰的变量和属性等。

 3.Static Classes

虽然Static Classes有不方便调试,不便于修改和扩展功能(在系统中到处直接引用)等等缺点,但是却是目前非常简便的一种解决方案。单例模式是一种非常普遍常用的设计模式,它保证内存中同一类型只有一个实例。单例模式在处理重度的数据传输,比如读取文件下载解析等时非常适合。单例未必需要是全局的,它们最重要的特性是只有一个实例。单例最简单的一种实现方法就是通过C#的Static Class(静态类)。

把上一小节中的例子改成用Static Class实现,代码如下:

Static Class中所有的方法,属性等都必须是static类型,Static Class中的字段可以直接初始化,也可以通过构造函数初始化。

 Static Class的缺点是没办法和Unity中的Inspector window结合,也就是没法像Monobehaviours一样使用,有时候就得写一个匹配的辅助类来帮忙:

 尽管有这些缺点,但是使用Static Classes这个方法也要比使用Find()和SendMessage()强的多。

4.Singleton Components

前一节提到过,Static Class无法和Unity一起顺利工作,不能使用MonoBehaviour的各种特性也不能在运行时在Inspector window中看到,从而难于调试。因此实现一个基于MonoBehaviour的单例是一个不错的解决方案:

 最简单的使用方式如下边代码所示:

这个方案的缺点是要注意有可能DontDestroyOnLoad()永远不会被调用到,最好是在子类的Awake防范重调用下。当然在有些时候在切换场景时销毁再重新创建也是不错的选择,一切都根据使用场景决定。

另外要注意的是OnDestroy的危险,比如观察者模式,很多物体的取消注册时机都写在了OnDestroy函数里,但是Unity并不保证OnDestroy的时序,因此有可能当某个物体调用自己的OnDestroy时,调用到了已经销毁的单例,这有可能带来致命的错误。

最好的解决方案就是永远不要在OnDestroy函数里调用单例,但是如果非要使用,解决方案如下:

第一步:我们需要加个标志,用来跟踪单例是否存活

第二步:要提供一个途径来获取单例是否存活的状态

 

最后,任何在Destroy函数里调用单例的地方都要先去验证

 这个单例方案也使用到了Find方法,但是只是在初始化时调用一次,因此还可以接受。但是它的初始化时机可能并不是在场景的初始化时,而是在第一次使用时,因此有可能在那个时机会给性能带来影响。因此也可以在场景的初始化时调用单例来保证其在场景初始化时就初始化好。

另外一个缺点就是如果以后我们想改掉这个单例模式,变成可能有多个实例或者想把它变得更模块化,代码的改动量将会非常大。

 

 

 

 

 

 

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

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

相关文章

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 操作系统的朋友如…

vivo应用商店电脑版_VIVO应用商店代理商江湖的那些关系

VIVO应用商店代理商江湖的那些关系需要源文件清晰版本加微信wps007其他干货文章如何不花钱或者少花钱把ASO的活给干了&#xff1f;2020最新主流安卓应用市场ASO技巧以及注意事项App推广的高阶玩法&#xff0c;一箭双星&#xff01;今日头条定向优化技巧今日头条广告创意优化指南…

华为阅读下载的文件在哪里找_华为手机还要天天清理内存?1键关闭这2个设置,手机用到2035年...

阅读本文前&#xff0c;请您先点击上面的蓝色字体“科技荟 ”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅&#xff0c;请放心关注。 华为手机还要天天清理内存&#xff1f;1键关闭这2个设置&#xff0c;手机用到…