记一次 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 性能提升的一些小技巧进行了总结,这些技巧在使用.配置上也相当的简单,但 ...
随机推荐
- Java环境变量设置:Path、CLASSPATH、JAVA_HOME的作用分别是什么?
1.Path 作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找百看是否能找到相应的命令程序. 需要把jdk安装目录下的b ...
- Git常用命令及方法大全
下面是我整理的常用 Git 命令清单.几个专用名词的译名如下. Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 本地 ...
- gc 模块常用函数
""" 1.gc.set_debug(flags) 设置gc的debug日志,一般设置为gc.DEBUG_LEAK 2.gc.collect([generation]) ...
- ARC 062 F - Painting Graphs with AtCoDeer 割点 割边 不动点 burnside引理
LINK:Painting Graphs with AtCoDeer 看英文题面果然有点吃不消 一些细节会被忽略掉. 问每条边都要被染色 且一个环上边的颜色可以旋转. 用c种颜色有多少本质不同的方法. ...
- 6.3 省选模拟赛 Decompose 动态dp 树链剖分 set
LINK:Decompose 看起来很难 实际上也很难 考验选手的dp 树链剖分 矩阵乘法的能力. 容易列出dp方程 暴力dp 期望得分28. 对于链的情况 容易发现dp方程可以转矩阵乘法 然后利用线 ...
- luogu P6224 [BJWC2014]数据 KD-tree 标准板子 重构+二维平面内最近最远距离查询
LINK:数据 这是一个我写过的最标准的板子. 重构什么的写的非常的标准 常数应该也算很小的. 不过虽然过了题 我也不知道代码是否真的无误 反正我已经眼查三遍了... 重构:建议先插入 插入过程中找到 ...
- Qt 之 Graphics View Framework 简介
Graphics View Framework 交互式 2D 图形的 Graphics View 框架概述.自 Qt4.2 中引入了 Graphics View,以取代其前身 QCanvas.Grap ...
- GhostNet:more features from cheap operation
- 图计算实现ID_Mapping、Oneid打通数据孤岛
图计算实现ID_Mapping.Oneid打通数据孤岛 ID_Mapping与Oneid的作用 大神告诉我们Oneid能用来做什么 输入数据源格式样例 实现原理 当日代码生成 引用jar包 启动命令 ...
- 2020-06-16:Redis hgetall时间复杂度?
福哥答案2020-06-16: 时间复杂度是O(N).时间复杂度:O(N) where N is the size of the hash.