stage3d 骨骼优化

用过Away3D的朋友估计都会发现,,在Away3D里面使用超过一定骨骼数量的角色,当场景里面角色的数量稍微多一点,整个场景就会很卡。 对于这个现象,我之前得出的结论是。Stage3D的VC缓存器数量的限制,造成了对需要占用VC的骨骼信息有限制。对于超过了限制数量的骨骼部分,Stage3D会把数据退回CPU计算。 这里存在几个误区: 1、退回CPU的处理不是Stage3D做的,而是away3D本身做的。 原生的Stage3D对于超过能允许数量的骨骼,因为超出了128个vc,不会做其他处理,只会直接报错: ArgumentError: Error #3615: AGAL 验证失败: 程序大小小于  程序的最小长度。 2、不是部分的退回,是通过一个开关判断是否需要退回,全部退回。 开关是变量usesCPU。一开始给材质赋值的时候,会判断该模型是否需要退回cpu计算。假如不需要,就全部推到GPU计算,即使没有动画信息的时候,顶点着色器也会使用蒙皮计算的一套。假如需要退回cpu计算,那么就不会再使用蒙皮动画的顶点程序,而直接用最根基的顶点程序计算。 在明白了这两点之后,看看Away3D对这个是否超出长度的功能做了什么处理: 1、通过对AnimationSetBase.cancelGPUCompatibility断点,发现了在SkeletonAnimator.testGPUCompatibility法子里面有检查是否需要退回CPU的判断。其判断的条件是: if (!_useCondensedIndices && (_forceCPU || _jointsPerVertex > 4 || pass.numUsedVertexConstants + _numJoints * 3 > 128)) 可以看出: 除了_useCondensedIndices ==false,还需要 1._forceCPU == true 2.一个顶点受到大于4个骨骼的影响。 因为每个va只能存xyzw四个数,按照Away3D的顶点着色器的处理,就只能最多一个顶点受到4根骨骼的影响。 3.已经使用的Vc,加上骨骼占用的VC,要少于128个。 由于Away对于骨骼 Transform推入GPU的计算是三个基向量,也就是占用3个缓存器,所以需要 骨骼数*3 后两个条件,出现了优化的空间: 首先,一般顶点最多受到3根骨骼影响已经很足够了。超过4根的信息可以考虑判断其影响大小,将超出的而且权重小的部分排除掉。 然后,可以考虑一下怎样减少输入的vc数量,把三个基向量看有没有办法变成2个四维向量分别传入位移和旋转信息。由于Away3D使用的md5动画款式本身就没有导出缩放的,所以在没有自己再写解析器的情况下,没有必要处理缩放的信息。 2、对于没有超出允许范围的情况,Away3D会通过代码解析器组成顶点程序,然后每帧推入骨骼的三个基向量给agal计算。 在SkeletonAnimator.setRenderState法子里面,把计算出的所有骨骼的信息(_globalMatrices)传入GPU,_numJoints是骨骼的数量。vertexConstantOffset是VC偏移量。也就是说,在vertexConstantOffset之前是其他顶点程序需要的VC,从vertexConstantOffset开始往后的所有VC都是骨骼信息使用的。由于每根骨骼有三个基向量,所以是_numJoints*3。 所以最终推入GPU的数据是这样的: stage3DProxy._context3D.setProgramConstantsFromVector(Context3DProgramType.VERTEX, vertexConstantOffset, _globalMatrices, _numJoints*3); 3、对于返回cpu的情况,顶点程序是最简单的m44 op,va0,vc0,不需要推送骨骼信息进入vc, 而是在SkeletonAnimator.setRenderState法子里面判断了if (_animationSet.usesCPU), 然后在SkeletonAnimator.morphGeometry法子里面在CPU模拟了一次GPU里面逐个顶点分别乘以受到影响的骨骼的基向量再乘以权重最后相加的过程,求出了每个顶点在每一帧实际的位置坐标,然后返回。 如果角色多、顶点多的情况下,这个过程在CPU算明显是超级大的负荷,难怪几个人物就卡死了。 这里又出现了优化点了,宁愿对美术资源进行限制,也不要用CPU来渲染。Away3D这个功能明显是鸡肋,只是为了做得全面,适应各种没有限制的模型,没有项目可行性。 Away3D骨骼优化的多种尝试及结果

之前针对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帧的。如果是凑合着来做项目的情况下,其实直接让美工减少骨骼数量会是更快的解决法子。不过这样做,游戏的效果就被限制得很厉害了,很多好看的效果和服装就表现不出来了。

转载于:https://www.cnblogs.com/jiangjieqim/p/5445255.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

morphia_Morphia和MongoDB:不断发展的文档结构

morphia在我先前关于Morphia的帖子中 ,我介绍了一些典型用法,并提到了一些已知问题的警告和解决方法。 我展示了使用Morphia的工作有多么容易,以及它与Java世界的交互方式有多么干净。 为了跟进该帖子的后续内容,我将讨论如何处理…

PC端网页vue项目,页面滚动点击悬浮按钮最快的方法

业务场景,可视化大屏右下角添加一个悬浮按钮,点击按钮页面滚动到顶部。 经过实验,使用锚点是最简单的办法。 方法一:锚点 给顶部的合适位置添加一个 name="top"的锚点,maodianTop用于控制样式,可以不设置。 <a class="maodianTop" name="…

Echats给柱状图及提示文字添加百分号(%)的解决办法

业务需求&#xff1a;给柱状图添加百分号。 目录 柱状图上添加%效果图 悬浮标签添加%效果图&#xff1a; 刚开始从后台取的数据带%&#xff0c;我这边取这个值的时候显示undifined&#xff0c; 后来就让这哥们把这类的数据从数据库把%去掉。这样我这边就取到了数据&#xff0…

前端使用linux命令更新项目生产包与测试包命令

业务需求&#xff1a;把vue开发的项目打成dist.zip文件&#xff0c;丢到服务器去&#xff0c;通过域名进行访问。 首先登录云管平台的账号和密码&#xff0c;找到对应的服务器&#xff0c;然后连接到堡垒机。 在命令行进入到域名下的地址及目录。 切换到测试文件夹 点击左上角…

servle 3.0 新特性之一 对上传表单的支持

1. 上传 * 上传对表单的要求&#xff1a; > method"post" > enctype"multipart/form-data"&#xff0c;它的默认值是&#xff1a;application/x-www-form-urlencoded > <input type"file" name"必须给"/> * 上传Servle…

manifest.mf._MANIFEST.MF和feature.xml版本控制规则

manifest.mf.我永远都忘记了OSIF插件和功能的 MANIFEST.MF和feature.xml中的依赖项声明的规则是什么。 谷歌搜索经常导致沮丧而不是答案。 因此&#xff0c;因为今天我实际上找到了这些规则的简要列表&#xff0c;所以我想在这里重新发布它们&#xff0c;并进行一些较小的修改以…

CSDN学习神器——CSDN浏览器助手测评体验

导读&#xff1a;大家好&#xff0c;我叫孙叫兽&#xff0c;本期内容给大家分享一下CSDN浏览器助手这款插件&#xff0c;看看最新版的插件已经比较完善了&#xff0c;还有一些可以优化的地方。下面简单进行体验一把最新版&#xff01; 体验时间&#xff1a;2021年5月31日。 目录…

CVE-2016-0143 漏洞分析(2016.4)

CVE-2016-0143漏洞分析 0x00 背景 4月20日&#xff0c;Nils Sommer在exploitdb上爆出了一枚新的Windows内核漏洞PoC。该漏洞影响所有版本的Windows操作系统&#xff0c;攻击者利用成功后可获得权限提升&#xff0c;微软在4月补丁日修复了该漏洞。 0x01 漏洞分析 Nils Sommer并没…

HB-X打不开的解决办法

导读&#xff1a;今早点击HB-X这款编译器的时候&#xff0c;点击快捷键和图标按钮一点反应都没有。死活打不开。 点击的时候一点提示都没有&#xff0c;重启电脑打开也是如此。 解决办法&#xff1a; 关机重启&#xff0c;一定要关机再重启。 其它情况请参考这个帖子&#xff…

Spark 101:它是什么,它做什么以及为什么起作用

最近&#xff0c;许多大数据的讨论都使用了新名称。 有人将流行的新来者Apache Spark ™视为Hadoop的更易用&#xff0c;功能更强大的替代品&#xff0c; Hadoop是大数据的首选原始技术。 其他人认为Spark是Hadoop和其他技术的有力补充&#xff0c;它具有自己的优点&#xff0c…

【iCore3 双核心板_ uC/OS-III】例程五:软件定时器

实验指导书及代码包下载&#xff1a; http://pan.baidu.com/s/1eSHenjs iCore3 购买链接&#xff1a; https://item.taobao.com/item.htm?id524229438677 转载于:https://www.cnblogs.com/xiaomagee/p/5453762.html

前端 vue 在可视化大屏领域的工作实践

导读:最近入职了一家互联网公司,主要是做物联网及互联网解决方案方向,我上来就接手了这个项目,是一个可视化管理地图,主要用于某国企物业的安全预警的职能,说来也比较倒霉,刚来这公司,公司做这个项目的前端和后端都跑路了,然后让我一个月给他整改完,说是重构吧,还不…

JavaScript GetAbsoultURl

var img document.createElement(A);img.src "/img/weixin.jpg"; //设置相对路径给Image, 此时会发送出请求url img.src; //此时相对路径已经变成绝对路径img.src null; //取消请求console.log(url);转载于:https://www.cnblogs.com/shidengyun/p/5453901.html…

【Java从入门到天黑|05】JavaSE入门之面向对象(上)

面向过程&面向对象 语言的进化发展跟生物的进化发展其实是一回事,都是”物以类聚”。相近的感光细胞聚到一起变成了我 们的眼睛,相近的嗅觉细胞聚到一起变成了我们的鼻子。 语句多了,我们将完成同样功能的相近的语句,聚到了一块儿,便于我们使用。于是,方法出现了! …

java自建ocr完整示例_Java 7:完整的invokedynamic示例

java自建ocr完整示例我当前的Java 7系列中的另一个博客条目。 这次它处理的是invokedynamic&#xff0c;这是JVM上用于方法调用的新字节码指令。 invokedynamic指令允许呼叫站点与呼叫接收者之间的动态链接。 这意味着您可以将正在执行方法调用的类链接到在运行时正在接收调用的…

【Java从入门到天黑|05】JavaSE入门之面向对象(下)

修饰符 1、static修饰符 1、static变量 在类中,使用static修饰的成员变量,就是静态变量,反之为非静态变量。 静态变量和非静态变量的区别 静态变量属于类的,"可以"使用类名来访问,非静态变量是属于对象的,"必须"使用对象来访问. 1 public class Student{…

机电传动控制大作业 第一阶段

机电传动控制大作业 第一阶段 一&#xff0e;系统硬件接口定义1.电梯内操作界面: 标有1-7数字的按钮&#xff08;每个按钮有一个LED灯&#xff0c;按下按钮灯即亮&#xff09;,开门&#xff0c;关门以及紧急报警的按钮和楼层指示的LED数码管。电梯门的打开和关闭需要两个行程开…

对后台返回的数据进行评分排序、时间排序!

导读:对后台返回的数据进行评分排序,时间排序,可以倒序,可以正序。 按照评分排序 正序 qualityScoreSort(){this.tableData0.sort((a, b) => {return b.qualityScore - a

@Deprecated新外观可能是什么?

JDK增强建议 &#xff08;JEP&#xff09;277&#xff08;“ 增强的弃用 ”&#xff09;建议“重新定义弃用注释&#xff0c;并提供工具来增强功能生命周期的尾端。” 当前 java.lang.Deprecated的一些限制使我困扰了一段时间。 我特别希望能够使用Deprecated提供文本&#xff…

C++反汇编书

1、 《C反汇编与逆向分析技术揭秘》 2、 转载于:https://www.cnblogs.com/cppskill/p/5459867.html