unity3d圣典 3D 实例化问题?

您现在的位置: &
Android+Unity3D的Prefabs(预设)与Instantiate(实例化)
Android+Unity3D的Prefabs(预设)与Instantiate(实例化)
解释:Prefabs(预设)是一种资源类型,可被重复使用的
&&&主编推荐
&&&热门试卷
&&&最新视频
&&&热门阅读
&&&最新问答
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&增值电信业务经营许可证湘B2-查看: 389|回复: 11
[原][Unity3D] 关于uLua在Unity3D的性能测试
1分钟注册,结交更多好友,享用更多功能,轻松玩转酷辣虫!
才可以下载或查看,没有帐号?
一:实例化并带清空对象的对比
- lua中实例化5w个空对象并且直接删除
function main.test( )& & & & print('lua start at:'..Time.realtimeSinceStartup)& & & & for i=1,50000 do& & & & local go = GameObject('init')& & & & GameObject.DestroyImmediate(go)& & & & end& & & & print('lua end at:'..Time.realtimeSinceStartup)end复制代码
3iIbIr.png (12.02 KB, 下载次数: 38)
11:56 上传
平均大概都要3.3秒
- mono中实例化5w个空对象并且直接删除
Debug.Log(&mono start at:&+Time.realtimeSinceStartup);& & & & for(int i =0; i & 50000; i++){& & & & GameObject go = new GameObject(&init&);& & & & DestroyImmediate(go);& & & & }& & & & Debug.Log(&mono end at:&+Time.realtimeSinceStartup);复制代码
3iIbIr.png (10.18 KB, 下载次数: 40)
11:56 上传
大概平均下来是0.75秒
&& 二:调用方法的对比
&&- lua中调用方法并做一个简单的处理,5w次
function main.testCall(go) go.transform.localPosition = Vector3(0,0,0)end复制代码
3iIbIr.png (10.73 KB, 下载次数: 38)
11:56 上传
&&耗时:1.64秒
&&- mono中调用方法做一个简单处理,5w次
void TestInstantiate(){& & & & transform.localPosition = new Vector3(0, 0, 0); }复制代码
3iIbIr.png (9.79 KB, 下载次数: 40)
11:56 上传
&&耗时:0.01秒
& &三:总结&&
&&从2组对比来看,第一组lua是mono的4.4倍耗时,第二组lua是mono的164倍耗时.
3.1:可能第一直觉,lua中go.transform会实时去Get Transform的脚本,那么我们优化一下
function main.testCall(go) go.localPosition = Vector3(0,0,0)end复制代码把transform缓存一下,测试时间消耗:1.3秒 3.2:实际上上段优化中还是存在Vector3(0,0,0)是构造一个新对象,那么我们直接用Vector3.zero呢
function main.testCall(go) go.localPosition = Vector3.zeroend复制代码耗时:0.86秒 3.3:最后我们把localPosistion也缓存一下
function main.testCall(pos) pos = Vector3.zeroend复制代码耗时:0.35秒&&把指定的'对象'先取出来,在lua中都能提高很高的执行效率.因为通过& . & 去获取一个value时候,实际上是遍历了table把里面的key给搜索一遍.
&&至于在Unity3D中,我个人还是觉得,如果是涉及到update每帧都要处理的逻辑.还是mono妥妥的.实际上我们可以通过缓存这些变量对象在lua中.可以最大限度地减少性能消耗.
上一主题: 下一主题: 本帖标题:本帖地址:
最近练了葵花宝典吧?
支持楼主,顶
虽不明,但觉厉,你懂的
LZ敢整点更有创意的不?兄弟们等着围观捏~
楼上的很有激情啊!
呵呵,低调,低调!
知识就是力量啊!
好帖必须得顶起
禽兽不如应该是说不回帖的吧?
酷辣虫发布的[原][Unity3D] 关于uLua在Unity3D的性能测试帖子由网友提供或转载于网络,若发布的[原][Unity3D] 关于uLua在Unity3D的性能测试侵犯了您的权益,请联系我们.
禁止发表任何与中华人民共和国法律有抵触的内容! 如有版权问题请告知删除! 【】所有内容来自用户发布,并不代表的观点。无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。
Powered by Discuz!
Comsenz Inc.[Unity3D]动态加载Lightmap各平台的差异问题
先前写过一篇关于动态加载Lightmap方案的文章,本想在先前那篇补充的,不过想了下还是新开个文章,因为这个问题让我烦恼了两三天,我觉得应该是非常值得重视的问题。因为这种问题虽然很少遇到,但是一旦遇到连官方都救不了你,因为连你自己都无法知道到底问题是出在哪里。
先前的文章:《Lightmapping使用及动态加载lightmap方案 》
项目背景:
场景加载方式:
为每个物体生成PREFAB,将所有PREFAB打包成一系列ASSETBUDNLE,读取ASSETBUNDLE中的每一个PREFAB储存在HASHTABLE里面,然后场景由一个个PREFAB实例化而成。
读取场景方式:
读取一个关于场景的JSON文件,这个JSON文件包涵了每一个GAMEOBJECT的顶点位置、旋转、缩放、LIGHTMAP索引、LIGHTMAP的OFFSET信息。然后将HASHTABLE里面的一个个物件根据JSON的相应信息实例化成GAMEOBJECT。
读取LIGHTMAP方式:
1.设UV2,自己生成或者U3D勾选导入设置面板生成的都可以。
2.设静态GAMEOBJECT烘培LIGHTMAP。
3.将LIGHTMAP加载进场景。采用ASSETBUNDLE和RESOURCES.LOAD的方法都行。
4.LIGHTMAP赋值,实例化每一个GAMEOBJECT的RENDERER里面有lightmapIndex,lightmapTilingOffset信息,实例化的时候直接赋值就行。
好了, 一切背景就绪,这个结果会发现WINDOWS一切正常!!
但是ANDROID和IOS却会发现各种LIGHTMAP信息错乱。
然后你上官方论坛谷歌等网站搜索会发现!讨论的都是MAC和PC的不一样的原因,让你各种REIMPORT资源,重新烘培啥的。竟然没有解决方案!!因为太少人这样做了。
当你研究半天的时候,会发现,LIGHTMAP信息错乱并不是没有加载到正确的LIGHTMAP和UV错乱的问题,而是由于没有UV2信息导致的。但是糟糕的是WINDOWS系统下却是有UV2的!!为什么其它平台没有?
然后你会怀疑是不是ASSETBUNDLE里面没有将UV2打包进去。
然后你各种尝试,反复尝试UV,甚至自己在3DMAX里面生成一个正确的UV2,一个个去测试。然后你发现有的是对的,但是同样情况有的又是错的,这天杀的BUG肯定是U3D的BUG,你开始这样想。
傻了吧?!
我也傻了两天。
无意中,我重新生成了一个PREFAB,妈蛋竟然可以了?!!
我无法解释具体原因是什么,但我认为应该是U3D的PREFAB里面记录了模型原本是否具有UV2的信息,而WINDOWS下不需要任何操作便能自动识别是否具有,而在IOS和ANDROID下却要重新APPLY一下PREFAB,告诉引擎这个是有UV2的。这个UV2才能打包进ASSETBUNDLE里面。
我觉得这已经算是U3D的一个BUG了,如果不是无意中试出来了,我觉得我们项目需要改变加载LIGHTMAP的方式了。
改变的方式有两种,一种是所有模型在MAX或MAYA等重新生成一个UV2,再重新生成PREFAB。
另一种是放弃动态加载的方式,直接一个关卡一个场景,由U3D自行处理其中的关系。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 unity3d教程 的文章

 

随机推荐