OCC显示渲染性能分析及优化方案

1.背景介绍

君方智能设计平台(ShipMaker),使用OCC中的图形构造功能和图形渲染功能。OCC的图形渲染采用Opengl API 并且将所有图形渲染相关的逻辑放置在TKOpenGL模块中。

性能场景1:

大场景中包含2万个构件,超过300万三角面片时,对模型做视图的缩放、旋转和旋转等操作,存在卡顿现象,帧率小于10。

性能场景2:

在小场景中,动态绘制墙等线性构件时,非常流畅。当场景中包含2万个构件,超过300万三角面片时,动态创建线性构件墙,鼠标在移动过程中会动态绘制墙构件,存在卡顿现象。

对于场景1和场景2,在笔者的配置机器上,大场景中超过5万构件,2000~3000万面片,应该不存在卡顿现象。经过调试追踪,OCC中显示渲染逻辑存在性能卡点,通过优化渲染逻辑应该可以大大提升渲染性能。

2.TKOpenGL模块分析

1.场景数据

渲染相关的场景数据包括:渲染物体集合(OpenGl_LayerList),光照数据(Graphic3d_LightSet),帧缓存(OpenGl_FrameBuffer), ....

我们只关注渲染物体集合(OpenGl_LayerList)中的数据,即XC-Lab显示场景中绘制的墙板楼幕墙......。这些数据在TKOpenGL中的组织方式如下图:

2.对应关系

3.TKOpenGL中渲染队列

所有需要显示的数据,在被渲染时都需要被依次处理组成一个渲染队列后,再提交到GPU渲染,最后才能获得完整的渲染图像。

OCC中渲染队列,安层级展示:

2.半透明物体渲染队列生成的影响

OCC中生成渲染队列有两种情形,依据场景中有没有半透明物体:

A.没有半透明物体:程序只需要遍历一次场景中结构体数据就可以生成渲染队列。

B.有半透明物体:程序需要遍历两次场景中的结构体数据,第一次先绘制不透明物体结构体,第二次绘制透明物体结构体。

即:场景中如果有半透明物体TKOpenGL会对场景中的物体遍历两次。

3.选中物体高亮对渲染队列的影响

在OCC目前的逻辑中,为保证半透明物体高亮的显示效果,修改了高亮物体的优先级(详细可见函数OpenGl_LayerList::ChangePriority),也就是修改结构体渲染队列中的渲染顺序。将高亮的物体在最后渲染。但是这种修改是永久的。即,用户选中一个构件,高亮后该构件的结构体在渲染队列中的顺序将会永久改变,不能恢复。

渲染顺序的改变对不透明物体渲染没有影响,但是对半透明物体渲染效果有很大的影响。

半透明物体绘制顺序影响见下图:

4.渲染开销分析

在程序中显卡设备的访问操作不能同时进行,即生成渲染列表的操作必须是单线程的。忽略将顶点数据,索引数据,纹理数据等传送到显卡中的操作。每帧图像数据的渲染开销包括CPU端开销和GPU端开销。

CPU端开销:生成渲染列表操作。需要处理的结构体越多,结构体越复杂开销越大。

GPU端开销:根据渲染列表渲染出图象。渲染列表中绘制命令(glDrawElementsglDrawArrays...)调用的越多,绘制图元数量越大开销越大。

OCC渲染模块中开销较大的逻辑:

  1. 场景中渲染对象放到同一个列表中。每次操作都需要对整个队列遍历操作。
  2. 场景中数据按照结构体(OpenGl_Structure)组织。渲染时以结构体为单位,如结构体中需要绘制点线段和三角面片,需要完成一个结构体中点线段和三角面片的绘制才能开始下一个结构体的绘制。不能按照图元类别进行批量绘制。
  3. 视锥体剖切等有开销操作在CPU端操作,即在生成渲染列表时操作。

3.优化方案

重构TKOpenGL模块,重新实现Graphic3d_GraphicDriverGraphic3d_CView...等接口。在重构模块中使用高效的数据结构和渲染策略。

  • 使用优化的数据结构

(1)根据渲染需求细化渲染物体类别。按照不同图元(点,线段,三角面片),不同材质(不透明,半透明,不同显示颜色),不同渲染效果(需正常渲染的物体,不能被遮挡等特性)分类组织对象。按照类别顺序批量绘制图元。

(2)同类别对象,将较小对象组成大小适量的数据块。以数据块为单位启动绘制。

  • 使用优化的渲染策略

(1)使用条件渲染方式将视锥体剖切放到GPU端。

(2)使用渲染实例方式减少GPU显存的使用(如:针对柱这种构件,所有相同的柱,渲染模块可以只保存一份三角面片数据,渲染时只根据变换矩阵显示不同的实例)。

对于场景2的优化策略

分批渲染和屏幕缓存同时开启时,临时节点会在最后一个批次呈现在屏幕上,这样就能够大大提高渲染性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

景区智慧公厕解决方案,公厕革命新方式

在智慧旅游的浪潮下,景区智慧公厕解决方案正悄然引领着一场公厕革命,不仅革新了传统公厕的管理模式,更以智能化、人性化的服务理念,为游客提供了前所未有的舒适体验。作为智慧城市建设的重要一环,智慧公厕解决方案正逐…

跟《经济学人》学英文:2024年07月06日这期 Central banks are winning the battle against inflation

Central banks are winning the battle against inflation. But the war is just getting started Politics and protectionism will make life difficult 原文: The trajectory of inflation has not given central bankers much cause for celebration in rece…

时间同步协议详解:从原理到应用的全方位解析

作者介绍 随着信息技术的飞速发展,时间同步技术在通信、导航、电力等多个领域发挥着越来越重要的作用。从日常生活到高精尖的科学实验,精确的时间同步都是确保系统正常运行和任务成功完成的关键因素。本文将对几种主流的时间同步技术进行介绍和对比分析&…

剪画小程序:自媒体工具推荐:视频文案提取!

各位小伙伴,你们好啊! 上周五观看《歌手 2024》第八期时,我再次被何炅老师幽默风趣的主持风格所折服。他的每一句话都仿佛带着魔力,让现场气氛热烈非凡,实在令人羡慕不已! 何炅老师的口才之所以如此出色&a…

代码随想录算法训练营第四十四天|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

188.买卖股票的最佳时机IV 题目链接:188.买卖股票的最佳时机IV 文档讲解:代码随想录 状态:不会 思路: 在股票买卖1使用一维dp的基础上,升级成二维的即可。 定义dp[k1][2],其中 dp[j][0] 表示第j次交易后持…

【Cadence18】如何放置定位孔

在菜单的place->manually会出现Placement对话框, 在Advanced settings中勾选database和library 然后点击Placement list,下拉框中选择Mechanical symbols,勾选你要的定位孔 (如下图的HOLE_1_6R00D2R70-PTH,注意:…

相关技术 检测离型纸

网盘 https://pan.baidu.com/s/1W-k4hl9uhjAG98hqJG11ug?pwdcrpn 离型无纺布.pdf 离型纸剥离机构.pdf 离型纸处理装置及贴胶设备.pdf 离型纸收集机构.pdf 离型纸涂布装置.pdf 防伪印刷离型纸的制造工艺.pdf

gitee代码初次上传步骤

ps. 前提是已经下载安装gitee 一、在本地项目目录下空白处右击,选择“Git Bash Here” 二、初始化 git init 三、添加、提交代码(注意add与点之间的空格) git add . git commit -m 添加注释 四、连接、推送到gitee仓库 git remote add …

E2.【C语言】练习:static部分

#include <stdio.h> int sum(int a) {int c 0;static int b 3;c 1;b 2;return (a b c); } int main() {int i;int a 2;for (i 0; i < 5;i){printf("%d ", sum(a));} } 求执行结果 c是auto类变量(普通的局部变量)&#xff0c;自动产生&#xff0c…

一个项目学习Vue3---Class和Style绑定

看下面一段代码学习此部分内容 <template><button click"stateChang">状态切换</button><div :class"{font-color:classObject.openColor,font-weight:classObject.openWeight}">颜色和粗细变化</div><div :class"…

Java中使用arima预测未来数据

看着已经存在的曲线图数据&#xff0c;想预估下后面曲线图的数据。 import java.util.Vector;public class AR {double[] stdoriginalData{};int p;ARMAMath armamathnew ARMAMath();/*** AR模型* param stdoriginalData* param p //p为MA模型阶数*/public AR(double [] stdori…

通证经济重塑经济格局

在数字化转型的全球浪潮中&#xff0c;通证经济模式犹如一股新兴力量&#xff0c;以其独特的价值传递与共享机制&#xff0c;重塑着经济格局&#xff0c;引领我们步入数字经济的新纪元。 通证&#xff0c;作为这一模式的核心&#xff0c;不仅是权利与权益的数字化凭证&#xf…

Netty学习(NIO基础)

NIO基础 三大组件 Channel and Buffer 常用的只有ByteBuffer Selector&#xff08;选择器&#xff09; 结合服务器的设计演化来理解Selector 多线程版设计 最早在nio设计出现前服务端程序的设计是多线程版设计,即一个客户端对应一个socket连接,一个连接用一个线程处理,每…

静力水准仪:测量与安装的全面指南

静力水准仪作为一种高精度的测量仪器&#xff0c;广泛应用于管廊、大坝、核电站、高层建筑、基坑、隧道、桥梁、地铁等工程领域&#xff0c;用于监测垂直位移和倾斜变化。本文将详细介绍静力水准仪的工作原理、特点及其安装过程中的注意事项&#xff0c;旨在为相关工程人员提供…

字符串函数5-9题(30 天 Pandas 挑战)

字符串函数 1. 相关知识点1.5 字符串的长度条件判断1.6 apply映射操作1.7 python大小写转换1.8 正则表达式匹配2.9 包含字符串查询 2. 题目2.5 无效的推文2.6 计算特殊奖金2.7 修复表中的名字2.8 查找拥有有效邮箱的用户2.9 患某种疾病的患者 1. 相关知识点 1.5 字符串的长度条…

3dmax全景图用什么渲染软件好?渲染100邀请码1a12

全景图是常见的效果图类型&#xff0c;常用于展示大型空间&#xff0c;如展厅、会议室等。全景图的制作需要渲染&#xff0c;下面我介绍几个常用的渲染软件分享给大家。 1、V-Ray&#xff1a;十分流行的渲染引擎&#xff0c;功能强大&#xff0c;它提供了高质量的光线追踪技术…

【CUDA】 矩阵乘法 matMatMul

矩阵乘法 matMatMul 矩阵乘法是基本线性代数子程序&#xff08;BLAS&#xff09;的重要组成部分&#xff0c;而且线性代数中许多其他操作以此为基础。 图1是两个矩阵的乘法。 基础方法&#xff0c;正方形tile和长方形tile 基础方法 执行矩阵乘法的基础方法是使用单个线程执…

如何学习和提升SQL

资料来源于腾讯技术直播&#xff0c;只作为学习记录&#xff0c;如有侵权&#xff0c;请联系作者进行删除

JUC并发编程基础(包含线程概念,状态等具体实现)

一.JUC并发编程基础 1. 并行与并发 1.1 并发: 是在同一实体上的多个事件是在一台处理器上"同时处理多个任务"同一时刻,其实是只有一个事件在发生. 即多个线程抢占同一个资源. 1.2 并行 是在不同实体上的多个事件是在多台处理器上同时处理多个任务同一时刻,大家…

【码银送书第二十二期】《Python数据分析从入门到精通(第2版)》

&#x1f490;大家好&#xff01;我是码银~&#xff0c;欢迎关注&#x1f490;&#xff1a; CSDN&#xff1a;码银 公众号&#xff1a;码银学编程 前言 &#x1f340;丛书说明&#xff1a;“软件开发视频大讲堂‘’丛书第1版于2008年8月出版&#xff0c;因其编写细腻、易学实用…