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内存和托管内存间的传递)

tag和name是GameObject中会产生这种现象的两个属性,我们应该尽量少的在运行时调用这两个属性,比如用在Editor编程中更合适。但是Tag这个东西太常用也非常有用,在运行时经常会用到,这会经常带来麻烦,举个栗子,下边的代码在每次迭代中都会产生额外的内存开销:

for (int i = 0; i < listOfObjects.Count; ++i)
{  if (listOfObjects[i].tag == "Player") {    // do something with this object  } 
} 

还好Unity提供了 CompareTag()这个方法来用来tag间的比较,这个方法避免了Native-Managed Bridg(不知道咋避免的,没有讲原理)

来,让我们测试下:

通过键盘我们可以控制使用哪个函数,来瞅瞅结果:

分别运行1000万次,可以看到使用.tag方法时会有很多内存分配,如果分配过多会进而产生GC。并且.tag方法运行大概消耗2000毫秒,而ComparTag方法大概消耗1000毫秒,速度也慢于CompareTag方法。所以结论就是不要使用.tag方法。

很不幸的是Unity对于name属性没有提供不消耗内存的方法,所以有的时候需要调用name属性去判断时,不如考虑考虑用tag来代替。值得一提的是ComparTag方法调用时传入的字符串,比如"Player"并不会产生额外的内存开销,因为在初始化时已经分配好这些硬编码的字符串,这里这是运行时的引用。

2. Use appropriate data structures

C#在System.Collection中提供了很多不同的数据结构,最常用的俩个就是List<T>和Dictionary<K, V>。

如果我们想要做的是遍历数据集,那List更合适一些,因为List在内存中的分布式连续的,因此遍历会更准确更快的命中内存位置。

Dictionary最合适的情况是两个objects相互关联,我们更多的是用来查询,插入,删除等操作。

如果既想要遍历速度快,又想增删改查快,不好意思,没有这种美事儿,目前没有这种数据结构,书作者的建议是。。。如果有这种硬性需求,那就两个一起用,一个list一个dict,比如一个playerList 一个 playerDict

3.Avoid re-parenting Transforms at runtime

在Unity的早期版本中(5.3更早之前)Transform的引用在内存中的排布和Dict很像,也是随机排布。但是新版本后,Unity对于在同一个parent下的所有Transforms,内存排布变成了连续的类似动态数组,这会给例如物理系统和动画系统等许多系统带来非常大的性能提升,因为这加快了Transform的遍历。万事肯定不是完美的,想获得速度的提升,就会有所牺牲。当我们想给一个GameObject 换个爹(parent)时,新的爹(parent)必须从自己已预先分配好的内存空间中分出一部分给这个新移过来的Transform并且重新根据depth排序,如果这个新爹(parent)没有足够的空间去适应新来的儿子(child),那它只好扩展自己的内存buffer,这有可能会消耗不好少时间。

当我们 instantiate 一个新的GameObject时,要处理的一件事就是给这个GameObject认个爹,如果不处理的话默认是null,也就是孤儿,会直接在Hierarchy的root下存放。Hierarchy 根目录下的所有Transform都需要分配一段内存buffer去存储自己现有的儿子们以及未来还可能新有的,但是如果当我们Instantiate后立刻给一个GameObject认个爹,就可以避免分配这部分内存buffer!因此我们可以 在调用GameObject.Instantiate()时传入parent的Transform而避免分配内存这步。

另一种方法是在我们需要之前就给root Transform提前分配更大的内存buffer,从而避免在同一帧里既需要重新给GameObject认爹还需要扩展内存Buffer,这个操作可以通过修改Transform的hierarchyCapacity属性达到,如果我们可以提前就预估好有多少个儿子,那就可以节省很多的内存分配操作。

 

4.Consider caching Transform changes

Transform脚本存储了它相对于其parent的数据,这意味着如果获取和修改一个Transform脚本的position,rotation或者scale属性,都将引起许多额外的矩阵运算(类似坐标空间变换)。这个object在Hierarchy Window中所处层级越深,那就需要计算的越多。

然而这也意味着如果使用localPosion,localRotation和localScale不会有这部分开销,因为这些值已经是直接存储在了Transform上,可以直接获得,因此能用local属性的时候就尽可能的使用local。

不幸的是世界坐标和本地坐标的变换在很多时候会简化和解决3D的一些问题,因此有时候也有必要牺牲一些小性能来解决复杂的3d数学运算问题。

另外一个要注意的就是要尽量避免不断的对Transform脚本的属性进行更改,因为每次更改都会调用Unity内部的消息机制,Unity需要把更改的消息发送给例如Collider,Rigidbody,Light,Camera等等以保证物理和渲染系统能知道新的Transform属性从而进行对应的更新。

我们会经常看到在同一帧中对Transform的属性进行了多次的修改,这每次修改都会带来内部消息的传递,即使是在同一帧里。因此,我们应该尽可能减少修改次数,比如先用变量缓存,在帧的最后再调用,比如下边这个例子:

 

 

 

 

 

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

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

相关文章

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

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

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

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

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

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

聊聊网络游戏同步那点事

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

反走样技术相关文章

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

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

问&#xff1a;怎么每天看到这种文章&#xff1f;答&#xff1a;只需搜索公众号"51单片机学习网"免费关注算法(Algorithm)&#xff1a;计算机解题的基本思想方法和步骤。算法的描述&#xff1a;是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述&#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;今日头条定向优化技巧今日头条广告创意优化指南…