(转)Unity原厂讲师大解密
本文转载自:http://nedwu13.blogspot.tw/2013_11_01_archive.html
- 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.UnloadUnusedAssets
- 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,http://www.terraincomposer.com/,最大可以拆8x8,每塊大小2000x2000,也就是16000x16000,也就是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拆分後的場景,畫面精細度很好,地圖超過4096x4096,飛機一邊飛一邊動態下載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,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,然後根據這些資料來載場景內容。
- 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, http://www.smartfoxserver.com/,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
- 看起來像就好,可以用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部分
- 沒需要不用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。
(转)Unity原厂讲师大解密的更多相关文章
- Unity原厂讲师大解密
Asset Bundle工作流程及人物换装实例- 刘刚 Unity内部的资源有两种 Resources:有10年历史,尽量用资产包 Asset Bundle:昵称AB,现今Unity处理资源的中心 A ...
- Unity 原厂免费资源学习
- 看完它,你就全懂了十大Wifi芯片原厂!
看完它,你就全懂了十大Wifi芯片原厂! 来源:全球物联网观察 概要:不知不觉中,WiFi几乎已攻占了整个世界.现在只要你上网,可能就离不开WiFi了. 2014年是物联网WiFi市场关键的转折期 ...
- 用了这么多年的MCU,你知道哪些MCU原厂最牛?
单片机诞生于1971年,经历了SCM.MCU.SoC三大阶段.单片机由以前的1位.4位.8位.16位,发展到现在的32位甚至64位. 90年代后随着消费电子产品大发展,单片机技术得到了巨大提高,相继诞 ...
- wndr4300刷任意系统及刷回官方原厂系统
4300是目前性价比比较高的可玩路由器了,如果要买的话要买v1版本的,目前卖的都是v2,v2刷不了第三方系统. 注意:如果带宽低于50M,可以随便刷第三方系统玩,如果高于50M的带宽或者想组建千兆局域 ...
- 连接器巨头Molex莫仕:替代品厂PK原厂
序言:在中国电子产业,原厂PK替代品厂一直是一个极具话题性.美国在贸易战背景下,挤压中国的发展空间,迫使这一类企业要觉醒.当然受影响的不止中国电子企业,美国电子企业也一样. 在连接器这一领域,Mole ...
- JavaScript图表FusionCharts免费在线公开课,由印度原厂技术工程师主讲,10月13日发车
FusionCharts公开课达人还你做 轻松晋升图表大师 [开课时间]10月13日 14:30[主讲老师]印度原厂技术工程师[开课形式]网络在线公开课[活动费用]前50名免费 现在就可以报名哦 报 ...
- TP-LINK WR941 DD-WRT刷回OpenWRT及OpenWRT刷回原厂固件
1.DD-Wrt 刷回 OpenWrt A.从官网下载固件: root@TL-DDWRT:/tmp# wget http://downloads.openwrt.org/barrier_breaker ...
- WNDR3700V4恢复原厂固件(使用TFTP刷网件原厂固件)
WNDR3700v4原厂固件下载地址: http://support.netgear.cn/doucument/More.asp?id=2203 操作方法: 1.将设备断电: 2.按住设备背面的Res ...
随机推荐
- ant design Modal关闭时清除数据的解决方案
背景:modal组件关闭时不清除数据,原来输入的数据还存在 解决方案: 1.modal的api:destroyOnClose 2.手动控制modal的销毁 this.state = { destroy ...
- 关于.net core程序的部署
最近发布.net core程序的时候,发现它是可以独立部署的,它支持如下两种部署方式: 依赖框架的部署FDD.只发布我们的程序,运行前用户需要手动安装.net core runtime. 独立部署SC ...
- USBDM RS08/HCS08/HCS12/Coldfire V1,2,3,4/DSC/Kinetis Debugger and Programmer -- MC9S08JS16
Introduction The attached files provide a port of a combined TBDML/OSBDM code to a MC9S08JS16 proces ...
- LAMP学习路线图
站点开发概述 LAMP开发概述 HTML基础 CSS基础 DIV+CSS Javascript Jquery(Ajax) WAMP 环境搭建 PHP基本的语法,变量.数据类型,表达式,常量,流程控制, ...
- Leetcode 234 Palindrome Linked List 复杂度为时间O(n) 和空间(1)解法
1. 问题描写叙述 给定一个单链表,推断其内容是不是回文类型. 比如1–>2–>3–>2–>1.时间和空间复杂都尽量低. 2. 方法与思路 1)比較朴素的算法. 因为给定的数据 ...
- [EF Core]数据迁移(二)
摘要 在实际项目中,大多都需要对业务逻辑以及操作数据库的逻辑进行分成操作,这个时候该如何进行数据的迁移呢? 步骤 上篇文章:EF Core数据迁移操作 比如,我们将数据上下文放在了Data层. 看一下 ...
- PostgreSQL代码分析,查询优化部分,canonicalize_qual
这里把规范谓词表达式的部分就整理完了.阅读的顺序例如以下: 一.PostgreSQL代码分析,查询优化部分,canonicalize_qual 二.PostgreSQL代码分析,查询优化部分,pull ...
- Java知识回顾 (2) Java 修饰符
一.Java 修饰符 1.1 访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default (即缺省,什么也不写): 在 ...
- JAVA card 应用开发(二) 在项目添加APPLET
在上篇博文中.<JAVA card 应用开发创建第一个APPLET>.介绍了一个项目从无到有. 那么.我们建立了这个项目后,仅仅有一个应用(一个可选AID),假设我希望这个项目能够有多个应 ...
- Unite 2017 | 从《闹闹天宫》看MOBA游戏里的网络同步技术
http://mp.weixin.qq.com/s/0v0EU79Q6rFafrh8ptlmhw 在Unite 2017 Shanghai案例分享专场,来自蓝港互动<闹闹天宫>项目组的主程 ...