Intel显卡驱动导致Qt opengl 渲染YUV时拉伸窗口内存泄漏

最近在使用QOpenGLWidget做YUV视频渲染,发现在拉伸窗口的时候内存暴涨,如果窗口不动则内存不变。

可以得出结论一定是resizeGL出了问题,但是其实这里代码很简单

   glViewport(0, 0, w, h);

还有就是变换矩阵计算,根本没资源建立与释放。

测试发现在另外一台AMD电脑上,就不会出现这个现象,所以可以判断不是代码问题。

联想电脑管家检测驱动

我使用的是联想小新Lenovo XiaoXinAir 14 + ITL 2021,

CPU 11th Gen Intel(R) Core(TM) i5-1155G7 @ 2.50GHz   2.50 GHz 核显

电脑管家说不需要更新,坑货啊

鲁大师检测 

鲁大师说也不需要更新

驱动精灵检测 

驱动精灵说需要更新,但是这个下载速度太感人了。

官网下载驱动 

搜索发现今年Intel已经有更新的驱动,支持windows11了,果断下载安装。

 更新后记

现在做窗口拉伸的时候就不会再内存泄漏了。

其实我不确定是不是本地驱动坏了,这个几率太小,但是更新驱动能解决问题就直接更新好了。 

### 如何在Qt中通过OpenGL实现YUV图像渲染 #### 使用QTOpenGLYUV渲染代码库简介 为了实现Qt应用程序中使用OpenGL渲染YUV图像的功能,可以利用专门为此目的设计的代码库。此代码库不仅简化了开发过程,还提高了效率[^1]。 #### 准备工作环境 确保安装有支持OpenGLQt版本以及必要的编译工具链。对于具体的操作系统而言,可能还需要额外配置图形驱动程序以获得最佳性能表现。 #### 创建QOpenGLWidget子类用于绘制场景 创建继承自`QOpenGLWidget`的新类,在其中重写虚函数如`initializeGL()`, `resizeGL(int w, int h)` 和 `paintGL()` 来初始化资源、设置视口尺寸并执行实际绘图操作: ```cpp class YuvRenderer : public QOpenGLWidget { protected: void initializeGL(); void resizeGL(int w, int h); void paintGL(); private: GLuint textureId; // 存储纹理对象ID }; ``` #### 初始化OpenGL上下文及加载着色器程序 在`initializeGL()`方法内部完成OpenGL状态机的相关设定,并编写顶点/片段着色器来处理传入的数据流转换逻辑;接着编译链接成可执行形式供后续调用: ```cpp void YuvRenderer::initializeGL(){ initializeOpenGLFunctions(); // 启动现代OpenGL API // 加载外部定义好的shader源码文件... glUseProgram(program); // 安装已构建成功的program object作为当前活动项 } ``` #### 设置像素存储模式参数与分配内存空间给纹理单元 针对不同类型的YUV格式(例如I420/YV12/NV12),调整相应的glPixelStorei选项以便正确读取原始字节序列;随后借助于glTexImage2D上传至GPU端缓存区等待进一步采样计算: ```cpp // 假设输入为NV12格式,则需分别对待亮度分量和平铺后的两个色度平面 glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, y_texture_id); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, y_data); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, uv_texture_id); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, width / 2, height / 2, 0, GL_RG, GL_UNSIGNED_BYTE, uv_data); ``` #### 绘制帧缓冲到窗口表面 最后一步是在每次刷新周期内调用`paintGL()`触发整个管线运作流程——从CPU侧准备完毕待呈现的画面直至最终映射显示出来为止: ```cpp void YuvRenderer::paintGL(){ glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebufferObject()); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0); glUniform1i(glGetUniformLocation(program,"tex_y"), 0); glUniform1i(glGetUniformLocation(program,"tex_uv"), 1); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableVertexAttribArray(0); } ``` 上述步骤展示了如何基于Qt框架结合OpenGL技术达成高效稳定的YUV视频解码回放效果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值