引擎开发日志:OpenGL资源多线程加载

今天打算开始在CSDN上,记录自己在开发小型软件的过程中,对于设计的一些思考。既算作一种分享,也是文字总结。

我打算编写一个渲染系统,当然开发已经进行了半年,成果多少是有。加载场景,灯光阴影等功能都具备。GUI,脚本等开发也十分顺利的进入尾声。但是就在最近,热切想实现的一个功能却成了阻碍,摆在我面前,如何实现资源异步加载。

目前项目使用OpenGL作为底层渲染接口,由于OpenGL的上下文是线程环境相关的,无法做到在渲染线程之外的线程中执行GPU资源加载。如果把资源加载的工作都放在渲染线程中,必然会出现渲染卡顿的缺点。

为解决上述问题,特做如下修改:

1、根据资源用于CPU或GPU,进行分类;

2、引入多线程的异步资源加载机制;

通过上述方案,系统除了拥有渲染主线程,还拥有异步加载CPU资源的其他线程。如此,多线程异步一定程度解决加载资源导致的卡顿问题,但是仍然无法避免加载GPU资源导致的卡顿。因为OpenGL限定了渲染和GPU资源加载必须在相同线程,所以GPU方面造成的卡顿无法避免,除非使用更加高级的底层渲染API,如Vulkan。

该方案的一个缺点是,异步加载的方式提高了编程的复杂性,例如,有时必须等多个CPU资源异步加载完成时,才会执行GPU资源的加载。那么就需要一个类似屏障的东西,来保证多个异步加载过程结束后,才发起GPU资源加载过程。于是,资源加载机制又发生了一次变动,即支持多线程环境下的多CPU资源加载与同步机制。相比之前的一个个CPU资源多线程加载,再异步呈递,现在的机制变成了多线程加载多个CPU资源,等待所有资源加载完成,才一同异步呈递给调用者。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Qt中使用OpenGL进行多线程渲染可以提高渲染效率和用户体验。下面是一个基本的示例,演示了如何在Qt中使用OpenGL进行多线程渲染: 1. 首先,在Qt中创建一个新的OpenGL窗口类,继承自QOpenGLWidget。 ```cppclass MyGLWidget : public QOpenGLWidget{ public: MyGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {} protected: void initializeGL() override { // 初始化OpenGL环境 } void resizeGL(int w, int h) override { // 处理窗口大小变化事件 } void paintGL() override { // 执行OpenGL渲染操作 } }; ``` 2. 接下来,在主窗口类中创建一个新的线程,并在该线程中进行OpenGL渲染操作。 ```cppclass MainWindow : public QMainWindow{ public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建OpenGL窗口 m_glWidget = new MyGLWidget(this); setCentralWidget(m_glWidget); // 创建渲染线程 m_renderThread = new QThread(this); m_glWidget->moveToThread(m_renderThread); // 连接信号槽,触发渲染操作 connect(m_renderThread, &QThread::started, m_glWidget, &MyGLWidget::update); connect(m_glWidget, &MyGLWidget::frameSwapped, m_renderThread, &QThread::quit); connect(m_glWidget, &MyGLWidget::destroyed, m_renderThread, &QThread::quit); // 启动渲染线程 m_renderThread->start(); } private: MyGLWidget *m_glWidget; QThread *m_renderThread; }; ``` 在上述代码中,我们在主窗口类的构造函数中创建了一个OpenGL窗口,并将其移动到一个新的线程中。然后,我们连接了一些信号槽,以触发渲染操作,并在窗口销毁时停止渲染线程。 这样,我们就可以在Qt中使用OpenGL进行多线程渲染了。当启动应用程序时,渲染线程将开始执行OpenGL渲染操作,而主线程仍然可以响应用户交互事件。请注意,这只是一个简单的示例,你可能需要根据你的具体需求进行更多的代码调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChivenZhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值