注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

穷到掉渣的超级奶爸阿赵

阿赵的博客

 
 
 

日志

 
 

Away3D骨骼优化的多种尝试及结果  

2013-09-06 18:15:37|  分类: Flash3D技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
之前针对stage3d支持骨骼数量的优化方案,做出过2个可能性的分析:
1、减少vc的推送,把transform拆分成一个四元数和一个三维向量。
2、拆分模型网格,把超出的部分拆分后分别推送。
之后的这段时间,我对这两种方法都做出了尝试。接下来谈一下结论:
第一种方法:
通过向VC推送四元数和三维向量,结合骨骼的bindpose矩阵,是可以算出顶点在动画之后的位置。之前有位朋友评论说在agal里面不能用四元数计算。这个说法不能算错,因为agal的确没有提供直接的四元数计算。但假如对3d图形数学熟悉的朋友,就可以直接把运算的公式在agal里面重现一下,就可以了。
这种做法的优点是cpu计算实在很少,比如在解析动画之后可以直接把动画关键帧保存成四元数和三维向量。然后需要计算动画的时候,直接获取然后推送就行了。但缺点是公式在agal里面运算会比较麻烦,一条点积的公式,在agal里面就需要拆分成好几行。而agal是有限制的,不能超过200行。我尝试的每个点受4根骨骼影响的情况,生成的agal代码已经有192行了。这是比较危险的情况了。假如我们的代码还需要做其他的处理,那么行数可能就不够了。

第二种方法:
我进行的尝试是把各个蒙皮模型的子模型的信息进行提取,获取到该网格实际受到哪些骨骼的影响,然后推送vc的时候,只推受到影响的骨骼。
这样做是从一个侧面的解决这个问题。我们做人物模型的时候就不能整个模型合并完再一起蒙皮,必须单独逐个部分的做,然后每个部分只蒙受到影响的骨骼。
这样做的结果是只要每个部位蒙皮的骨骼不超过一定量,整个人物就可以支持很多很多的骨骼。
不过这样做也是有缺点的。由于是把模型拆分了,所以本来每个人物每一帧只需要获取一次的骨骼信息,就变成要获取多次了。这样就变成加大了cpu的运算量。而且由于模型数量多了,渲染的实际次数也多了。
对于这种情况,我稍微优化了一下提取信息的方法,让他还是同一个角色同一帧只获取一次骨骼信息。

在没优化之前,由于超出骨骼数量会退回cpu运算,一个2000多面的角色带有40多根骨骼,away3d只能同屏运算10个左右就掉帧了。现在同样的面数和骨骼的人物,可以支持同屏80-90个左右而保持在30帧。
对于这个优化结果,我觉得还是不能实际的应用在项目中。或者我还是需要在很多地方找一下优化的可能性。因为在没有优化之前,对于2000多面的角色,但骨骼减少到20多根的情况下,同屏是可以跑100个而保持30帧的。如果是凑合着来做项目的情况下,其实直接让美工减少骨骼数量会是更快的解决方法。不过这样做,游戏的效果就被限制得很厉害了,很多好看的效果和服装就表现不出来了。
  评论这张
 
阅读(1111)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016