
NGUI打开界面太慢了,起初一直以为是unity的问题,最近经过我的全面测试我发现这和unity没有关系。一般一个比较复杂的界面大概需要150个GameObject
或者
UISprite
。我用NGUI直接载入发现竟然需要250多毫秒,仅仅只是两张小图。同样的GameObject
我用unity2d的Sprite载入只需要70多毫米,可见Unity2d的效率要比NGUI高多少。。我可能说的不完全对,因为U3D是闭源的,我只能猜测。
在普及一下基础知识。
1
2
GameObject
go
=
GameObjectInstantiate(ResourcesLoad(“prefabName”))
as
GameObject;
goAddComponent<Test>();
我想上面这一行代码,大家应该再也熟悉不过了。实例化一个Prefab,然后给它身上帮一条脚本。如下图所示,我用的是
红米作为测试机器。实例化对象我们可以拆成4部分。我用NGUI加载了150个UISpirte
=
41
+
4
+
30
+
194
=
269毫秒,一般打开界面超过500毫秒的话用户就会明显感觉卡顿了。而我这个仅仅是一张图而已,事实证明NGUI加载太慢了,到底为什么这么慢?
NGUI研究院之为什么打开界面太慢(十三)
-
雨松MOMO程序研究院
-
1
1ResourcesLoad
ResourcesLoad是一个”同步”耗时 *** 作,Unity内部维护了资源的内存池,但是调用Load的时候Unity会自动的把Prefab上所引用的资源在加入内存池,它不会重复加载资源。也就是说当你加载相同的UIAtlas的时候,只会第一次比较卡。你可以试试一些线上的unity游戏,一般第一次打开某界面的时候要比以后打开此界面时间长一些。
2GameObjectInstantiate
很多人认为加载慢的原因罪魁祸首是Instantiate()。其实我告诉你它的时间反而是最快的,上面的截图我相信就是最好的证明。第一次Instantiate要比以后执行Instantiate要慢一些,可能Unity在做一些特殊处理吧。
3第一次添加脚本。
添加脚本一般会有两种形式,第一种是通过AddComponent<Script>的形式把脚本添加给游戏对象,还有一种是你的Prefab天生就带着这个脚本。无论哪种加载时间都是一样的。第一次加载脚本要比以后加载慢,我觉得应该是和Resources缓存池的原理一样吧。
4第二次以后的GameObjectInstantiate
和
AddComponent<Script>
GameObjectInstantiate
就不用说了,它载入很快,这里要详细的说说Script。
对!导致于你界面打开慢的原因就是prefab上绑的脚本,罪魁祸首就是脚本。
AddComponent<Script>
以后
或者
Prefab上预先绑定的脚本。当你GameObjectInstantiate()同步方法执行的时候,并不是把脚本挂上去就完了,而它要等脚本里面的一些方法执行完毕才算结束。
脚本中有两个很典型的方法
Awake
和
OnEnable。当Prefab
用Instantiate()方法载入的时候,它的脚本必须执行完Awake和OnEnable两个方法以后才算完整载入。那么如果你的脚本这里面有一些耗时 *** 作,那么必然载入会慢了。。
1-烘培的代价是非常高的
2-烘培贴图的数量和体积非常的大,因为它是RGB通道的一些彩色,所以是无法改变的。
3-通过格式压缩,但压缩会出现质量下降的情况。贴图加载会占用大量的显存。
我们自动生成的一些UV可以使用Unity的功能,在物体上有UV Charting Control,进行动态合并。在合并完成后,我们进行预计算,看看合并上有没有问题。
合并UV的时候可能会出现扭曲现象,这种扭曲现象在烘焙Lightmap时是非常有问题的。
UV Charts等于6的情况下,如果Box分成左边是比较合理的,右边这么分在Enlighten的计算量最起码要增加3倍。
常见的物体Cluster Resolution 参考(每单元大小):
小火车做了一个Light Probe Proxy Volume,这样就可以控制接受间接光的情况。注意这种方式目前不支持移动平台
项目中的整体地面,都是使用的Blend Probes模式的混合,比较小或者不显眼的物体,并非游戏重要物体的都可以使用Blend Probes进行照明,我们需要勾选Static类型,它们一定在Static批次中,后面把它Lightmap Static去掉就可以了,去掉后就不会生成Lightmap,但是会接收Light Probe的影响。
如上图所示,在整个光照当中,我们加了一些面光源,这是为了提高场景的窗户透光的光亮。如果不加,就没法按窗户形成面光源,向内部进行照明的。
需要注意,面光源在移动平台上,如果不是HDRP的话,就只支持静态的,只支持烘培,不是烘培的模型它是不支持的。
下图是场景的光照贴图大概是这样的,比较符合白天的光照效果。
我们可以看看它的设置。
首先Procedural Skybox在这里加进来。在Enlighten当中,千万不要使用渐变和颜色进行烘焙,两者烘焙出来的东西会比较风格化,并不写实。有很多人选择用某个颜色烘渐变,但效果会非常不理想,所以一般选择Skybox进行烘焙,而Skybox一般使用Procedural Skybox。
烘焙完后,再替换为自己场景的风格化Skybox作为最终显示效果。Procedural Skybox是仅用于烘焙的,不是用于制作最终的Skybox效果。
我们再举一个简单的例子。如果要形成一个特别颓废和压抑的环境,我们可以将大气密度提到很高,然后将染色降一下,或者偏向一个色彩。
我们可以将整个曝光度调低,把大气密度调高,实现让人很压抑的环境,这种环境烘焙出来的Lightmap比较接近于比较邪恶的地方,从而获得更加压抑的光照效果。
尤其是一些非常小的物体,如果想要表现出好的效果,一定要对Lightmap大小进行放大。例如:铅笔在Scale In Lightmap里要放大一倍,不然烘出来基本上没效果。但对于有的物体,我们要保证统一性,如果能保证统一性,有的地方会出现一些色斑。
在示例场景中,我们优化掉了一部分的东西,整个Lightmap的照明还可以,但是你会看到这些东西都浮起来了,靠屏幕空间的AO是控制不住的,效果会产生大量的损失。所以这样的东西只在室外有用,室内的话是不建议这么用。
Enlighten烘焙在示例场景中的效率,代价是非常大的,因为场景中的物体非常的多,它的UV Charts基本上没办法看到,非常碎,所以烘焙时间也非常长。
在小火车的场景中,使用Enlighten大概烘焙4分钟。在这个教室场景,因为物体非常多而杂,大概是小火车场景的5倍左右时间,大概20分钟。
使用Progressive烘培则很稳定,它只看场景有多大的精度,不管场景有多少物体,这就是Progressive和Enlighten之间的差异。
1private Rigidbody a;
2aisKinematic=false ;
Unity 是基于GNOME桌面环境的用户界面, 由Canonical公司开发,主要用于Ubuntu *** 作系统。
Unity作为Compiz的插件,是使用C++和Vala编程语言实现的,并使用了不常用的Nux的OpenGL工具包。
作为Compiz的一个插件,Unity的GPU加速性能可以广泛支持不同的硬件体系。
Unity 提供的 4大光源之一 平行光 可以把它想象成 太阳
Unity4大光源之一 聚光灯 可以把它想象成 手电筒
我们来了解一下Spot面板里面有什么
Range :聚光灯的范围
Spot Angle :聚光灯的照明角度
其他的在1-1图中有介绍
Unity4大光源之一 聚光灯 可以把它想象成 路灯
Range :点光源的直径/范围
Unity4大光源之一 聚光灯 可以把它想象成 灯条
而 区域光 和前面3个有稍稍不同看翻译
Lens Flare平行光中,一项 Flare 可添加光晕文件
Flare : 光晕需要提供Flare文件
Color : 光晕的颜色
Brightness : 光晕的亮度
FadeSpeed : 光晕的淡化速度
lgnoreLayer : 需要忽略的图层
Directional : 是否是定向光
在Unity中控制我们的渲染的面板就是Lighting面板那么我们怎么打开他呢如图6-1
Window->Rendering->LightingSettings
点击Lighting Settings后我们就到了Lighting面板,在Environment中的Enviroment Lighting 的Source选择的是环境中的物体,受什么环境光的影响。我这里选的是SkyBox,就是说无体表面的颜色会跟随天空盒的影响而变化。
Skybox Material : 天空盒材质
Sun Source : 太阳光
Source :天空盒环境光/颜色
intensity Multiplier : 光的强度
Environment Reflecrions : 环境光反射
Lightingmapping Setting这个是对烘焙的设置(很重要),有两个模式Progressive(渐进式)和 Enlighten。默认模式是Progressive(渐进式)
indirect Resolution(间接光分辨率)
Lightmap Resolution(光照贴图分辨率)
Lightmap Padding(光照贴图间隔)
Lightmap Size(光照贴图尺寸)。最大为2048,越大烘焙的时间以及贴图的大小就越大
Compress Lightmaps(压缩光照贴图)
Ambient Occlusion(环境光遮蔽)
Final Gather(最终收集器)
Directional Mode(平行模式)
Indirect Intensity(间接光强度)
Albedo Boost(反照率增强)
Lightmap Parameters(光照贴图参数)
Fog :启用或禁用场景中的雾效,对于deferred rendering(延迟渲染)雾效并不适用,对于延迟渲染,后处理雾效可能能满足需要。
Color:雾的颜色。
Mode :设置雾效随着相机距离变化的累积方式。Exponential Squared(指数平方),Exponential(指数),Linear(线性)。
Density : 密度
Holo Texture(光晕贴图):在光源周围绘制光晕纹理。
Holo Strength:光晕的强度。
Flare Fade Speed:耀斑褪色速度。
Flare Strength:定义耀斑的可见度。
Spot Cookie:聚光灯cookie
在unity里边使用多线程做一些事情是非常好的,比如解压资源 更新资源等。因为单开线程的话 不会影响主线程卡顿,这样UI就不会卡了。但是开的线程里边不能执行unity主线程的mono代码。线程启动后,执行完毕自动结束该线程、可以同时启动多个线程做事。
代码如下: using SystemThreading;
void StartThread()
{
Thread athread = new Thread(new ThreadStart(goThread));
athreadIsBackground = true;//防止后台现成。相反需要后台线程就设为false
athreadStart();
}
void Awake()
{
StartThread();
}
object lockd = new object();
void goThread()
{
int index = 0;
while (true)
{
lock (lockd)//防止其他线程访问当前线程使用的数据
{
DebugLog("in thread" + index);
index++;
if (index == 100)
{
ThreadSleep(10000);// 将当前线程挂起指定的时间 毫秒 时间结束后 继续执行下一步 和yield类似
}
else if (index == 200)
{
break;//该函数执行完自动结束该线程
}
}
}
}
所以其实多线程和协程原理差别很大的,只是功能有点类似。
1、当在主线程中创建了一个线程,那么该线程的IsBackground默认是设置为FALSE的。
2、当主线程退出的时候,IsBackground=FALSE的线程还会继续执行下去,直到线程执行结束。
3、只有IsBackground=TRUE的线程才会随着主线程的退出而退出
---------------------------------------------------------------------------------------------
ThreadStart:
Thread athread = new Thread(new ThreadStart(goThread));
athreadStart();//该方法启动的多线程 不能带有参数。
ParameterThreadStart:
ParameterThreadStart的定义为void ParameterizedThreadStart(object state),使用这个这个委托定义的线程的启动函数可以接受一个输入参数,具体例子如下 :
[csharp] view plain copy
ParameterizedThreadStart threadStart=new ParameterizedThreadStart(Calculate)
Thread thread=new Thread() ;
threadStart(09);//参数是09
public void Calculate(object arg)//arg参数是09
{
double Diameter=double(arg);
ConsoleWrite("The Area Of Circle with a Diameter of {0} is {1}"Diameter,DiameterMathPI);
}
Calculate方法只有一个为object类型的参数。需要传多个参数的时候 需要把参数都塞进object 然后进行转换。比如:
一个参数 void BuildA(object para){ List<int> list=para as List<int>;}
BuildA(list);
多个参数 void BuildB(object para){ object[] ps= para as object[];List<int> list=ps[0] as as List<int>;GameObject b=ps[1] as GameObject;}
BuildB(new object[]{list,obj});//把多个参数塞到object数组里边 传过去,相当于只传一个参数。
至于是开一个线程还是多个线程 根据需求和内核数SystemInfoprocessorCount来确定。最好一个核开一个线程 会快点。
详见bundleglobalcs和sdFileSystemcs/sdMultiThreadcs
闲来无事,仔细的学习一下粒子系统,也当是给自己做个笔记方便之后进行回顾。
引擎版本:Unity20183
创建方式:
1、Hierarchy-->Effects-->ParticleSystem
2、gameObject-->AddComponent-->ParticleSystem
两种创建的方式的区别只有是否有默认材质球的区别,即是否携带初始材质。
1、OpenEditor:打开粒子编辑面板,同一父物体下的粒子系统会按照从上到下的关系从左到右排序。
2、基础模块:ParticleSystem下的物件名(中的ParticleSystem),可以进行粒子运动的参数进行基础的设置。
3、Emission:发射模块,控制粒子的单次发射数(时间或者移动距离),以及可控的粒子发射时间。
4、Shape:形状模块(发射器的形状),控制修改发射器的形状和相应的参数。
5、Velocity over Lifetime:粒子生命周期内的速度变化模块,在粒子生命周期内的对速度进行控制。(可以在粒子还没销毁前控制其速度的变化)。
6、Limit Velocity over Lifetime:粒子生命周期内的限速模块,控制粒子的最大速度。
7、Inherit Velocity:粒子速度继承模块,控制粒子是否继承父物体的移动参数(需要改变基础模块中Simulation Space的参数为World)。
8、Force over Lifetime:生命周期内粒子力的变化模块,在粒子生命周期内对力进行控制。
9、Color over Lifetime:生命周期内粒子颜色的变化模块,控制粒子生命周期内颜色的变化。
10、Color by Speed:根据粒子速度改变粒子颜色模块,通过粒子的速度控制粒子的颜色。
11、Size over LifeTime:生命周期内粒子大小的变化模块,控制粒子生命周期内粒子大小的变化。
12、Size by Speed:根据粒子速度改变粒子大小模块,通过粒子速度改变粒子的大小。
13、Rotation over Lifetime:生命周期内粒子旋转属性的变化模块,控制粒子生命周期内粒子旋转属性的变化。
14、Rotation by Speed:根据粒子速度改变粒子速度模块,通过粒子速度改变粒子的旋转。
15、External Forces:外力模块,当粒子碰到相关联物体给粒子增加一个力。
16、Noise:噪音模块,可以对粒子进行不规则的运动设置。
17、Collision:碰撞体模块,可以控制粒子与指定物体之间的碰撞,以及碰撞后的粒子效果。
18、Triggers:触发器模块,控制粒子进出指定触发器后的粒子效果。
19、Sub Emitters:添加发射器模块,给该发射器增加其他的发射器。
20、Texture Sheet Animation:粒子帧动画模块,使粒子呈现帧动画形式的播放。
21、Lights:粒子灯光模块,可以给粒子增加实时光照。
22、Trails:路径模块,可以显示粒子的发射路径。
23、Custom Data:自定义模块,可以自定义粒子的一些属性。
24、Renderer:渲染模块,对粒子的展现形式进行设置,包括但不仅限于粒子的大小与材质。
Particle System Force Field(粒子系统的力场组件),其作用是对所关联的粒子系统施加外力,要使用这个组件,需要开启粒子系统中的External Forces(外力模块)并进行关联。
1、shape:形状,力场的表现样式。
2、Start Range:开始的范围(无法大于End Range)。
3、End Range:结束的范围,数值越大力场越大。力场介于Start Range 至End Range之间。
4、Direction(x,y,z):x,y,z方向上力的大小。
5、Gravity
51、Strength(Gravity):强度,可以想象成地球的引力,数值越大,越容易被焦点(引力点)吸引。
52、Focus(Gravity):焦点,控制引力点对粒子是吸引还是排斥。
6、Rotation
61、Rotation(Speed):粒子围绕力场中心运动的速度。
62、Rotation(Attraction):粒子被卷入中心点的强度。
63、Rotation(Randomness):对粒子产生随机性的推动。
7、Drag
71、Strength(Drag):拽住粒子的强度,类似你上楼梯后面有人拉你的衣角不让你上去的感觉。
72、Multiply by size(Drag):根据粒子大小调节拖拽强度。
73、Multiply by Velocity(Drag):根据粒子速度调节拖拽强度。
8、Vector Field
81、Volume Texture(Vector Field):向量场的纹理贴图(Texture 3D)。
82、Speed(Vector Field):改变通过向量场的粒子的速度。
83、Attraction(Vector Field):向量场的吸引力强度。
在ParticleSystem与Particle System Force Field中最常见的数值设置有三种,在下面给出
第一种:权重,范围为0-1,例如Attraction的范围等。
第二种:固定参数,固定一个参数,例如粒子发射器的持续时间。
第三种:参数曲线,这种数值设置是粒子系统可以千变万化的根源所在,通过对曲线的调变可以变化出各式各样的粒子效果。
我们着重来讲第三种数值设置(参数曲线)。参数曲线方便了我们想要粒子在什么时间段进行什么样的颜色变化或者效果变化。
1、Color:纯色显示。
2、Gradient:颜色按照梯度进行显示(举例,越迟生成的粒子颜色越接近右端)。
3、Random Between Two Colors:粒子颜色在两个纯色中任选一个。
4、Random Between Two Gradients:粒子颜色在两个梯度中任意选择一个显示。
5、Random Color:在你定义的色谱上任意选择一个颜色作为粒子颜色。
1、Constant:常量。
2、Curve:单条曲线,多了时间的属性,可以根据时间进行变化。可以自行拖拽改变曲线形状获得想要的粒子效果
3、Random Between Two Constant:在两个常量间随机一个数值。
4、Random Between Two Curve:跟随着时间,粒子某个属性值为两条曲线围成的区间的该时间点上的随机值。(粒子效果很大的一部分都需要在数值曲线中进行调节)
按照笔者自己的分类习惯,将ParticleSystem的23个功能模块分类为以下六个类别
(一)最基础模块
1、基础模块:ParticleSystem下的物件名(中的ParticleSystem)。
2、Renderer:渲染模块。
(二) 发射器模块
1、Emission:发射模块。
2、Shape:形状模块(发射器的形状)。
3、Sub Emitters:添加发射器模块。
(三)粒子生命周期特效控制模块
1、Velocity over Lifetime:粒子生命周期内的速度变化模块。
2、Limit Velocity over Lifetime:粒子生命周期内的限速模块。
3、Force over Lifetime:生命周期内粒子力的变化模块。
4、Color over Lifetime:生命周期内粒子颜色的变化模块。
5、Size over LifeTime:生命周期内粒子大小的变化模块。
6、Rotation over Lifetime:生命周期内粒子旋转属性的变化模块。
(四)粒子自身特效控制模块
1、Color by Speed:根据粒子速度改变粒子颜色模块。
2、Size by Speed:根据粒子速度改变粒子大小模块。
3、Rotation by Speed:根据粒子速度改变粒子速度模块。
4、Texture Sheet Animation:粒子帧动画模块。
5、Trails:路径模块。
6、Noise:噪音模块。
(五)粒子与外界交互的特效控制模块
1、Inherit Velocity:粒子速度继承模块。
2、External Forces:外力模块。(Particle System Force Field组件属于这一块)
3、Collision:碰撞体模块。
4、Triggers:触发器模块。
5、Lights:粒子灯光模块。
(六)自定义模块
Custom Data:自定义模块。
说明:关于over LifeTime模块与by Speed模块的区别
over LifeTime模块:类似花开花落的一生。
by Speed模块:类似跑龙套,当你满足条件则执行。
上海车展前夕,小编忽然收到一位公关**姐的邀请,请我参加车展上的 Unity 新品全球首发活动。Unity?小编上网查了一下,发现这是家实时 3D 互动内容创作和运营平台,基于 Unity 技术开发的游戏,截至 2021 年底占到全球排名前 1000 名移动游戏中的 72%,什么《王者荣耀》、《使命召唤》、《原神》…… 都少不了它。
哇!这是家牛逼的公司喔,但它和车有啥关系呢?
将车舱变为游戏间
到了现场,我发现原来 Unity 不只在游戏行业厉害,在汽车行业也是重量级的存在,目前其智能座舱解决方案,已被应用于蔚来、小鹏、理想 ……16 家造车新势力的产品上,包括小鹏 P7、G9;理 想 L7、L8、L9;蔚来 ET7、ES7、ET…… 车型,都搭载了 Unity 的实时 3D 技术。
在上海车展上,Unity 的重头戏就是发布 "Unity 汽车智能座舱解决方案 30",该方案系统性呈现了 Unity 作为实时 3D 内容创作软件的强大落地能力,也为车企与主机厂商提供了全新的设计灵感与创意思路,为消费者预告了未来座舱的各种可能性。
现场,Unity 中国平台技术总监杨栋展示了 "Unity 汽车智能座舱解决方案 30" 的诸多细节:比如在驾驶状态下,可以根据周边路况实时生成的超写实风格 3D 地图导航画面;用户也可以通过屏幕上与真车实时同步的 3D 模型,可视化 *** 控包括空调、车窗、音响等车内设备。
而针对冥想、KTV 、**、游戏等不同车内场景的深度理解,新方案也实现了基于预设的一键部署,甚至如果通过全景声、定向传声、以及座椅和手柄与游戏内容联动,还能提供触觉反馈等效果,让车内空间成为游戏电竞舱。
懂电脑的人都知道,越复杂的数字画面效果,对于 CPU、GPU…… 的性能要求越高。但 Unity 最厉害的地方,就是能让复杂影像尽可能少占用硬件资源,确保画面运作流畅度以及系统稳定度,这正是车机系统不可或缺的要素。
Unity 拥有强大的跨平台部署和高清渲染能力,可以在算力相对有限的情况下,实现非常高清的渲染效果,甚至可以在车机平台上实现粒子特效。小编现场看到,在 30 版渲染能力的升级下,在车载屏幕上实现了**级的入场动画和不同功能间的无缝转场,也做到了游戏级的视觉效果,确实厉害。
兼容性同样是 Unity 的优势所在――目前,Unity 已支持各大主流的车规级芯片与车机系统,其中包括 QNX、Android、Linux 等车机系统,以及高通、英伟达、恩智浦和芯驰等车载芯片,并且车厂在完成单次开发后,就可以便捷移植到多个不同配置的车机上,无需重新开发,这将能够将研发周期缩短 70%,降低时间消耗与人力成本。
过去,Unity 已经通过包括《王者荣耀》与《原神》…… 等基于 Unity 打造的爆款游戏,证明了实时 3D 内容创作的实力;并且也透过香港机场、北京城建、海尔卡奥斯 …… 等诸多项目,证明了 Unity 数字孪生解决方案的强大。
此番全新智能车舱解决方案的发布,可以视为 Unity 将游戏领域复制到汽车领域的开场。未来,Unity 中国将持续加大研发投入,致力于打造中国本土的、适配各类国产软硬件平台的数字生产力工具,丰富由实时图形渲染技术支撑的 AR、VR、MR 以及数字孪生体验。
本文来自易车号作者啊车网,版权归作者所有,任何形式转载请联系作者。内容仅代表作者观点,与易车无关
以上就是关于ios调用u3d时u3d加载太慢,怎么从后台加载全部的内容,包括:ios调用u3d时u3d加载太慢,怎么从后台加载、Unity高级开发-光照系统(三)-使用Unity的Progressive工具去正确的烘焙光照、unity中怎样用代码获取物体组件中的相关属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)