您的位置:首页 > 移动开发 > Unity3D

Unity原厂讲师对Unity内部技术讲解大解密

2015-01-28 22:36 169 查看
Asset Bundle工作流程及人物换装实例 – 刘刚

Unity内部的资源有两种(斯斯有两种?):

Resources:有10年历史,尽量用Asset Bundle

Asset Bundle:昵称AB,现今Unity处理资源的中心

AB选项的差异

透过Web Player下载Asset Bundle的Cache需要收费,在iOS,Android的Cache不需收费。—>手持游戏卯起来用!!!

浏览器本身也有Cache,为什麽要用Unity的Cache?

因为存在Cache里面是解压状态,下次调用不需再解压一次,大省CPU时间。

Unity会管理Cache大小,压缩档案解压後会丢掉。

Browser就只能存压缩状态的Asset Bundle,而且位置每种Browser都不同。–>有付钱有差AssetBundle.CreateFromMemory:大多数用在对内容作加解密,无法Cache,也就是每次执行都要下载一次,Script也可加密

AssetBundle.CreateFromFile

AssetBundle.Load与Application.Load的差异,Application.Load只能Load StreamAsset里面的东西。

每开一个www用来下载AssetBundle,就要用掉8MB的Buffer,所以www下载完要作以下动作来清掉那8M:

WWW.Dispose

AssetBundle.Unload(false)

Resources.UnloadUnusedAsset

AssetBundle可以作Dependency!!!

BuildPipeline.PushAssetDependencies,把资源推进去

BuildPipelinePopAssetDependencies,把资源弹出来

假设Push以下资源:A,B,C,透过Push&Pop,可以产生3个Packege,C依赖B,A,B依赖A,A独立的Asset Bundles,完全不会重复包资源!

在一个Prefab里面会有Mesh,Material,Shader,Texture,Script,都应该分开包,Load的时候再按照顺序Load回来,再配合上Cache机制,已经下载过的Asset Bundle就不需再下载一遍,可以达到资源、频宽的最佳使用–>不过这个资源相依的逻辑必须要设计清楚,否则会很乱

官方的实务建议是每个Asset Bundle在1M左右,太小下载次数会过多,太大下载时间过久。

可以把Script放在ScriptObject里面,再透过Asset Bundle载回来,如此就不需一定要将Script放在第一包。

官方Demo案例,透过Dependency的使用可将131MB大小缩成8.2M!

角色纸娃娃的处理方式,可以参考Unity提供的Character Customization范例,看里面如何拆分Asset Bundle。

地图处理方式,可以把地图拆成多个子场景,在主角移动时即时下载,即时显示。

Asset Bundle有CRC机制,如果下载有问题会自行重新下载

Code安全性

iOS平台封闭,不需担心(JB就再说)

其他平台可用Asset Bundle + 把Code作成.NET Assembly + AssetBundle.CreateFromMemory加解密来作

Web不适用於把code包成Native DLL的形式

大规模场景的资源拆解和动态载入-张鑫

进入场景全部载入,耗时,玩家根本没走到

Unity场景只有支援4096X4096,单位公尺,没办法作更大的场景

拆分有两种:

地形资源拆分

地表拆分

推荐拆分工具:Terrain Composer,最大可以拆8×8,每块大小2000×2000,也就是16000×16000,也就是16kmX16km

如果地形早就已经编好一堆了,该怎麽办?自行拆

地形资源怎麽拆?先生成空的NxN的Terrain

Terrain Data:把Data放到对应分块–>大工程

Light map:用Free Image来拆light map的.exr档案,Free Image有提供C++ Native DLL

LOD:重新把每一块Terrain作Terrain.SetNeighbors

地表资料怎麽拆?

根据地形分块来拆

用之前提到AssetBundle Depedency的方式打包

一包在1M左右

拆好了, 如何显示?

AssetBundle太大,在进场景就先Load

摄影机移动时,载入以摄影机为中心那一个的九宫格,其他的就释放掉,确保记忆体使用量,兼顾效率。

避免频繁的Instantiate,Destroy,造成拉机(?)回收机制太频繁(平均要10几ms),可用Object Pool。

避免开多个www同时下载,耗记忆体,www是使用Thread,会加大系统负担。

Coroutine也不要开太多,官方建议一个Coroutine循序下载多个Resource

载入时间比较:

Shader,Material:载入时间最久,主要在Parse内容进GPU,建议先载进来,反正不占记忆体。这也是Demo案例1xFPS到5xFPS的关键。–>第一次提到

Texture,Particle

Mecanim,Audio

Object Pool范例请参考AngryBot里面的子弹

现场Demo拆分後的场景,画面精细度很好,地图超过4096×4096,飞机一边飞一边动态下载AssetBundle後显示地形,FPS在50以上,在主流手机上也顺畅。

使用Unity引擎开发3D网页游戏 – 刘刚

改Loading Unity显示的Logo,unityObject.embedUnity,设定parameter for 3.4

UnityObject2(params),改params for 4.X

要弹出新视窗,OpenUrl不行,ExternalEval不行,要用html的iFrame/div,也可用rokbox,

Unity对DB,用WWWForm作Post,用WWW作GET–>直接读写DB有点瞎

Web游戏内容保护:

code加密:把Code包成Asset Bundle後,存成TextAsset,再包成AssetBundle(For Cache!),取用时要用Reflection取用,极难用。

code混淆:推荐作法,Web平台要官方帮忙,Android可以自己作,iOS听说不用作

资源加密:最需要的是Texture,可加密後存成TextAsset,记得再包成AssetBundle才能用Cache。

记忆体Leak,4.1.2的Profile可以看到所有GameObject的状态,请多用Profiler

动态载入,用ScriptableObject定义场景描述档,记录Dependency,然後根据这些资料来载场景内容。

Coroutine在Unity不是Multi Thread,多用还是会拖Main Thread,请慎用。

在一个新场景或新关卡,把Material与Shader先Load出来,放到一个空的GameObject里面,然後Diactive,有需要在放到正确的地方。–>第二次提到

AssetBundle打包颗粒度,Debug可以包越小越好,Release建议1MB

封住右键功能,防止使用者更换Unity Player版本。

从放游戏的Web Server上取其他URL的资源,要设定CrossDomain.xml

如果不用Asset Bundle,自行作压缩解压缩,一定要在载下来的时候马上解压缩,而且用AssetBundle.CreateFromMemory,耗时。–>AssetBundle的确是要Load才需要解压…

Material,Shader先打包吧!–>这应该算第三次提到吧?因为很重要所以要讲三次??

Unity的网路解决方案

非常好睡zzzzz

Photon Server:C#界面,底层用C++实作,可负荷30K同时在线,Load Balance机制,有FPS范例,用TCP与RUDP,只能用Windows。

SmartFox Server,Java实作,可用Windows/Linux,没有Load Balance,提供多种监控与管理界面。

用RakNet自己作

Unity引擎的性能优化 – 张鑫

Mobile优化

300~2000个Polygon

Skinned Mesh Renderer同时最多一个

Texture数量同时1~3

bone数量<30

Static Object

< 500 poly

标记Static

不要用Animation

地形:Texture数量<4,用Texture融合,可加5fps~10fps

Texture格式

用png, tga

不要超过1024

看起来像就好,可以用128×128,就不要用256×256

用mipmap

控制UV范围在(0, 1)–>原来还可以超过?

Mesh简化,用MeshLab,但只能简化静态Mesh。用Simplygon,

Mesh简化,Animation简化,用Simplygon,要钱,效果好。

不要用System.xml用mono.xml,减少程式码大小

Forwarding Light原理,要draw的Object数量X光源数,所以光源越少越好。

把Pixel Light设定固定值,美术再多光也只有一个。

粒子在Mobile平台,是以Block为单位Render,太多粒子会加高像素填充率,因为粒子没有深度,所以一定要画,Mobile平台的功率不够就会大大拖效能。

粒子小一点

粒子数量<50

粒子不要有Alpha

粒子不要碰撞

尽量不使用Mesh Colider,用Box,CapsuleCollider

Animation部分

没需要不用Animation,不需要每个东西都会动

没有缩放,手动或程式作业把Scale Curve去掉,可以减少33% Blending作业

Mecanim是多绪执行,不会拖Main Thread,一个Game Object上多个Animation clip才有用,如果只有一个clip,可考虑只用Animation

用Body Mask告诉Mecanim哪边不需要计算

Renderer部份

避免Alpha Test,Alpha Blend

Static Batching需要大量的VertexBuffer,如果Vertex过多,要把一堆Vertex搬来搬去,反而拖效能

Dynamic Batching在Polygon < 900会自动作用,如果GameObject的Shader有Position,Normal,UV,每多用一个,900就要减半。

在使用Dynamic Batching时,Vertex只能在CPU作结合,所以Vertex不能太多

如果同一场景中小块Texture很多,可以考虑用程式将Texture拼合,要拼合的Texture如果UV超过(0, 1)就很难作。

Mobile平台的Occlusion Culling适合用PVS and dynamic objects

用for代替foreach,因为foreach会生一堆Iterator

用Struct代替class,快30倍

传说中8小时一定回信的高级email support

影子的优化,可参考ShadowGun模拟影子的实作

接下来Unity的Roadmap会支援新UI(讲好久了)与Server。

更多精彩关注狗刨学习网:http://www.gopedu.com/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: