记一次 gltf 模型的绘制性能提升:从ppt到dove,丝滑感受
转换思路
同样一个模型,分别取如下转换思路:
- 原始模型fbxgltf
- 原始模型objgltf
但是我在打开中间格式fbx和obj时,发现这两者虽然顶点数量一致,三角形数量一致,但是使用 Windows 3D 查看器查看时,发现前者的绘图调用次数高达1600多次,而后者的绘图调用次数只有217次,效果是完全相同的。
遂打开gltf文件进行分析,对比gltf数据对象如下:
对比gltf对象 | fbx | obj |
---|---|---|
node数量 | 1600多+2500多 | 1 |
mesh数量 | 1600多 | 1 |
primitive总量(每个mesh的primitive数量和) | 1600多 | 217 |
特点 | 1个mesh存1个primitive,有2500多个node用于记录层级关系 | 用1个node包裹1个mesh,mesh下有217个primitive |
所以,故推断影响 gltf、3dtiles(b3dm格式)渲染性能的一个重要指标,就是 primitive 的数量,primitive 是 GL 库绘制图形的最小单元。
在上表中看到有2500多虚node其实是不直接引用 mesh 的,所以即使 node 的总数有 3700 多个,但是实际上只复现了 1600 多次 mesh,且由于 1个 mesh 只有 1个 primitive,所以绘制次数等于1600多次很正常。
要性能还是要逻辑?
这是一个很难取舍的话题,如果需要在 gltf 层面组织好属性数据、数据逻辑分层,那么要尽可能控制好 node 的树状结构,控制好负责引用mesh的node的数量,控制好 primitive 的总数,尽量把材质一样的 primitive 合并。
而如果要追求极致的性能,就不用太在意 node、mesh的组织,只要遇到材质一样的 primitive,合并就是,遇到相对坐标不一样,上转换矩阵算它。
空间换时间
三维渲染是一个极其昔时的话题,因为现在似乎磁盘容量是足够的——什么你跟我说文件大了下载慢?你搞辣么大的模型干啥?有大模型不会分拆吗吗吗吗
所以,很多时候要用空间换时间。
gltf 允许 1个mesh 由多个node 引用,那么这个 mesh 的绘制次数就会累加,虽然复用了mesh下辖的 primitive所指向的数据,不用存储多份mesh可以达到“只存一份数据重复绘制多次”的效果,但是这对性能毫无卵用,因为总的 primitive 数量还是上去了。
这个时候可以把需要重复的顶点根据 node 的坐标转换信息计算出来,重复塞到尽量少的primitive中去。
有人说你这样顶点数量上去了,文件体积也上去了:朋友,普通的750ti亮机卡绘制100w个点没什么压力的~,文件体积这个,就需要数据转换者自己权衡到底是重复mesh的引用,还是把重复的图形多存一份(位置不一样)塞到 primitive 中了。
记一次 gltf 模型的绘制性能提升:从ppt到dove,丝滑感受的更多相关文章
- cesium加载gltf模型
cesium加载gltf模型 一.采用vue-cesium:在项目里加载依赖包.命令如下: npm i --save vue-cesium 在main.js中加入如下代码: https://www.n ...
- .NET平台下几种SOCKET模型的简要性能供参考
转载自:http://www.cnblogs.com/asilas/archive/2006/01/05/311309.html .NET平台下几种SOCKET模型的简要性能供参考 这个内容在cnbl ...
- Android绘制优化(一)绘制性能分析
前言 一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求.运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CP ...
- Cesium专栏-terrain地形、3dtiles模型、gltf模型 高度采样
在Cesium中,对于terrain地形.3dtiles模型.gltf模型的高度采样是一个很基本的功能,基于此,可以做一些深度应用,而Cesium已经帮我们提供了相应的API,在这里,我帮大家总结一下 ...
- GLTF模型查看器---优化器【转】
https://blog.csdn.net/weixin_43081805/article/details/88743277 Clay Viewer(我只想说好用,直接可以导出gltf的二进制glb格 ...
- vue中加载three.js的gltf模型
vue中加载three.js的gltf模型 一.开始引入three.js相关插件.首先利用淘宝镜像,操作命令为: cnpm install three //npm install three也行 二. ...
- cesium加载gltf模型点击以及列表点击定位弹窗
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 之 ...
- 如何在3D场景中在模型上面绘制摄取点
有些时候,我们在屏幕上面绘制一个摄取点,在单屏玩游戏的模式下,我们并不能觉得有什么不妥.但是最近VR的热火朝天,我们带上眼镜看双屏的时候,总觉得这个摄取点看着很不舒服. 这个问题该怎么解决?在这里我首 ...
- YbSoftwareFactory 代码生成插件【二十一】:Web Api及MVC性能提升的几个小技巧
最近在进行 YbSoftwareFactory 的流程功能升级,目前已经基本完成,现将用到的一些关于 Web Api 及 MVC 性能提升的一些小技巧进行了总结,这些技巧在使用.配置上也相当的简单,但 ...
随机推荐
- Linux系统查看硬件信息神器,比设备管理器好用100倍!
大家都知道,当我们的 Linux 系统计算机出现问题时,需要对其排除故障,首先需要做的是找出计算机的硬件信息.下面介绍一个简单易用的应用程序--HardInfo,你可以利用它来显示你电脑的每个硬件方面 ...
- HTML自动刷新页面
<meta http-equiv="refresh"content="5"/> 英文""
- Java线程池ThreadPoolExecutor面试总结思维导图速记
优点 降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度,当任务到达时,可以不需要等待线程创建就能立即执行. 提高线程的可管理性 类关系 接 Executor 一个无返 ...
- CF613D Kingdom and its Cities 虚树 树形dp 贪心
LINK:Kingdom and its Cities 发现是一个树上关键点问题 所以考虑虚树刚好也有标志\(\sum k\leq 100000\)即关键点总数的限制. 首先当k==1时 答案显然为0 ...
- CF R 639 div2 F Review 贪心 二分
LINK:Résumé Review 这道题让我眼前一亮没想到二分这么绝. 由于每个\(b_i\)都是局部的 全局只有一个限制\(\sum_{i=1}^nb_i=k\) 所以dp没有什么用 我们只需要 ...
- 2017面向对象程序设计(Java)第十三周助教工作总结
时间飞逝,本学期即将接近尾声.不知不觉同学们已经学习java十三个星期了,想必同学们对Java课程体系及内容有了更加深入的理解,也应该摸索出了一套适用于自己的学习方法. 下面我对上周工作做以简单总结: ...
- cocos2d-x_下载游戏引擎并创建第一个项目
我是一名小白. 下载并创建游戏项目 第一步:去官网下载cocos2d-x http://www.cocos.com/download 第二步:将安装包里边的 setup.py 拖进命令行点击回车键 , ...
- wps 2011 破解版软件
今天换了一台新电脑. wps 都没有 系统的太过忍受不了 整了一天终于是找到了一个合适安装的 想要的邮件发给我 673658917@qq.com
- C语言输出颜色
命令后界面输出颜色 嵌入式终端界面输出日志时,为了区分输出的有用信息.错误信息,可以给不同级别的输出加上不同的颜色,以方便查看. 下面是颜色的定义: //颜色宏定义 #define NONE &quo ...
- Qt 中十六进制字节流转换为Base64编码
在Qt中,在网络通信时,有时需要将16进制字节流转换为Base64编码传输,在Qt的QByteArray类中,提供了与Base64转换的接口: //16进制字节流转为Base64 QByteArray ...