Asset Bundle工作流程及人物换装实例- 刘刚

Unity内部的资源有两种

  • Resources:有10年历史,尽量用资产包
  • Asset Bundle:昵称AB,现今Unity处理资源的中心

AB选项的差异

  • 透过Web Player下载Asset Bundle的Cache需要收费,在iOS,Android的Cache不需收费。--->手持游戏顶起来用!!!
  • 浏览器本身也有Cache,为什么要用Unity的Cache?
  1. 因为存在Cache里面是解压状态,下次调用不需再解压一次,大省CPU时间。
  2. Unity会管理Cache大小,压缩档案解压后会丢掉。
  • Browser就只能存压缩状态的Asset Bundle,而且位置每种Browser都不同。-->有付钱有差
  • AssetBundle.CreateFromMemory:大多数用在对内容作加解密,无法Cache,也就是每次执行都要下载一次,Script也可加密
  • AssetBundle.CreateFromFile
  • AssetBundle.Load与Application.Load的差异,Application.Load只能装载StreamAsset里面的东西。
  • 每开一个www用来下载AssetBundle,就要用掉8MB的Buffer,所以www下载完要作以下动作来清掉那8M:

WWW.Dispose

  • AssetBundle.Unload(假)
  • Resources.UnloadUnusedAssets

AssetBundle可以作相关性!

  1. BuildPipeline.PushAssetDependencies,把资源推进去
  2. 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就再說)
  • 其他平台可用资产包+把代码作成。NET组件+ AssetBundle.CreateFromMemory加解密来作
  • Web不适用于把code包成Native DLL的形式

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

  • 进入场景全部载入,耗时,玩家根本没走到
  • Unity场景只有支援4096X4096,单位公尺,没办法作更大的场景

拆分有两种

  • 地形资源拆分
  • 地表拆分
  • 推薦拆分工具:Terrain Composer,http://www.terraincomposer.com/,最大可以拆8x8,每塊大小2000x2000,也就是16000x16000,也就是16kmX16km
  • 如果地形早就已经编好一堆了,该怎么办?自行拆分

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

  • Terrain Data:把Data放到對應分塊-->大工程
  • 光照图:用免费图片来拆光地图的.exr档案,免费图片有提供c + +原生的DLL
  • LOD:重新把每一块地形作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的关键。--> 第一次提到
  • 纹理,粒子
  • Mecanim,音频
  • Object Pool范例请参考AngryBot里面的子弹
  • 现场Demo拆分后的场景,画面精细度很好,地图超过4096x4096,飞机一边飞一边动态下载AssetBundle后显示地形,FPS在50以上,在主流手机上也顺畅。

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

  • 改加载统一显示的标志,unityObject.embedUnity,设定参数为3.4
  • UnityObject2(PARAMS),改PARAMS在4.X
  • 要彈出新視窗,OpenUrl不行,ExternalEval不行,要用html的iFrame/div,也可用rokbox,http://www.rockettheme.com/extensions-joomla/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,然后根据这些资料来载场景内容。
  • 协程在团结不是多线程,多用还是会拖为主线,请慎用。
  • 在一个新场景或新关卡,把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,  http://www.smartfoxserver.com/,Java实作,可用Windows/Linux,没有Load Balance,提供多种监控与管理界面。
  • 用RakNet自己作

Unity引擎的性能優化 - 張鑫

Mobile優化

  • 300~2000個Polygon
  • 蒙皮网格渲染器同时最多一个
  • Texture數量同時1~3
  • bone數量<30

静态对象

  • <500 poly
  • 标记 static
  • 不要用Animation
  • 地形:Texture數量<4,用Texture融合,可加5fps~10fps

纹理格式

  • 用PNG,TGA
  • 不要超过1024
  • 看起来像就好,可以用128x128,就不要用256x256
  • 用mipmap
  • 控制UV范围在(0, 1)-->原来还可以超过?
  • Mesh簡化,用MeshLab,但只能簡化靜態Mesh。用Simplygon,
  • Mesh簡化,Animation簡化,用Simplygon,http://www.simplygon.com/,要錢,效果好。
  • 不要用System.xml用mono.xml,减少程式码大小
  • Forwarding Light原理,要draw的Object數量X光源數,所以光源越少越好。
  • 把Pixel Light设定固定值,美术再多光也只有一个。

粒子

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

  • 粒子小一点
  • 粒子數量<50
  • 粒子不要有Alpha
  • 粒子不要碰撞
  • 儘量不使用Mesh Colider,用Box,CapsuleCollider

动画部分

  • 没需要不用Animation,不需要每个东西都会动
  • 没有缩放,手动或程式作业把Scale Curve去掉,可以减少33% Blending作业
  • Mecanim是多绪执行,不会拖Main Thread,一个Game Object上多个Animation clip才有用,如果只有一个clip,可考虑只用Animation
  • 用Body Mask告訴Mecanim哪邊不需要計算

渲染部份

  • 避免alpha测试,alpha混合
  • 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)就很难作。
  • 移动平台的遮挡剔除适合用PV和动态对象
  • 用for代替foreach,因为的foreach会生一堆迭代器
  • 用Struct代替class,快30倍
  • 传说中8小时一定回信的高级 email support
  • 影子的优化,可参考ShadowGun模拟影子的实作
  • 接下来Unity的Roadmap会支援新UI(讲好久了)与Server。

文献资料

本文转载自:http://nedwu13.blogspot.tw/2013_11_01_archive.html (墙外)

Unity原厂讲师大解密的更多相关文章

  1. (转)Unity原厂讲师大解密

    本文转载自:http://nedwu13.blogspot.tw/2013_11_01_archive.html   Asset Bundle工作流程及人物換裝實例 - 劉剛 Unity內部的資源有兩 ...

  2. Unity 原厂免费资源学习

     

  3. 看完它,你就全懂了十大Wifi芯片原厂!

    看完它,你就全懂了十大Wifi芯片原厂!   来源:全球物联网观察 概要:不知不觉中,WiFi几乎已攻占了整个世界.现在只要你上网,可能就离不开WiFi了. 2014年是物联网WiFi市场关键的转折期 ...

  4. 用了这么多年的MCU,你知道哪些MCU原厂最牛?

    单片机诞生于1971年,经历了SCM.MCU.SoC三大阶段.单片机由以前的1位.4位.8位.16位,发展到现在的32位甚至64位. 90年代后随着消费电子产品大发展,单片机技术得到了巨大提高,相继诞 ...

  5. wndr4300刷任意系统及刷回官方原厂系统

    4300是目前性价比比较高的可玩路由器了,如果要买的话要买v1版本的,目前卖的都是v2,v2刷不了第三方系统. 注意:如果带宽低于50M,可以随便刷第三方系统玩,如果高于50M的带宽或者想组建千兆局域 ...

  6. 连接器巨头Molex莫仕:替代品厂PK原厂

    序言:在中国电子产业,原厂PK替代品厂一直是一个极具话题性.美国在贸易战背景下,挤压中国的发展空间,迫使这一类企业要觉醒.当然受影响的不止中国电子企业,美国电子企业也一样. 在连接器这一领域,Mole ...

  7. JavaScript图表FusionCharts免费在线公开课,由印度原厂技术工程师主讲,10月13日发车

    FusionCharts公开课达人还你做 轻松晋升图表大师 [开课时间]10月13日 14:30[主讲老师]印度原厂技术工程师[开课形式]网络在线公开课[活动费用]前50名免费 现在就可以报名哦  报 ...

  8. TP-LINK WR941 DD-WRT刷回OpenWRT及OpenWRT刷回原厂固件

    1.DD-Wrt 刷回 OpenWrt A.从官网下载固件: root@TL-DDWRT:/tmp# wget http://downloads.openwrt.org/barrier_breaker ...

  9. WNDR3700V4恢复原厂固件(使用TFTP刷网件原厂固件)

    WNDR3700v4原厂固件下载地址: http://support.netgear.cn/doucument/More.asp?id=2203 操作方法: 1.将设备断电: 2.按住设备背面的Res ...

随机推荐

  1. 自定义HttpMessageHandler实现HTTP方法的重写

    自定义HttpMessageHandler实现HTTP方法的重写

  2. 伏羲八卦、文王六十四卦、老子阴阳太极、西方哲学辩证与"解耦和复用”思想的异曲同工之妙

    伏羲八卦.文王六十四卦.老子阴阳太极.西方哲学辩证与"解耦和复用”思想的异曲同工之妙     问题:任何程序语言在遇到复杂逻辑时,代码维护难度就会加大,如何处理该问题? 答案:重构,模块化. ...

  3. Silverlight的TextWrapping

    Silverlight中TextBox的TextWrapping属性,作用是获取或设置 TextBlock 对文本进行换行的方式. 默认值为 TextWrapping.NoWrap. TextWrap ...

  4. ArrayList 与 LinkedList

    ArrayList:数组结构,插入删除的效率低,查询的效率较高. LinkedList:链接数据结构,插入删除的效率较高,查询的效率低. 两者的使用 ArrayList:适合用作添加数据,做查询. L ...

  5. 将内表通过TXT文本输出

    PARAMETERS: num TYPE i. TYPE-POOLS: truxs. "类型组 DATA:w_filename TYPE string. TYPES:BEGIN OF ty_ ...

  6. Atitit.木马病毒的免杀原理---sikuli 的使用

    Atitit.木马病毒的免杀原理---sikuli 的使用 1. 使用sikuli java api1 1.1. 3. Write code!1 2. 常用api2 2.1. wait 等待某个界面出 ...

  7. iOS--页面间的代理传值(属性、代理(委托)、代码块、单例、通知)

    (一)属性传值 (二)代理(委托)传值 代理传值 适用于 反向传值 (从后往前传) 1.1 创建协议 及协议方法 在反向传值的页面(SecondViewController)中 1.2 创建协议类型的 ...

  8. 让div中的table居中

    div 标签上写  style="text-align:center" div中的table中写 style="margin:auto;"  <table ...

  9. Orchard扩展 自定义后台管理导航菜单 Admin Menu

    金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉. 金天:看源码永远是Coder学习的最快捷路径.     看本文需要对Orchard大致体系, 特别是Mo ...

  10. python简单的爬虫,网页图片

    1 #!/usr/bin/python 2 #coding=utf-8 3 import urllib 4 import re 5 6 def gethtml(url): 7 page=urllib. ...