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的优化策略

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

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

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

相关文章

四川赤橙宏海商务信息咨询有限公司引领抖音电商浪潮

在数字时代的浪潮下,电商行业飞速发展,抖音电商作为新兴的电商模式,凭借其独特的社交属性和短视频形式,迅速吸引了众多消费者和商家的目光。四川赤橙宏海商务信息咨询有限公司,作为抖音电商服务的佼佼者,凭…

通过端口和进程pid查找启动文件/脚本

今天审计一个程序又让GPT给我上了一课,记一下笔记: 1、首先该程序开启了8080端口,使用如下命令得到pid为1817 netstat -tunlp|grep 80802、使用pid得到父进程 pstree -ps 1817输出结果如下: 3、看出程序是由systemd启动的&…

通用代码生成器模板体系,语句和语句组

通用代码生成器或者叫动词算子式通用目的代码生成器是一组使用Java编写的通用代码生成器。它们的原理基于动词算子和域对象的笛卡尔积。它们没有使用FreeMarker和或者Velocity等现成的文件式模板引擎。而是使用java语言开发了一套专门为动词算子式代码生成器使用的模板API。而其…

工业互联网之智能工厂的特征。

哈喽,你好啊!我是雷工! 随着科技的发展,在数字信息的浪潮下现代工业体系和互联网体系深度融合产生了工业互联网。 工业互联网通过连接企业、设备、原材料、人、信息系统构建了基础网络,从而促进工业技术的数字化、网…

4-google::protobuf命名空间下常用的C++ API----text_format.h

#include <google/protobuf/text_format.h> namespace google::protobuf 用于以人类可读的基于文本的格式打印和解析协议消息的工具类。 TextFormat类 这个类实现协议缓冲文本格式。 以文本格式打印和解析协议消息对于调试和人工编辑消息非常有用。 这个类实际上是一个只…

14-29 剑和诗人3 – 利用知识图谱增强 LLM 推理能力

知识图谱提供了一种结构化的方式来表示现实世界的事实及其关系。通过将知识图谱整合到大型语言模型中&#xff0c;我们可以增强它们的事实知识和推理能力。让我们探索如何实现这一点。 知识图谱构建 在利用知识图谱进行语言模型增强之前&#xff0c;我们需要从可靠的来源构建…

Zerotier+Parsec五分钟实现外网远程访问校园或公司内网

0 需求 校园网或公司内网是不能直接通过远程控制桌面软件访问的&#xff0c;想要实现&#xff0c;就必须通过三方的服务来实现穿透内网。但是这样的缺点就是存在延迟。 1 安装软件 &#xff08;1&#xff09;Zerotier 是内网穿透软件&#xff0c;在两台设备上都要安装&#…

从0开始搭建Spring-Cloud微服务项目

文章目录 1. 安装Java开发环境配置环境变量 2. MySQL安装与配置环境变量配置配置MySQLNavicat配置Idea配置 1. 安装Java开发环境 安装Java开发环境主要涉及下载Java开发工具包&#xff08;JDK&#xff09;并配置环境变量&#xff0c;以便在系统中正确运行Java程序。 下载JDK …

Python函数缺省参数的 “ 坑 ” (与C++对比学习)

我们都知道Python函数的缺省参数可以降低我们调用函数的成本&#xff0c;但是一般我们的缺省参数都是不可变对象&#xff0c;如果是可变对象&#xff0c;我们对其多次调用会发生什么呢&#xff1f; def func(arr[]):arr.append(Hello)print(arr)func() func() func() 这貌似…

定个小目标之刷LeetCode热题(40)

94. 二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 直接上代码吧&#xff0c;中序遍历左根右 class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res new ArrayList<Integer>(…

运维锅总详解计算机缓存溢出

本文尝试从缓存溢出、如何平衡防止缓存溢出和OOM、conntrack缓存满载影响及优化措施、TCP/IP协议栈缓存满载影响及优化措施等方面对计算机缓存溢出进行详细分析&#xff0c;最后给出一些缓存满载的Prometheus告警规则。希望对您有所帮助&#xff01; 一、计算机缓存溢出简介 …

推荐定时发圈、跟圈工具

登录账号后&#xff0c;编辑好文案和图片&#xff0c;选择需要发圈的微信账号&#xff08;支持多个号哦&#xff09;和需要发圈的时间&#xff0c;点击发送即可&#xff0c;等时间一到&#xff0c;系统就会自动发送朋友圈&#xff0c;再也不用错过时间&#xff0c;可以准时准点…

JLMPack:您的文件管理新选择

在数字化时代&#xff0c;文件管理已成为我们日常生活和工作中不可或缺的一部分。无论是个人资料的整理&#xff0c;还是企业文档的管理&#xff0c;都需要一款高效、安全、易用的文件管理工具。今天&#xff0c;就让我们一起了解一款国有自主可控的文件管理工具——JLMPack。一…

Java NIO2详解:异步文件和网络编程

一、NIO2 简介 从 NIO 到 NIO.2:发展历程及优势 Java 的 I/O 模型经历了从阻塞式 I/O 到非阻塞式 I/O 的发展过程。 传统阻塞式 I/O (BIO): 早期版本中的 I/O 操作是阻塞式的,这意味着当线程执行 I/O 操作时,会一直阻塞直到操作完成。这种方式资源利用率低,难以处理高并…

PDI-kettle工具连接本地虚拟机Ubuntu上的数据库

PDI 配置ubuntu数据库配置Kettle工具 PDI版本&#xff1a;9.4 Ubuntu2204&#xff1a;10.11.8-MariaDB-0ubuntu0.24.04.1 Ubuntu 24.04 配置ubuntu数据库 安装 apt install -y mariadb-server配置监听地址 cat > /etc/mysql/mariadb.conf.d/99-kettle.cnf << EOF …

TCP/IP模型原理(理论)

TCP/IP模型 1. 网络模型简介2. 应用层2.1 URL2.1.1 urlencode和urldecode 2.2 HTTP协议2.2.1 HTTP协议格式2.2.2 HTTP问题2.2.3 HTTPS 3 传输层3.1 端口号3.2 udp3.2.1 udp协议帧格式3.2.2 udp特点3.2.3 udp缓冲区3.2.4 注意 3.3 tcp协议3.3.1 tcp协议段格式3.3.2 确认应答机制…

不可忽视 软文营销成功的三大核心要素

在品牌宣传过程中&#xff0c;软文营销作为一种高效且相对低成本的推广方式&#xff0c;备受企业青睐。然而&#xff0c;并非所有软文都能达到预期的营销效果。今日投媒网就来与您分享影响软文营销效果的三大核心因素。 一&#xff0e;内容质量&#xff1a;灵魂之所在 首先&am…

NLTK下载及其报错问题,包解决

目录 问题分析 下载 报错 报错原因 正确ip获取 写入host文件 再次下载 测试是否成功 问题分析 NLTK一般是在作自然语言处理时用到&#xff0c;最开始时&#xff0c;我是直接在conda进行conda install nltk进行安装&#xff0c;以为就可以直接使用&#xff0c;但是运行…

黄小米-从田间到餐桌的美味之旅

甘肃黄小米颗粒饱满&#xff0c;色泽金黄&#xff0c;富含多种营养成分&#xff0c;如蛋白质、膳食纤维、维生素和矿物质等。其口感香糯&#xff0c;煮粥时香气扑鼻&#xff0c;米油丰富&#xff0c;味道醇厚。由于甘肃地区独特的地理和气候条件&#xff0c;包括充足的日照、较…

速刷edurank(1)

python安全开发 python安全开发 python安全开发前言一、平台edu二、使用步骤1.引入库2.功能**完整代码**完整代码 总结 前言 目的&#xff1a;想快速的搜集edu的域名 一、平台edu https://src.sjtu.edu.cn/rank/firm/0/?page2 二、使用步骤 1.引入库 代码如下&#xff08…