Unity性能优化-对象池】的更多相关文章

1.对象池Object Pool的原理: 有些GameObject是在游戏中需要频繁生成并销毁的(比如射击游戏中的子弹),以前的常规做法是:Instantiate不断生成预设件Prefab,然后采用碰撞销毁,或者定时销毁,大量创建重复对象造成内存损耗,影响性能还容易产生内存碎片. 所谓对象池,就是针对需要经常生成消失的对象.我们在对象需要消失的时候不Destroy而是SetActive(false),然后放入池子中,当需要再次显示一个新的对象的时候,先去池子中看有没有隐藏的对象,有就取出SetA…
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻译 Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译 Unity性能优化(3)-官方教程Optimizing garbage collection in Uni…
开始之前先分享几款性能优化的插件: 1.SimpleLOD : 除了同样拥有Mesh Baker所具有的Mesh合并.Atlas烘焙等功能,它还能提供Mesh的简化,并对动态蒙皮网格进行了很好的支持. 该插件可在Run-time和Editor中都可以使用,同时开放了源码,大家可以根据项目的实际情况而作修改. http://download.csdn.net/download/jasonczy/10178526 一. 转载自 http://blog.csdn.net/game_jqd/articl…
本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻译 Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译 Unity性能优化(3)-官方教程Optimizing garbage collection in Uni…
本文是Unity官方教程,性能优化系列的第一篇<The Profiler window>的简单翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻译 Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译 Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译 Unity性能优化(4)…
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍Transform的用法.子弹射击本身很容易制作,只要制作一个子弹Prefab,再做一个发生器,使用发生器按频率产生子弹,即克隆子弹Prefab,然后为每个子弹写上运动逻辑就可以了.这本该是很简单的事情.不过问题来了,发射出去后的子弹如何处理?直接Destroy吗?这太浪费了,要知道Unity的Mon…
本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻译 Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译 Unity性能优化(3)-官方教程Optimizing garbage co…
贴图: l  控制贴图大小,尽量不要超过 1024 x1024: l  尽量使用2的n次幂大小的贴图,否则GfxDriver里会有2份贴图: l  尽量使用压缩格式减小贴图大小: l  若干种贴图合并技术: l  去除多余的alpha通道: l  不同设备使用不同的纹理贴图,分层显示: 模型: l  尽量控制模型的面数,小于1500会比较合适: l  不同设备使用不同的模型面数: l  尽量保持在30根骨骼内: l  一个网格不要超过3个material: 动画: l  N种动画压缩方法: l …
这里从三个纬度来分享下内存的优化经验:代码层面.贴图层面.框架设计层面. 一.代码层面. 1.foreach. Mono下的foreach使用需谨慎.频繁调用容易触及堆上限,导致GC过早触发,出现卡顿现象. 特别注意的是在Update中如果非必要,不要使用foreach.尽可能用for来代替foreach.会产生GC Alloc,说明foreach调用GetEnumerator()时候有堆内存上的操作,new和dispose. 2.string修改. 如果熟悉C++的话,就会了解,每次使用str…
这里介绍一种对象池的写法.它的优点在于无论取出还是插入游戏物体都是常数量时间. using UnityEngine; using System.Collections; using System.Collections.Generic; //对象池 public class GameObjectPool : MonoSingleton<GameObjectPool> { /// <summary>可能存放多个种类的对象,每个种类有多个对象 </summary> priv…
LOD,中文名多层次细节,是游戏中最常用的技术,它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算.今天我们来实现使用它来做一个简单的优化例子. 我们没有模型(程序员的悲哀)就用Particle粒子特效来做试验吧.在场景中建立一个空物体,取名LODEffects,在空物体下面建立一个Particle并复制两份都做为子物体.这们用这三个Particle可以当作不同细节的模型,分别调整它们的ParticleSystem组件下Emission的Ra…
没想到Unity的音频会成为内存杀手,在实际的商业项目中,音频的优化必不可少. 1. Unity支持许多不同的音频格式,但最终它将它们全部转换为首选格式.音频压缩格式有PCM.ADPCM.Vorbis,不是所有平台都支持这些所有的压缩格式,有些平台,例如WebGL只支持AAC格式. 2.所有音频导入时,默认两项设置,LoadType是"Decompress On Load",压缩格式是“Vorbis”,例如下图原始文件大小计算为35.9 MB,导入的大小计算为10.7 MB.这意味着这…
1. DrawCall是啥?其实就是对底层图形程序(比如:OpenGL ES)接口的调用,以在屏幕上画出东西.所以,是谁去调用这些接口呢?CPU.比如有上千个物体,每一个的渲染都需要去调用一次底层接口,而每一次的调用CPU都需要做很多工作,那么CPU必然不堪重负.但是对于GPU来说,图形处理的工作量是一样的.所以对DrawCall的优化,主要就是为了尽量解放CPU在调用图形接口上的开销.所以针对drawcall我们主要的思路就是每个物体尽量减少渲染次数,多个物体最好一起渲染. 2. 优化方式 (…
Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎首先经过简单的可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置.法线.UV等),索引(顶点如何组成三角形),变换(就是物体的位置.旋转.缩放.以及摄像机位置等),相关光源,纹理,渲染方式(由材质/Shader决定)等数据准备好,然后通知图形API——或者就简单地看作是通知GPU——开始绘制,GPU基于这些数据,经过一系列运算,在屏幕上画出成千上万的三角形,最终构成一幅图像. 在Unity中…
不同函数调用方式对应不同的绑定次数: import profile class A: def f(self): pass def foo(): a = A() for i in range(100000): a.f() if __name__ == '__main__': profile.run("foo()") import profile class A: def f(self): pass def foo(): a = A() func = a.f for i in range(…
一.优化组件访问方式 原文:http://blog.csdn.net/lijing_hi/article/details/11657887 1.缓存Component的引用,如transform 2.缓存Components列表的引用,再遍历 二.使用Delegate的委托事件取代SendMessage 原文:http://blog.csdn.net/chiuan/article/details/7918833…
特效合并,意思是说将粒子所用的零碎图片,以shader为单位合并成一张图集,好处就是可以降低draw call.试想,合并前每个粒子使用一个material,而每一个material就要占用一个drawcall,而合并后多个粒子可以用同一个material,这样就降低了drawcall,提升了性能. 转载请注明出处:http://www.cnblogs.com/jietian331/p/8625078.html 合并工具的代码如下: using System.Collections.Generi…
Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎首先经过简单的可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置.法线.UV等),索引(顶点如何组成三角形),变换(就是物体的位置.旋转.缩放.以及摄像机位置等),相关光源,纹理,渲染方式(由材质/Shader决定)等数据准备好,然后通知图形API——或者就简单地看作是通知GPU——开始绘制,GPU基于这些数据,经过一系列运算,在屏幕上画出成千上万的三角形,最终构成一幅图像. 在Unity中…
1. Occlusion Culling-遮挡剔除的含义:没有在Camear视野范围内的游戏物体不进行渲染Render(默认情况下,Unity是会渲染所有GameObject,无论Camear是否看得见),例如下图: 2. 使用比较简单,效果也是立竿见影 (1)配置下游戏物体: (2)“window"菜单->Rendering->Occulision Culling, (3)Tab项”Object",选择"All" (4)切换到Bake菜单,直接使用默认…
https://wuzhiwei.net/unity_script_optimization/…
本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的万能对象池 本节通过一个简单的射击子弹的示例来介绍Transform的用法.子弹射击本身很容易制作,只要制作一个子弹Prefab,再做一个发生器,使用发生器控制按拼了吧产生子弹,即克隆子弹Prefab,然后为每个子弹写上运动逻辑就可以了.这本该是很简单的事情.不过问题来了,发射出去后的子弹如何处理?直接Destroy吗?这太浪费了,要知道Unit…
聊聊近况: 距离上一篇文章已经过了好久,主要原因是我懒了.公司项目也到了开始优化的阶段,上网找的资料,看过了就忘.还是想把它整理一下,写出来.其实我说的东西,网上都有,我只是搬运工而已. 贴图压缩: Android平台使用ETC1格式压缩. 目前主流的Android机型基本都支持ETC1格式压缩.但ETC1只能支持非Alpha通道的图片压缩. 所以一般把RGB和ALPHA分离出来,r值,g值,b值从RGB图获取,a值从Alpha图里获取. 随着OPENGL ES 3.0的发布,etc2也出了,支…
unity中用到大量重复的物体,例如发射的子弹,可以引入对象池来管理,优化内存. 对象池使用的基本思路是: 将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用.恰当地使用对象池,可以在一定程度上减少频繁创建对象所造成的开销. 并非所有对象都适合拿来池化――因为维护对象池也要造成一定开销.对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况. GameObjectPool.cs如下 using UnityEngine; u…
前段时间本人转战unity手游,由于作者(Chwen)之前参与端游开发,有些端游的经验可以直接移植到手游,比如项目框架架构.代码设计.部分性能分析,而对于移动终端而言,CPU.内存.显卡甚至电池等硬件因素,以及网络等条件限制,对移动游戏开发的优化带来更大的挑战. 这里就以unity4.5x版本为例,对Unity的优化方案做一个总结,有些是项目遇到的,也有些是看到别人写的不错拿来分享,算作一个整理,后期也会持续更新.本优化从CPU.GPU和内存三个方面着手总结,这一篇先从CPU说起,整理一些针对C…
本文将介绍一些提升Unity UI性能的技巧.更多优化技巧,可以观看Unity工程师Ian Dundore在Unite Europe 2017的演讲<使用Unity性能提升技巧>. 1.划分画布 问题:UI Canvas上有一个或多个元素变化时,会污染整个画布. 画布(Canvas)是Unity UI的基本组件.它会生成网格来呈现放置在画布上的UI元素,当UI元素变化时,它会重新生成网格并向GPU发起绘图调用,从而显示出UI. 生成这些网格会消耗大量性能,需要将UI元素收集到批处理中,从而尽可…
paip.提升性能----数据库连接池以及线程池以及对象池 目录:数据库连接池c3po,线程池ExecutorService:Jakartacommons-pool对象池 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/attilax //////////为什么要使用数据库连接池 建立连接是一个费时的活动,每次都得花费0.05s-1s的时间,而且系统还要分配内存资源. 对于共享资源,有一个…
在游戏开发过程中,我们经常会遇到游戏发布后,测试时玩着玩着明显的感觉到有卡顿现象.出现这种现象的有两个原因:一是游戏优化的不够好或者游戏逻辑本身设计的就有问题,二是手机硬件不行.好吧,对于作为程序员的我们只能从第一个原因着手了,那就开始对着Profiler看性能开销,接下来就开始做各种内存,特效,代码上的优化了.对于这种问题,有经验的开发者在一开始就会做一个规范的设计,就我们的项目而言,设计时包含了角色池,怪物池,特效池,经验池,伤害池......所谓的对象池就是尽可能的复用内存中已经驻留的资源…
Unity对象池主要是保存那些常用的物体,避免他们在不断销毁和创造中损坏性能. 主要思路为:创造物体时,判断是否存在,如果存在则调用并使其显示.如果不存在则创造一个新的. 当销毁时,调用协程延时隐藏物体. // <summary> /// 对象池 /// </summary> public class GameObjectPool : MonoSingleton<GameObjectPool> { //内部容器,用于存入缓存的对象 private Dictionary&…
Unity 绘图性能优化 - Draw Call Batching Unity官方链接:http://docs.unity3d.com/Manual/DrawCallBatching.html 转载请注明本文链接:http://www.cnblogs.com/fly-100/p/5422734.html Draw Call Batching 在屏幕上绘制一个物体,U3D引擎必须向绘图API(openGL或者D3D)发起一次DrawCall.这些DrawCall往往是昂贵的,当绘图API为每个Dr…
在Unity中我们经常会用到对象池,使用对象池无非就是解决两个问题: 一是减少new时候寻址造成的消耗,该消耗的原因是内存碎片. 二是减少Object.Instantiate时内部进行序列化和反序列化而造成的CPU消耗. 想进一步了解对象池模式优化原理的同学可以参阅: 对象池模式:http://gpp.tkchu.me/object-pool.html,本篇主要讲如何实现一个精简并且灵活的对象池. 设计: 首先我们要弄清楚本篇对象池的几个概念,否则直接上代码大家会一头雾水. 从字面上理解对象池,…