每天一点UWA:第五周

AssetBundle

shader加载

  • 首先 Shader. WarmupAllShaders 并不影响 Shader 的加载,因为该函数的作用是将所有已加载的 Shader 都做一次快速渲染(渲染单个像素,GPU 在首次使用某一个 Shader 时会有额外开销,Warm 相当于是将这部分开销提前)。
  • 可以通过AssetBundle.LoadAll等接口预加载 AssetBundle 中的 Shader。而对于 Always Included Shaders 中的 Shader 则可以通过 Shader. Find 来预加载。

bat学习

概念

  • 批处理的本质,是一堆DOS和cmd命令按一定顺序排列而形成的集合。
  • 熟悉DOS语法,然后按照正确的顺序来进行指令的运行。

系统教程

  • 使用/?查看if的功能,使用与很多指令,%似乎不行。

每天一点UWA:加载模块深度解析

专题

  • 因为UWA上会对一些技术进行系列的专题讲解,而且文章并不连续,如果按照每周的形式就会割裂这些内容,因此针对这样的情况统一写成专题形式。

概述

  • 载模块中最为耗时的性能开销可以归结为以下几类:资源加载、资源卸载、Object的实例化和代码的序列化等。
  • 资源加载是加载模块中最为耗时的部分,其CPU开销在Unity引擎中主要体现在Loading.UpdatePreloading和Loading.ReadObject两项中。
  • Loading.UpdatePreloading,这一项仅在调用类似LoadLevel(Async)的接口处出现,主要负责卸载当前场景的资源,并且加载下一场景中的相关资源和序列化信息等。下一场景中,自身所拥有的GameObject和资源越多,其加载开销越大。
  • Loading.ReadObject,这一项记录的则是资源加载时的真正资源读取性能开销,基本上引擎的主流资源(纹理资源、网格资源、动画片段等等)读取均是通过该项来进行体现。可以说,这一项很大程度上决定了项目场景的切换效率。

每天一点UWA:第四周

AssetBundle

Resources.UnloadAsset仅能释放非GameObject和Component的资源,比如Texture、Mesh等真正的资源。对于由Prefab加载出来的Object或Component,则不能通过该函数来进行释放。

Lua学习笔记:迭代和闭包

关系

  • 迭代是一种遍历一种集合中所有元素的机制,在遍历的过程中需要在每次成功之间保持一些状态,比如当前变量的index等。而闭包的机制恰好很适合迭代,因为闭包是一种可以访问外部嵌套环境中的变量的函数,而这个变量可以用来保持状态。在lua中闭包结构通常由闭包函数本身和一个创建该闭包函数的工厂函数组成。
  • 以下面代码为例,GetValue就是个工厂,它生产出一个闭包,这个闭包将状态保持在t和i这两个变量中。其实在我看来主要是i中。在循环中每次调用闭包(迭代器)都是在更新它的状态i。这段代码完美的展示了迭代器的概念,看完之后对于迭代的理解更近了一步。

Lua学习笔记:函数深入

闭包

  • lua中的函数都可以认为是闭包,只不过为了便于理解还是用了函数的概念。
  • lua中函数的返回值可以是匿名函数,也就是闭包。以下面的代码为例,提出一个概念:非局部的变量。在下面的代码中,匿名函数访问了一个变量i,它对于newCount来说是局部变量,对于匿名函数来说是既不是局部变量也不是全局变量,在lua中这个称谓非局部的变量
  • 在lua中一个闭包指的是一个函数和该函数所需要访问的非局部的变量。lua会把它们看做是一个整体,因此在下面的代码中多次允许c1和c2,会发现变量i是在递增的。这是因为c1 = newCount()这句代码相当于给c1赋值了一个闭包,它包含了i这个变量。因此多次执行相当于就是在反复执行一个对象,这样i就一直是原来那个i。

每天一点UWA:第三周

内存

资源复用

  • 如果一个prefab被简单的多复制几次,里面的mesh、Texture、AnimationClip、Material这些都是被复用的,在profile中可以看到。但是如果prefab从AssetBundle中获取,并且多次的加载、实例化、卸载可能造成内存泄漏,因为unload(false)并没有真正卸载内存中的已经实例化的prefab,再次load时PersistentManager会认为是一个新的对象。

每天一点UWA:第二周

内存

概述

  • 内存的开销无外乎以下三大部分:1.资源内存占用;2.引擎模块自身内存占用;3.托管堆内存占用。

资源内存

  • 大头在纹理,其次在网格、动画片段和音频。

Lua学习笔记:高级概念

高级概念

  • 这部分中会记录一些lua语言中的高级概念和技术。

模块

概念

  • 从我的理解看,模块更像是一个类。但是因为lua中没有类的概念,模块的实现是依赖于table。
  • 一些公共或者私有的变量+函数组成了模块的主体,最后一个return module完成了基本的构造。其实这个return就是返回了这个table。
  • 具体实现看教程

每天一点UWA:第一周

初衷

  • 首先UWA一直以来都是一个我很喜欢的网站,因为他们在unity的优化方面是非常专业的,而且他们对于技术的分享也是毫不吝啬的。在他们的网站上有很多的技术文章,很久以来都想系统的阅读一遍,但是一直没有去做。这周开始下定决心要从第一篇开始,把UWA所有的技术分享文章读完,这个系列的文章会对每周读到的技术做一个总结,但是因为文章涉及的方向比较杂,因此会简单的用技术进行一个分类。

CPU方面的优化(很有用)

  • 就目前的Unity移动游戏而言,CPU方面的性能开销主要可归结为两大类:引擎模块性能开销和自身代码性能开销。其中,引擎模块中又可细致划分为渲染模块、动画模块、物理模块、UI模块、粒子系统、加载模块和GC调用等等。
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×