Unity中为什么合并了 SkinnedMeshRenderer后三星note4内存合并会一直增加

Unity_慧知文库
一、运行过程中优化: 1、顶点性能 一般来说,如果您想在 iPhone 3GS 或更新的设备上每帧渲染不超过 40,000 可见点,那么对 于一些配备 MBX GPU 的旧设备(比如,原始的 iPhone,如 iPhone 3g 和 iPod Touch 第 1 和 第...
一、运行过程中优化: 1、顶点性能 一般来说,如果您想在 iPhone 3GS 或更新的设备上每帧渲染不超过 40,000 可见点,那么对 于一些配备 MBX GPU 的旧设备(比如,原始的 iPhone,如 iPhone 3g 和 iPod Touch 第 1 和 第 2 代)来说,你应该保证每帧的渲染顶点在 10000 以下。 2、光照性能 像素的动态光照将对每个受影响的像素增加显着的计算开销, 并可能导致物体会被渲染多次。 为了避免这种情况的发生, 您应该避免对于任何单个物体都使用多个像素光照, 并尽可能地 使用方向光。 需要注意的是像素光源是一个渲染模式 (Render Mode) 设置为重要 (Important) 的光源。像素的动态光照将对顶点变换增加显着的开销。所以,应该尽量避免任何给定的物 体被多个光源同时照亮的情况。对于静态物体,采用烘焙光照方法则是更为有效的方法。 3、角色 每个角色尽量使用一个 Skinned Mesh Renderer, 这是因为当角色仅有一个 Skinned Mesh Renderer 时, Unity 会 使用可见性裁剪和包围体更新的方法来优化角色的运动, 而这种优 化只有在角色仅含有一个 Skinned Mesh Renderer 时才会启动。角色的面数一般不要超过 1500(手机一般人物模型控制在 300 左右),骨骼数量少于 30 就好,角色 Material 数量一般 1~2 个为最佳。影响 drawcall 数量,应该控制在 35 以内,目前已经超过有待于优化。 4、静态物体 对于静态物体定点数要求少于 500,UV 的取值范围不要超过(0,1)区间,这对于纹理的拼 合优化很有帮助。不要在静态物体上附加 Animation 组件,虽然加了对结果没什么影响,但 是会增加 CPU 开销。 5、摄像机 将远平面设置成合适的距离,远平面过大会将一些不必要的物体加入渲染,降低效率。另外 我们可以根据不同的物体来设置摄像机的远裁剪平面。 Unity 提供了可以根据不同的 layer 来设置不同的 view distance ,所以我们可以实现将物体进行分层,大物体层设置的可视距 离大些,而小物体层可以设置地小些,另外,一些开销比较大的实体(如粒子系统)可以设 置得更小些等等。 6、DrawCall 尽可能地减少 Drawcall 的数量。 IOS 设备上建议不超过 100 。减少的方法主要有如下几 种: Frustum Culling , Occlusion Culling , Texture Packing 。 Frustum Culling 是 Unity 内 建的, 我们需要做的就是寻求一个合适的远裁剪平面; Occlusion Culling , 遮挡剔除, Unity 内嵌了 Umbra ,一个非常好 OC 库。但 Occlusion Culling 也并不是放之四海而皆准的,有 时候进行 OC 反而比不进行还要慢,建议在 OC 之前先确定自己的场景是否适合利用 OC 来优化; Texture Packing ,或者叫 Texture Atlasing ,是将同种 shader 的纹理进行拼合, 根据 Unity 的 static batching 的特性来减少 draw call 。建议使用,但也有弊端,那就是一 定要将场景中距离相近的实体纹理进行拼合, 否则, 拼合后很可能会增加每帧渲染所需的纹 理大小,加大内存带宽的负担。这也就是为什么会出现“ DrawCall 降了,渲染速度也变慢 了”的原因。 http://wg2009perfect./blog/static// 二、资源加载优化 1. 两种动态加载机制:一个是 Resources.Load,另外一个通过 AssetBundle; Resources.Load 就是从一个缺省打进程序包里的 AssetBundle 里加载资源,而一般 AssetBundle 文件需要你 自己创建,运行时 动态加载,可以指定路径和来源的。 AssetBundle 运行时加载:
用 CreateFromMemory(byte[]),这个 byte[]可以来自文件读取的缓冲, www 的下载或者其他可 能的方式。 其实 WWW 的 assetBundle 就是内部数据读取完后自动创建了一个 assetBundle 而已 Create 完以 后, 等于 把硬 盘 或者 网络 的一 个文件 读 到内 存一 个区 域,这 时 候只 是个 AssetBundle 内存镜像数据块,还没有 Assets 的概念。 Assets 加载: 用 AssetBundle.Load(同 Resources.Load) 这才会从 AssetBundle 的内存镜像里读取并创建一个 Asset 对象,创建 Asset 对象同时也会分配相应内存用于存放(反序列化) 异步读取用 AssetBundle.LoadAsync 也可以一次读取多个用 AssetBundle.LoadAll AssetBundle 的释放: AssetBundle.Unload(flase)是释放 AssetBundle 文件的内存镜像,不包含 Load 创建的 Asset 内 存对象。 AssetBundle.Unload(true)是释放那个 AssetBundle 文件内存镜像和并销毁所有用 Load 创建的 Asset 内存对象。 GC.Collect()强制垃圾收集器立即释放内存 Unity 的 GC 功能不算好,没把握的时候就强制调 用一下 一个 Prefab 从 assetBundle 里 Load 出来 里面可能包括:Gameobject transform mesh texture material shader script 和各种其他 Assets。 你 Instaniate 一个 Prefab,是一个对 Assets 进行 Clone(复制)+引用结合的过程,GameObject transform 是 Clone 是新生成的。其他 mesh / texture / material / shader 等,这其中些是纯引 用的关系的, 包括: Texture 和 TerrainData, 还有引用和复制同时存在的, 包括: Mesh/material /PhysicMaterial。引用的 Asset 对象不会被复制,只是一个简单的指针指向已经 Load 的 Asset 对象。 如果这个 AssetBundle1 是要反复读取的 不方便 Unload ,那可以在 Destroy 以后用: Resources.UnloadUnusedAssets()把所有和这个 npc 有关的 Asset 都销毁。 一是静态引用, 建一个 public 的变量, 在 Inspector 里把 prefab 拉上去, 用的时候 instantiate 二是 Resource.Load,Load 以后 instantiate 三是 AssetBundle.Load,Load 以后 instantiate 三 种 方 式 有 细 节 差 异 , 前 两 种 方 式 , 引 用 对 象 texture 是 在 instantiate 时 加 载 , 而 assetBundle.Load 会把 perfab 的全部 assets 都加载,instantiate 时只是生成 Clone。所 以前两种方式,除非你提前加载相关引用对象,否则第一次 instantiate 时会包含加载引用 assets 的操作,导致第一次加载的 lag。 例子 2: 从磁盘读取一个 1.unity3d 文件到内存并建立一个 AssetBundle1 对象 AssetBundle AssetBundle1 = AssetBundle.CreateFromFile(&1.unity3d&); 从 AssetBundle1 里读取并创建一个 Texture Asset,把 obj1 的主贴图指向它
obj1.renderer.material.mainTexture = AssetBundle1.Load(&wall&) as T 把 obj2 的主贴图也指向同一个 Texture Asset obj2.renderer.material.mainTexture =obj1.renderer.material.mainT Texture 是引用对象, 永远不会有自动复制的情况出现(除非你真需要, 用代码自己实现 copy), 只会是创建和添加引用 如果继续: AssetBundle1.Unload(true) 那 obj1 和 obj2 都变成黑的了,因为指向的 Texture Asset 没了 如果: AssetBundle1.Unload(false) 那 obj1 和 obj2 不变,只是 AssetBundle1 的内存镜像释放 了 继续: Destroy(obj1),//obj1 被释放,但并不会释放刚才 Load 的 Texture 如果这时候: Resources.UnloadUnusedAssets(); 不会有任何内存释放 因为 Texture asset 还被 obj2 用着 如果 Destroy(obj2) obj2 被释放,但也不会释放刚才 Load 的 Texture 继续 Resources.UnloadUnusedAssets(); 这时候刚才 load 的 Texture Asset 释放了,因为没有任何引用了 最后 CG.Collect(); 强制立即释放内存 由此可以引申出论坛里另一个被提了几次的问题,如何加载一堆大图片轮流显示又不爆掉 ************************************************************* 不考虑 AssetBundle,直接用 www 读图片文件的话等于是直接创建了一个 Texture Asset 假设文件保存在一个 List 里 TLlist&string& fileL int n=0; IEnumerator OnClick() { WWW image = new www(fileList[n++]); obj.mainTexture = image. n = (n&=fileList.Length-1)?0:n; Resources.UnloadUnusedAssets(); } 这样可以保证内存里始终只有一个巨型 Texture Asset 资源,也不用代码追踪上一个加载的
Texture Asset,但是速度比较慢 或者: IEnumerator OnClick() { WWW image = new www(fileList[n++]); Texture tex = obj.mainT obj.mainTexture = image. n = (n&=fileList.Length-1)?0:n; Resources.UnloadAsset(tex); } 这样卸载比较快 比较保险的做法是 创建时: 先建立一个 AssetBundle,无论是从 www 还是文件还是 memory 用 AssetBundle.load 加载需要的 asset 用完后立即 AssetBundle.Unload(false),关闭 AssetBundle 但不摧毁创建的对象和引用 销毁时: 对 Instantiate 的对象进行 Destroy 在合适的地方调用 Resources.UnloadUnusedAssets,释放已经没有引用的 Asset. 如果需要立即释放加上 GC.Collect() 这样可以保证内存始终被及时释放 只要你 Unload 过的 AssetBundle,那些创建的对象和引用都会在 LoadLevel 时被自动释放。 其实存在 3 种加载 prefab 的方式: 一是静态引用, 建一个 public 的变量, 在 Inspector 里把 prefab 拉上去, 用的时候 instantiate 二是 Resource.Load,Load 以后 instantiate 三是 AssetBundle.Load,Load 以后 instantiate 三种方式有细节差异,前两种方式,引用对象 texture 是在 instantiate 时加载,而 assetBundle.Load 会把 perfab 的全部 assets 都加载,instantiate 时只是生成 Clone。所 以前两种方式,除非你提前加载相关引用对象,否则第一次 instantiate 时会 包含加载引用类 assets 的操作,导致第一次加载的 lag。官方论坛有人说 Resources.Load 和静态引用是会 把所有资源都预先加载的, 反复测试的结果, 静态引用和 Resources.Load 也是 OnDemand 的,用到时才会加载。
几种 AssetBundle 创建方式的差异: CreateFromFile:这种方式不会把整个硬盘 AssetBundle 文件都加载到 内存来,而是类似建 立一个文件操作句柄和缓冲区,需要时才实时 Load,所以这种加载方式是最节省资源的,基本 上 AssetBundle 本身不占什么内存,只需要 Asset 对象的内存。可惜只能在 PC/Mac Standalone 程序中使用。 CreateFromMemory 和 www.assetBundle:这两种方式 AssetBundle 文件会整个镜像于内 存中, 理论上文件多大就需要多大的内存, 之后 Load 时还要占用额外内存去生成 Asset 对象。 什么时候才是 UnusedAssets? 看一个例子: Object obj = Resources.Load(&MyPrefab&); GameObject instance = Instantiate(obj) as GameO ......... Destroy(instance); 创建随后销毁了一个 Prefab 实例,这时候 MyPrefab 已经没有被实际的物体引用了,但如果 这时: Resources.UnloadUnusedAssets(); 内存并没有被释放,原因:MyPrefab 还被这个变量 obj 所引用 这时候: obj = Resources.UnloadUnusedAssets(); 这样才能真正释放 Assets 对象 所以:UnusedAssets 不但要没有被实际物体引用,也要没有被生命周期内的变量所引用,才 可以理解为 Unused(引用计数为 0) 所以所以:如果你用个全局变量保存你 Load 的 Assets,又没有显式的设为 null,那 在这个变 量失效前你无论如何 UnloadUnusedAssets 也释放不了那些 Assets 的。如果你这些 Assets 又不是从磁盘加载的,那除了 UnloadUnusedAssets 或者加载新场景以外没有其他方式可以 卸载之。 一个复杂的例子,代码很丑陋实际也不可能这样做,只是为了加深理解 IEnumerator OnClick() { Resources.UnloadUnusedAssets();//清干净以免影响测试效果 yield return new WaitForSeconds(3); float wait = 0.5f; //用 www 读取一个 assetBundle,里面是一个 Unity 基本球体和带一张大贴图的材质,是一个 Prefab
WWW aa = new WWW(@&file://SpherePrefab.unity3d&); AssetBundle asset = aa.assetB yield return new WaitForSeconds(wait);//每步都等待 0.5s 以便于分析结果 Texture tt = asset.Load(&BallTexture&) as T//加载贴图 yield return new WaitForSeconds(wait); GameObject ba = asset.Load(&SpherePrefab&) as GameO//加载 Prefab yield return new WaitForSeconds(wait); GameObject obj1 = Instantiate(ba) as GameO// 生成实例 yield return new WaitForSeconds(wait); Destroy(obj1);//销毁实例 yield return new WaitForSeconds(wait); asset.Unload(false);//卸载 Assetbundle yield return new WaitForSeconds(wait); Resources.UnloadUnusedAssets();//卸载无用资源 yield return new WaitForSeconds(wait); ba =//将 prefab 引用置为空以后卸无用载资源 Resources.UnloadUnusedAssets(); yield return new WaitForSeconds(wait); tt =//将 texture 引用置为空以后卸载无用资源 Resources.UnloadUnusedAssets(); } 这是测试结果的内存 Profile 曲线图
Unity3D 占用内存太大怎么解决呢? 图片:p12.jpg 很经典的对称造型,用多少释放多少。 这是各阶段的内存和其他数据变化 说明: 1 2 3 初始状态 载入 AssetBundle 文件后,内存多了文件镜像,用量上升,Total Object 和 Assets 载入 Texture 后,内存继续上升,因为多了 Texture Asset,Total Objects 和 Assets
增加 1(AssetBundle 也是 object)
增加 1 4 载入 Prefab 后,内存无明显变化,因为最占内存的 Texture 已经加载,Materials 上 升是因为多了 Prefab 的材质,Total Objects 和 Assets 增加 6,因为 Perfab 包含很多 Components 5 6 7 8 清空 9 10 把 Prefab 引用变量设为 null 以后,整个 Prefab 除了 Texture 外都没有任何引用了, 再把 Texture 的引用变量设为 null,之后也被 UnloadUnusedAssets 销毁, 内存被释 所以被 UnloadUnusedAssets 销毁,Assets 和 Total Objects Count 减 6 放,assets 和 Total Objects Count 减 1,基本还原到初始状态 从中也可以看出: Texture 加载以后是到内存,显示的时候才进入显存的 Texture Memory。 所有的东西基础都是 Object Load 的是 Asset,Instantiate 的是 GameObject 和 Object in Scene Load 的 Asset 要 Unload,new 的或者 Instantiate 的 object 可以 Destroy 实例化 Prefab 以后,显存的 Texture Memory、GameObjectTotal、Objects in 销毁实例后,上一步的变化还原,很好理解 卸载 AssetBundle 文件后, AssetBundle 文件镜像占用的内存被释放, 相应的 Assets 直接 Resources.UnloadUnusedAssets,没有任何变化,因为所有 Assets 引用并没有 Scene 上升,都是因为实例化了一个可视的对象 和 Total Objects Count 也减 1 http://blog.csdn.net/jbjwpzyl3611421/article/details/
一、加载资源 // ########## 资源管理(通过 HTTP 获取缺少的图片并保存在本地) ########## 1. 两 种 动 态 加 载 机 制 : 一 个 是 Resources.Load , 另 外 一 个 通 过 AssetBundle; Resources.Load 就是从一个缺省打进程序包里的 AssetBundle 里加载 资源,而一般 AssetBundle 文件需要你自己创建,运行时 动态加载,可以指定路径 和来源的。 2. AssetBundle 运行时加载:用 CreateFromMemory(byte[]),这个 byte[]可以来自文件读取 的缓冲,www 的下载既是通过 HTTP 获取缺少的图片并保存在本地。其实 WWW 的 assetBundle 就是内部数据读取完后自动创建了一个 assetBundle 而已。Create 完以 后, 等于把硬盘或者网络的一个文件读到内存一个区域, 这时候只是个 AssetBundle 内存镜像数据块,还没有 Assets 的概念。 Assets 加载 : 用 AssetBundle.Load( 同 Resources.Load) 这才会从 AssetBundle 的内存镜像里读取并创建一个 Asset 对象, 创 建 Asset 对象同时也会分配相应内存用于存放(反序列化) 异步读取用 AssetBundle.LoadAsync 也可以一次读取多个用 AssetBundle.LoadAll 3. AssetBundle 的释放: AssetBundle.Unload(flase)是释放 AssetBundle 文件的内存镜像,不包含 Load 创建的 Asset 内存对象。AssetBundle.Unload(true)是释放那个 AssetBundle 文件内存镜像和 并销毁所有用 Load 创建的 Asset 内存对象。GC.Collect()强制垃圾收集器立即释放内 存 Unity 的 GC 功能不算好,没把握的时候就强制调用一下 注意:Texture 加载以后是到内存,显示的时候才进入显存的 Texture Memory。 所有的东西基础都是 Object Load 的是 Asset,Instantiate 的是 GameObject 和 Object in Scene Load 的 Asset 要 Unload,new 的或者 Instantiate 的 object 可以 Destroy 总而言之: 先建立一个 AssetBundle,无论是从 www 还是文件还是 memory 用 AssetBundle.load 加载需要的 asset (注意建立物体索引列表,是否需要建立 gameobject 池待定)用完后立即 AssetBundle.Unload(false),关闭 AssetBundle 但不摧 毁创建的对象和引用,利用隐藏模型并且改变模型位置的方法,实现移动或者部分 刷新 销 毁 时 , 对 Instantiate 的 对 象 进 行 Destroy 。 在 合 适 的 地 方 调 用 Resources.UnloadUnusedAssets, 释放已经没有引用的 Asset. 如果需要立即释放加上 GC.Collect(),这样可以保证内存始终被及时释放。 二、报文处理 using System.Net.S client.BeginConnect(address, new AsyncCallback(Connected), null); //建立异步连接服 务 , Connected 进行监听 指定编码方式 byte[] msg = Encoding.UTF8.GetBytes(str); byte[] msg = System.Text.Encoding.ASCII.GetBytes(str); 消息解析方面, 仿照安卓客户端, 实际效果功能测试已经完成, 压力测试待完成 (注 意,中文需要加字库处理)
三、界面 NGUI(杜鑫) 关于 unity GUI 一点备注: 一个包含 OnGUI 方法的 script 对 CPU 的消耗是很大的,这是因为很多 OnGUI 的启 动类和方法占用了大量 CUP,例如:GUI.Repaint 就会无端占用 65%的 CPU,所以系统占 用 在 OnGUI 调 用 前 就 已 经 开 始 了 。 目 前 有 两 种 解 决 方 法 , 一 种 是 将 footerDlg.gameObject.active =并在初始化场景或者需要的时候让 active 等于 true。 (该方法已经测试过是可行的)代码如下: void Awake() { // cache reference to footer dlg footerDlg=(DlgPuzzleFooter)GameObject.FindObjectOfType(typeof(DlgPuzzleFoo ter)); if ( footerDlg == null ) { Debug.Log(&Error: DlgPuzzleFooter object is missing.&); } else { // deactivate it until needed, for performance footerDlg.gameObject.active = } } 另一种方法如网页: /questions/21241/cannot-toggle-active-on-gameobjects-that-are-ina ct.html 四、3D 模型相关(康亚辉) 关于 3D 项目中的美术问题与注意事项 1.关于 3D 人物建模应注意的问题 A.由于人模在 3D 转入 Unity 中涉及装备部件的替换, 所以必须统一世界坐标 0, 0, 0{模型面向 Y 轴} B.在人模绑定时必须是 CS 骨骼绑定, 在校验模型时必须检查骨骼方向与模型的朝 向,重点说明必须检查漏点的情况。 C.在检查模型动作时首先看绑定的骨骼是双手都带有武器挂点的骨骼{包括 NPC} , 动作过大时看下穿插关系,是否有 透面的问题。 D.武器的骨骼编号要清晰,完成后世界坐标 0,0,0,朝向与人模一致{剑尖刀 尖等朝向 Y 轴} 。 E.所有东西做完后检查隐藏对象,是否有无关选项,如有一律删除。 F.在骨骼统一后尤其要注意比例问题,在人模与骨骼不协调时不能简单的缩放, 必要时应做微调。 2.关于骨骼、蒙皮、材质注意问题 A.骨骼建议统一用一个人模骨骼{带有双手武器挂点的骨骼} ,如特殊模型骨骼特 殊处理。
B.蒙皮面在 PC 端应小于 2000 面,NPC 小于 1800 面,在移动端人模小于 300 面, NPC 小于 200 面{三角形} 。 C.材质尽量还原物体原始材质,国产玄幻类型游戏关键体现布纹理与褶皱等。 D.在模型导出时检查三者统一性,做到路径还原无问题或者检查文件时不出错! 3.关于宠物和特殊动物的处理问题 A.在处理骨骼模型动作时,建议单独出模型动作与骨骼绑定。 4.处理自然环境和人文环境的问题 A.自然环境在 Unity 中可由客户端程序实现{建议美术绘制原场景氛围图}。 B.人文环境(例如房屋、街道、道路等)未见,待商榷。 C.关于 3D 人文环境建模,建议在移动端使用 2.5D 视角建模,在 PC 端如页游仍使 用 2.5D 视角模型,端游建议
面. D.补充:如做流体、风动力等特效动画应考虑整体资源大小,建议按最低配置处 理(PC 端) 。 E.建筑与人物比例,待商榷。 F.无论人模或者建筑模型请不要随意加摄像机和灯光, 在 Unity 中一部分不识别或 者出错,切记! 五、运行过程中优化 1.顶点性能 一般来说,如果您想在 iPhone 3GS 或更新的设备上每帧渲染不超过 40,000 可见点,那 么对于一些配备 MBX GPU 的旧设备 (比如, 原始的 iPhone, 如 iPhone 3g 和 iPod Touch 第 1 和第 2 代)来说,你应该保证每帧的渲染顶点在 10000 以下。 2.光照性能 像素的动态光照将对每个受影响的像素增加显着的计算开销, 并可能导致物体会被渲染 多次。为了避免这种情况的发生,您应该避免对于任何单个物体都使用多个像素光照, 并尽可能地使用方向光。需要注意的是像素光源是一个渲染模式(Render Mode)设置 为重要(Important)的光源。像素的动态光照将对顶点变换增加显着的开销。所以, 应该尽量避免任何给定的物体被多个光源同时照亮的情况。 对于静态物体, 采用烘焙光 照方法则是更为有效的方法。 3.角色 每个角色尽量使用一个 Skinned Mesh Renderer,这是因为当角色仅有一个 Skinned Mesh Renderer 时, Unity 会 使用可见性裁剪和包围体更新的方法来优化角色的运动, 而这 种优化只有在角色仅含有一个 Skinned Mesh Renderer 时才会启动。角色的面数一般不 要超过 1500(手机一般人物模型控制在 300 左右), 骨骼数量少于 30 就好, 角色 Material 数量一般 1~2 个为最佳。影响 drawcall 数量,应该控制在 35 以内,目前已经超过有待 于优化。 4.静态物体 对于静态物体定点数要求少于 500,UV 的取值范围不要超过(0,1)区间,这对于纹理 的拼合优化很有帮助。不要在静态物体上附加 Animation 组件,会增加 CPU 开销。 5.DrawCall(待研究,目前 demo 为 44) 尽可能地减少 Drawcall 的数量。 IOS 设备上建议不超过 100 。减少的方法主要有如 下几种: Frustum Culling , Occlusion Culling , Texture Packing 。 Frustum Culling 是 Unity 内建的,我们需要做的就是寻求一个合适的远裁剪平面; Occlusion Culling ,遮 挡剔除, Unity 内嵌了 Umbra ,一个非常好 OC 库。但 Occlusion Culling 也并不是 放之四海而皆准的,有时候进行 OC 反而比不进行还要慢,建议在 OC 之前先确定自
己的场景是否适合利用 OC 来优化; Texture Packing ,或者叫 Texture Atlasing ,是将 同种 shader 的纹理进行拼合, 根据 Unity 的 static batching 的特性来减少 draw call 。 建议使用,但也有弊端,那就是一定要将场景中距离相近的实体纹理进行拼合,否则, 拼合后很可能会增加每帧渲染所需的纹理大小, 加大内存带宽的负担。 这也就是为什么 会出现“ DrawCall 降了,渲染速度也变慢了”的原因。 5.物体尺寸 默认情况下 U3D 系统单位 1 等于 1 米,等于软件 1 单位。如果我们制作是按照实际大 小比例制作,那么导入 U3D 引擎会自动变成原来的 1%的大小。因为默认情况下,U3D 的 FBXImporter 中的 Scale Factor 的数值为 0.01。那个我们可以将 Scale Factor 的数值恢 复为 1 ,但是这样会占用模型资源,比较消耗物理缓存。我们也可以将这个物体从 Hierarchy 中选择,并使用 Scale 放大 100 倍,这种设置可以有很多好处,并且还能通过 用脚本制作动画。 但是 Update 是在每次渲染新的一帧的时候才会调用,也就是说,这个函数的更新频 率和设备的性能有关以及被渲染的物体(可以认为是三角形的数量)。在性能好的机器上可 能 fps 30,差的可能小些。这会导致同一个游戏在不同的机器上效果不一致,有的快有的 慢。因为 Update 的执行间隔不一样了。 而 FixedUpdate,是在固定的时间间隔执行,不受游戏帧率的影响。有点想 Tick。所 以处理 Rigidbody 的时候最好用 FixedUpdate。 Exception Logs 1. 错误:CompareBaseObjectsInternal can only be called from the main thread == annoying 错误原因:It seems that comparing two objects using ==, an atomic operation, causes Unity to moan if you do it outside the main thread. This is a completely thread safe operation, but someone thought it was a good idea to mark it otherwise. Is there some way to bypass this? Perhaps UnityEngine.Object has an overload for == and reinterpreting it as System.Object would use a plain ol' comparison with no spooky thread checks 解决方法:. if ( ReferenceEquals(null,target) ) is the same as
if ( null == target ) but it's threadsafe. It does only check references, doesn't do any of Unity's overloaded stuff.
感觉不错的话,微信扫一扫关注官方微信公众账号,以后找资料更方便
是互联网分享学习的开放平台,汇集亿份高价值的文档资料,涵盖档下载,程序开发文档,教育文档,医药文档,办公文档,考试文档,营销文档,工程文档,分享文档等行业。为您提供愉悦的分享学习体验。
你可以免费下载该文档
没满足你的要求? 查找更多相关内容}

我要回帖

更多关于 三星note4内存合并 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信