当前位置:网站首页>引擎开发日志:OpenGL资源多线程加载
引擎开发日志:OpenGL资源多线程加载
2022-08-02 03:29:00 【ChivenZhang】
今天打算开始在CSDN上,记录自己在开发小型软件的过程中,对于设计的一些思考。既算作一种分享,也是文字总结。
我打算编写一个渲染系统,当然开发已经进行了半年,成果多少是有。加载场景,灯光阴影等功能都具备。GUI,脚本等开发也十分顺利的进入尾声。但是就在最近,热切想实现的一个功能却成了阻碍,摆在我面前,如何实现资源异步加载。
目前项目使用OpenGL作为底层渲染接口,由于OpenGL的上下文是线程环境相关的,无法做到在渲染线程之外的线程中执行GPU资源加载。如果把资源加载的工作都放在渲染线程中,必然会出现渲染卡顿的缺点。
为解决上述问题,特做如下修改:
1、根据资源用于CPU或GPU,进行分类;
2、引入多线程的异步资源加载机制;
通过上述方案,系统除了拥有渲染主线程,还拥有异步加载CPU资源的其他线程。如此,多线程异步一定程度解决加载资源导致的卡顿问题,但是仍然无法避免加载GPU资源导致的卡顿。因为OpenGL限定了渲染和GPU资源加载必须在相同线程,所以GPU方面造成的卡顿无法避免,除非使用更加高级的底层渲染API,如Vulkan。
该方案的一个缺点是,异步加载的方式提高了编程的复杂性,例如,有时必须等多个CPU资源异步加载完成时,才会执行GPU资源的加载。那么就需要一个类似屏障的东西,来保证多个异步加载过程结束后,才发起GPU资源加载过程。于是,资源加载机制又发生了一次变动,即支持多线程环境下的多CPU资源加载与同步机制。相比之前的一个个CPU资源多线程加载,再异步呈递,现在的机制变成了多线程加载多个CPU资源,等待所有资源加载完成,才一同异步呈递给调用者。
边栏推荐
猜你喜欢

【Arduino 连接 SD 卡模块实现数据读写】

MPU6050 加速度计和陀螺仪传感器与 Arduino 连接

连接本地MySql时出现2003-Can‘t connect to MySql server on ‘localhost‘(10061)

单火线开关设计详解

Temporal action localization in untrimmed videos via Multi-stage CNNs SCNN论文阅读笔记

树莓派入门(1)系统镜像烧录

【霍尔效应传感器模块与 Arduino】

TimeSformer视频理解框架:视频理解中的Transformer

兼容C51与STM32的Keil5安装方法
![[Spark]-协同过滤](/img/18/8129e96758160b7e5cc9814d50d882.jpg)
[Spark]-协同过滤
随机推荐
uniCloud使用
研发过程中的文档管理与工具
[Popular Science Post] I2C Communication Protocol Detailed Explanation - Partial Software Analysis and Logic Analyzer Example Analysis
78XX 79XX多路输出电源
电子密码锁_毕设‘指导’
联阳(ITE)IT66021FN:HDMI转RGB芯片 3D 资料
Comparative analysis of OneNET Studio and IoT Studio
【Arduino 连接GP2Y1014AU0F 灰尘传感器】
uniCloud address book combat
出差电子流应用实战
GM8775C规格书,MIPI转LVDS,MIPI转双路LVDS分享
USB3.0一致性测试方法
联阳IT6561|IT6561FN方案电路|替代IT6561方案设计DP转HDMI音视频转换器资料
【科普贴】I2C通讯协议详解——偏软件分析和逻辑分析仪实例分析
GM8284DD,GM8285C,GM8913,GM8914,GM8905C,GM8906C,国腾振芯LVDS类芯片
USB2.0一致性测试方法_高速示波器
【科普贴】UART接口通讯协议
同时求最大值与最小值(看似简单却值得思考~)
【Popular Science Post】UART Interface Communication Protocol
NE5532运放加法器