OpenGLDemo.md 2.5 KB
Newer Older
mahuifa's avatar
mahuifa 已提交
1 2 3 4 5 6 7 8
# Qt OpenGL开发Demo

[toc]

---

## 1、说明

9 10
|       类名       | 功能                                     |
| :--------------: | ---------------------------------------- |
mahuifa's avatar
mahuifa 已提交
11 12
| TestOpenGLWindow | 测试比较QOpenGLWidget和QOpenGLWindow性能 |

13
 
mahuifa's avatar
mahuifa 已提交
14 15 16 17


## 2、相关博客

18 19 20 21 22
|                           相关博客                           |
| :----------------------------------------------------------: |
| 👉[CSDN](https://blog.csdn.net/qq_43627907/category_11724775.html)👈 |


mahuifa's avatar
mahuifa 已提交
23 24 25

## 3、实现效果

mahuifa's avatar
mahuifa 已提交
26
### 1.1 TestOpenGLWindow
mahuifa's avatar
mahuifa 已提交
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

> 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%。
50
  * 并且因为QOpenGLWidget使用子线程刷新速度过快,可能出现残缺的情况。
mahuifa's avatar
mahuifa 已提交
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

  ![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
  ```