Unity 性能优化
前言最近开始进行 Unity 性能优化的工作,主要分为三类:CPU、GPU 和内存。CPU 的优化又分为渲染和脚本,本文将着重于脚本优化。 正文Unity 性能优化 – 脚本篇一般来说,优化必须要知道性能热点在哪里,而知道性能热点则需要在 ** 目标设备 ** 去进行深度的 profile。如果不进行 profile,而是靠臆测去进行优化,往往会事倍功半,甚至适得其反。 本文所讲述的是已经经过验证的,通用的优化方法和思路,可以为大家节约一些 profile 时间。以下将从 Unity API、C#、Lua、数据结构和算法等方面来详细阐述优化建议。 Unity APIGameObject.GetComponentUnity 是基于组合的开发方式,所以 GetComponent 是一个高频使用的函数。每次调用 GetComponent 时,Unity 都要去遍历所有的组件来找到目标组件。每次都去查找是不必要的耗费,我们可以通过缓存的方式来避免这些不必要的开销。 其中 Transform 是我们用到最多的组件,GameObject 内部提供了一个 .transform 来获取此组件。然...
gitattributes 文件
前言这里是前言介绍。 正文什么是 .gitattributes ?当执行 git 动作时,.gitattributes 文件允许你指定由 git 使用的文件和路径的属性,例如:git commit 等。 换句话说,每当有文件保存或者创建时,git 会根据指定的属性来自动地保存。 其中的一个属性是 eol(end of line),用于配置文件的结尾。本文将会深入了解如何配置文件的结尾行,这样的话,即使在不同的机器、操作系统 上都可以使得每个开发者都可以使用相同的值。 为什么是 .gitattributes(开发者之间的争议 ⚔️ )?不是所有的开发者都是一样的,不能因为你是在 Windows 上使用 Visual Studio Code 开发的,就期望别的 Pull Request 也是基于相同的开发 环境完成的(在 MacOS 上可能用的是 Sublime Text2)。 正如上面提到的,开发者使用不同的操作系统,默认的文件结尾行就会不同。在 Windows 上默认的是回车换行(Carriage Return Line Feed, CRLF),然而,在 Linux/MacOS ...
Unity 自定义 PackageManager 服务器
前言这里是前言介绍。 正文** 本文会实现以下几个需求 ** ** 搭建自己的 PackageManager 服务器 ** 安装 nodejs 安装 npm 部署 verdaccio ** 将自己写的插件发布到 PackageManager 服务器上 ** 配置自己的 Package 注册 Verdaccio 服务器账号 登陆 Verdaccio 服务器 发布 Package 到 Verdaccio 服务器上 ** 让项目可以使用 Verdaccio 服务器上的所有 Package** 修改项目的 manifest.json ** 修改 Unity 编辑器的项目模板,让每个新建的 Unity 项目都可安装自己服务器上的插件 ** 修改 Unity 编辑器项目模板的 mainfest.json 使用 peazip 重新压缩为. tgz 文件 ** 本文需要用到的工具 ** Unity Editor 云服务器 Windows PowerShell PeaZip ** 参...
Unity 的 Profiler 指南
前言这里是前言介绍。 正文Profiler 概述打开 Unity Profiler Window->Analysis->Profiler。 Profiler 可以确定 ** 需要在应用程序中优化什么,并确认优化产生了您期望的结果 **。默认情况下,Unity 记录 300 帧游戏数据并呈现每一帧的详细信息。 Profiler Window Layout A:Profiler 模块。这是可以在应用程序中配置的所有模块的列表。使用该区域顶部的下拉菜单从窗口中添加和删除模块。 B:Profiler 控件。使用这些控件来设置从哪个设备进行配置,以及应该执行哪种类型的配置 Unity,在帧之间导航,并开始记录数据。 C: 帧图表。这个区域包含了每个模块的图表。 D:细节面板模块。窗口这个区域的信息会根据您选择的模块而变化。 Profiler Controls 各个控件功能: AttachToPlay: 选择要对应用程序进行概要分析的目标。 默认情况下,这个设置为 Playmode。还可以选择编辑器来配置 Unity 编辑器,并显示编辑器当前使用的资源。 U...
Unity 性能分析优化
前言这里是前言介绍。 正文Unity Accelerate Solution 团队对 Unity 引擎的源代码了如指掌,可帮助客户们最大限度地利用引擎。团队的日常工作包括深入剖析客户项目,搜寻其在速度、稳定性与效率方面有待优化的部分。本次,我们请到了这支 Unity 最为资深的软件工程师团队来分享一些移动游戏优化方面的专业知识。 他们分享了非常多的锦囊妙计,以至于一篇博文很难涵盖所有内容。因此,我们将推出一个博文系列。作为此系列的首篇文章,我们将着重介绍 ** 怎样借助性能分析、内存优化和代码架构来提高游戏的性能 **。在未来的几周内,我们将再发表两篇文章:一篇讨论 UI Physics,另一篇讨论音频和资源、项目配置和图形。 话不多说,直接开讲! ** 性能分析 **优化工作的第一个步骤便是通过性能分析来收集性能数据,这也是移动端优化的第一步。 ** 我们要尽早在目标设备上进行性能分析,而且要经常分析。** **Unity Profiler ** 可提供应用关键的性能信息,因此是优化必不可少的一部分。尽早对项目进行性能分析,不要拖到发售前。对每一个故障或性能尖峰彻查到底。对你自...
Unity 音频压缩优化
前言这里是前言介绍。 正文没想到 Unity 的音频会成为内存杀手,在实际的商业项目中,音频的优化必不可少。 Unity 支持许多不同的音频格式,但最终它将它们全部转换为首选格式。音频压缩格式有 PCM、ADPCM、Vorbis,不是所有平台都支持这些所有的压缩格式,有些平台,例如 WebGL 只支持 AAC 格式。 所有音频导入时,默认两项设置,LoadType 是 “Decompress On Load”,压缩格式是“Vorbis”,例如下图原始文件大小计算为 35.9 MB,导入的大小计算为 10.7 MB。这意味着这个音频剪辑将使您的游戏(存档)大小增加 10 兆字节,但播放它需要近 36 兆字节的 RAM。 3.Load Type 的各个选项 Compressed In Memory – 音频剪辑将存储在 RAM 中,播放时将解压缩,播放时不需要额外的存储。 Streaming –音频永久存在设备上(硬盘或闪存上) ,播放流媒体方式. 不需要 RAM 进行存储或播放。 Decompress On Load – 未压缩的音频将存储在 RAM 中。这个选项需...
Unity 内存优化
前言这里是前言介绍。 正文转载自 :Unity3D 内存释放 最近网友通过网站搜索 Unity3D 在手机及其他平台下占用内存太大. 这里写下关于 unity3d 对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是 Resources.Load,另外一个通过 AssetBundle, 其实两者区别不大。Resources.Load 就是从一个缺省打进程序包里的 AssetBundle 里加载资源,而一般 AssetBundle 文件需要你自己创建,运行时 动态加载,可以指定路径和来源的。 其实场景里所有静态的对象也有这么一个加载过程,只是 Unity3D 后台替你自动完成了。 详细说一下细节概念:AssetBundle 运行时加载:来自文件就用 CreateFromFile(注意这种方法只能用于 standalone 程序)这是最快的加载方法也可以来自 Memory, 用 CreateFromMemory(byte[]), 这个 byte[]可以来自文件读取的缓冲,www 的下载或者其他可能的方式。其实 WWW 的 assetBundle 就是内部数据读取完后自...
Shader 学习笔记
前言这里是前言介绍。 正文一口气解决 RenderQueue、Ztest、Zwrite、AlphaTest、AlphaBlend 和 Stencil** 知道吗,如果只是想要实现 Xray 效果的话,其实并不难。** 实现上图的效果,原理就是对角色画两次。第一次是被遮挡住的效果(半透明、单色),第二次是正常的效果(为了简化这里使用 unlight 只显示贴图) ** 这两个 pass 最大的区别,在于使用不同的 Ztest(深度测试)。但是这一次我决定不仅仅只写关于 Ztest 的问题。反正我已经决定对抗懒癌晚期,那就干脆一口气把 RenderQueue、Ztest、Zwrite、AlphaTest、AlphaBlend、StencilTest 这些烂七八糟的东西都拎出来写一遍, 因为这些东西有很多地方都是相通的,一起说明白反而省些力气。** ** 不过说实话,这些东西确实是有点麻烦。我尽自己最大的努力去把这些东西说明白。但是鉴于个人能力实在有限,如果有哪里说得不对或者不清楚,还请见谅。** 如上图,现在有三个多边形分别是红色盒子绿色盒子和蓝色盒子,在镜头里红色的盒子在最...
Unity 的 Application 路径
前言发现 **Application.temporaryCachePath 和 Application.persistentDataPath 返回空字符串 **。便花时间认真研究了一下 Unity3D 的路径问题。 正文我们常用的是以下四个路径: Application.dataPathApplication.streamingAssetsPathApplication.persistentDataPathApplication.temporaryCachePath 根据测试,详细情况如下: iOS:Application.dataPath /var/containers/Bundle/Application/app sandbox/xxx.app/DataApplication.streamingAssetsPath /var/containers/Bundle/Application/app sandbox/test.app/Data/RawApplication.temporaryCachePath /var/mobile/Containers/...
C# 单例模式
前言单例模式是软件工程学中最富盛名的设计模式之一。从本质上看,单例模式只允许被其自身实例化一次,且向外部提供了一个访问该实例的接口。通常来说,单例对象进行实例化时一般不带参数,因为如果不同的实例化请求传递的参数不同的话会导致问题的产生。(若多个请求都是传递的同样的参数的话,工厂模式更应该被考虑) C# 中实现单例有很多种方法,本文将按顺序介绍非线程安全、完全懒汉式、线程安全和低 / 高性能集中版本。 在所有的实现版本中,都有以下几个共同点: 唯一的、私有的且无参的构造函数,这样不允许外部类进行实例化; 类是密封的,尽管这不是强制的,但是严格来讲从上一点来看密封类能有助于 JIT 的优化; 一个静态变量应该指向类的唯一实例; 一个公共的静态变量用于获得这个类的唯一实例 (如果需要, 应该创建它); 需要注意的是,本文中所有的例子中都是用一个 public static Instance 的变量来访问单例类实例,要将其转换成公共函数是很容易的,但是这样并不会带来效率和线程安全上的提升。 正文Version 1 - 非线程安全public sealed class Singleto...
