提交 5fba6d7d 编写于 作者: mahuifa's avatar mahuifa

docs:增加OpenGLDemo.md描述文件

    1、绘制时增加打印绘制一圈的时间。
上级 bc4d3f8d
# Qt OpenGL开发Demo
[toc]
---
## 1、说明
| 类名 | 功能 |
| ---------------- | ---------------------------------------- |
| TestOpenGLWindow | 测试比较QOpenGLWidget和QOpenGLWindow性能 |
| | |
## 2、相关博客
*
## 3、实现效果
### 1.1 VideoPlay
> 1. 使用OpenGl 1.0 API绘制三角形(实现简单,已经淘汰的API);
> 2. 使用自定义Shader脚本绘制三角形(实现较为复杂);
> 3. 分别使用QOpenGLWindow和QOpenGLWidget绘制三角形;
> 4. 分别使用定时器、子线程刷新绘制;
> 5. Qt官方说QOpenGLWindow性能比QOpenGLWidget强,具体强不强,强多少要比过才知道,通过比较,QOpenGLWindow性能确实比QOpenGLWidget强。
* **以下的测试方式并不全面,只代表个人观点。**
* **测试1:**使用定时器刷新绘制,由于定时器是在UI线程执行,如果当前还没执行完就会阻塞住,从测试线性可以看出
* 单独使用定时器刷新QOpenGLWidget绘制会很慢;
* 单独使用定时器刷新QOpenGLWindow绘制会很快;
* 如果使用定时器同时刷新QOpenGLWidget和QOpenGLWindow,会发现QOpenGLWindow也会被拖慢。
![TestOpenGLWindow1-tuya](OpenGLDemo.assets/TestOpenGLWindow1-tuya.gif)
* **测试二:** 使用子线程刷新绘制;
* 单独使用子线程刷新QOpenGLWidget可以看出CPU占用率为10.3%,GPU占用率为:30.3%;
* 单独使用子线程刷新QOpenGLWindow可以看出CPU占用率为:7.9%,GPU占用率为:24.4%。
![TestOpenGLWindow2-tuya](OpenGLDemo.assets/TestOpenGLWindow2-tuya.gif)
* **测试三:** 分别使用定时器刷新绘制QOpenGLWindow和QOpenGLWindow,1毫秒刷新一次,一次转动1度,打印转一圈需要的时间;测试 结果如下:QOpenGLWidget绘制一圈的时间几乎是QOpenGLWindow的十几倍,当然可用设置QOpenGLWidget的交换时间来提高绘制速度,但是这样CPU占用率会大大提升。
```cpp
QOpenGLWidget 5561
QOpenGLWidget 5394
QOpenGLWidget 5512
QOpenGLWidget 5579
QOpenGLWindow 481
QOpenGLWindow 448
QOpenGLWindow 459
QOpenGLWindow 618
```
......@@ -6,7 +6,11 @@
# @开发者 mhf
# @邮箱 1603291350@qq.com
# @时间 2022-09-28 17:20:12
# @备注
# @备注 1、使用OpenGl 1.0 API绘制三角形(实现简单,已经淘汰的API;
# 2、使用自定义Shader脚本绘制三角形(实现较为复杂)
# 3、分别使用QOpenGLWindowQOpenGLWidget绘制三角形;
# 4、分别使用定时器、子线程刷新绘制;
# 5、通过比较,QOpenGLWindow性能强于QOpenGLWidget
#---------------------------------------------------------------------------------------
QT += core gui concurrent
......
......@@ -138,4 +138,9 @@ void OpenGLWidget::rotate()
{
m_angle++;
this->update();
if(m_angle % 360 == 0)
{
qDebug() << "QOpenGLWidget:" << m_timer.elapsed();
m_timer.start();
}
}
......@@ -12,6 +12,7 @@
#include <qopenglwidget.h>
//#include <QOpenGLFunctions> // 网上很多示例使用的是这个类,这是Qt5.0添加的,编译时需要在pro文件中链接opengl库LIBS +=-lopengl32 -lglu32
#include <QElapsedTimer>
#include <QOpenGLFunctions_4_5_Compatibility> // 由于使用到的glBegin等函数属于opengl1.0的API,在新版本中已经被删除了,所以这里需要使用Compatibility
#include <qtimer.h>
......@@ -41,7 +42,7 @@ private:
int m_colAttr; // 顶点颜色属性位置
int m_matrixUniform; // 变换矩阵属性位置
#endif
QTimer m_timer; // 刷新定时器
QElapsedTimer m_timer; // 刷新定时器
};
#endif // OPENGLWIDGET_H
......@@ -119,4 +119,9 @@ void OpenGLWindow::rotate()
{
m_angle++;
this->update();
if(m_angle % 360 == 0)
{
qDebug() << "QOpenGLWindow:" << m_timer.elapsed();
m_timer.start();
}
}
......@@ -10,10 +10,10 @@
#ifndef OPENGLWINDOW_H
#define OPENGLWINDOW_H
#include <QTimer>
#include <qopenglwindow.h>
//#include <QOpenGLFunctions> // 网上很多示例使用的是这个类,这是Qt5.0添加的,编译时需要在pro文件中链接opengl库LIBS +=-lopengl32 -lglu32
#include <QOpenGLFunctions_4_5_Compatibility> // 由于使用到的glBegin等函数属于opengl1.0的API,在新版本中已经被删除了,所以这里需要使用Compatibility
#include <qelapsedtimer.h>
class QOpenGLShaderProgram;
......@@ -40,7 +40,7 @@ private:
int m_colAttr; // 顶点颜色属性位置
int m_matrixUniform; // 变换矩阵属性位置
#endif
QTimer m_timer; // 刷新定时器
QElapsedTimer m_timer; // 刷新定时器
};
#endif // OPENGLWINDOW_H
......@@ -25,6 +25,7 @@ Widget::Widget(QWidget *parent)
Widget::~Widget()
{
m_start = false;
delete ui;
}
......
......@@ -19,6 +19,7 @@
| QStyleDemo | [Qt样式美化设置Demo说明及演示](./QStyleDemo/QStyleDemo.md) |
| PaintingDemo | [Qt绘图Demo](./PaintingDemo/PaintingDemo.md) |
| GraphicsviewDemo | [GraphicsView 图形视图框架Demo](./GraphicsviewDemo/GraphicsviewDemo.md) |
| QOpenGL | [Qt OpenGL开发](./OpenGLDemo/OpenGLDemo.md) |
| | |
| | **使用到第三方库** |
| XlsxDemo | [Qt使用QXlsx操作Excel Demo](./XlsxDemo/XlsxDemo.md) |
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册