Cocos引擎3D优化和BUG问题总结

     对自己这一年多对cocos底层开发做一个总结。

系统优化

    1.批次渲染,cocos3D不支持批次渲染,对应场景类似物体很多(如麻将)的时候,如果采用每个物体绘制一次drallcall会很大,帧率也很低,因此,可以更改cocos源码,提供批次渲染功能,将相似物体的纹理打包成一张图片,批次渲染多个物体。实验发现,对麻将这种多种相似物体的渲染,可大大降低DrallCall(150降到8-20) 和帧率。不过对于一直移动的物体,需要移动的时候每次计算生成批次渲染序列。

  2.shader优化,shader方面,记录一些小细节:1.对低端机渲染的时候,对复杂光照模型(cocos3d 的光照模型很简单,这里指自己写特效渲染)可以采用将关照计算从逐像素绘制改为逐顶点绘制,帧率提高不少,效果并无多少影响,主要手机屏幕太小了,不像PC屏幕。2.尽量不要使用for(),发现在一些低端机时候如果使用了for(int i=0;i<n;i++),就算只循环一次,模型机型也帧率掉的很厉害.3.使用内置计算的时候,尽量都使用浮点数,不要整数和浮点数混用,例如pow(2, 0.2)某些机型会蹦,尤其IOS系统,都写成Pow(2.0,0.2)

   3.遍历优化,游戏中经常出现模型淡入淡出的特效,而对于那些淡出的模型,而后面还要一直用到的情况下,此模型是一直存在于渲染列表的。而对于透明模型,虽然看不见,在visit(),draw()这些遍历函数中一直在计算并将其加入到Meshcommd去渲染。可以改下源码,对于透明度为0的物体,visit时直接返回,不进行后面操作。

   4.特效优化,特效种类很多,BRDF,HDR,边缘光,卡通渲染,玉石特效,砖石特效等,如果用计算各个光照模型,一般手机跑步起来。这个时候就需要IBL了,基于图像绘制来实现各种特效,节省计算,同时需要更改cocos源码,提供更多的贴图支持。后面有时间把这些特效Unity3d版本都写出来,项目特效都是先在unity3d实现,然后转入cocos3d。Unity3d更容易实现特效和讲解。

  5.材质编辑器,因为给cocos增加很多特效算法,而cocos原生材质不足以提供这些和预览特效,需要自己开发一个编辑器,针对各种新增特效材质,调节材质属性,预览特效,并保存合适效果时的纹理缓存(用以特效算法的提供支持)。

  6.开启抗锯齿,开启抗锯齿后可以提供模型边缘的锯齿问题。对于因纹理映射导致的锯齿问题,可以通过让美术制作贴图的时候,在两种颜色过渡的时候模糊一下来解决。

骨骼动画

      骨骼动画存在两个问题:

     问题1.如果程序读取动画文件中包括两个骨骼动画(譬如一个手和一个虚拟体),这个两个骨骼动画在3DMAX上的时间长度不同,就会导致动画在程序中出现不匹配情况,一个动画跑的播放快,一个动画播放慢。原因在于,对于一个动画文件的两个骨骼动画,cocos读取时候对他们进行计算的时候使用的是一个_duration,但是这两个骨骼动画的时间长度并不一样,导致动画播放有快慢。

解决方式:

    1.3DAMX中,每个动画中的每个骨骼动画的时间长度做成一样长,即便动画不需要那么长时间。

   2.更改动画文件读取计算_duration方式。

     问题2,骨骼动作跨度很大时候,慢慢播放时,会发现有些动画出现偏移和自己做的动画并不一样。原因在于Fbx_conv.exe的这个工具的问题,分析Fbx_conv.exe源码发现,获取每个关键帧的变换属性时,使用的时间定位的fbxTime.SetMilliSeconds( (FbxLongLong)time);根据当前时间计算出变换位置,这种方式是不精确的。取个例子,你有一个动画每秒有30帧,那第10帧的时间应该是三分之1秒(0.3333333333333333),是无限余数小数,而FBX时间用Longlong表示,这个点时间用Longlong有微小差距,这样得到变换矩阵就是当前帧和下一帧或者前一帧之间平滑计算的矩阵,不是当前帧的变换矩阵导致结果有误。但这个误差很小,在动画过程一般也看不到,逐帧播放动作跨度大的动画就有问题。

解决方式:

   修改获取帧动画方式获取帧动画矩阵的时候使用帧位置来确定矩阵而不是时间fbxTime.SetTime(pHour, pMinute, pSecond, pFrame, pField, pResidual, FbxTime::EMode::eDefaultMode);

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值