【音视频开发】使用支持硬件加速的D3D11绘图遇到的绘图失败与绘图崩溃问题的记录与总结

devtools/2024/10/21 15:33:08/

目录

1、使用D3D_DRIVER_TYPE_HARDWARE GPU硬件加速模式遇到的崩溃问题

2、使用D3D_DRIVER_TYPE_HARDWARE模式,出现了绘图失败的问题

3、将D3D_DRIVER_TYPE_HARDWARE模式改成D3D_DRIVER_TYPE_WARP模式,但出现了绘图失败的问题

4、解决办法


       对视频进行渲染播放时,使用传统视频渲染方式会占用大量的CPU资源,为了减小对CPU资源的占用,决定使用D3D11去渲染播放,充分利用到系统GPU资源。在使用D3D11时遇到了一些问题,本文做一个简单的记录和总结。

1、使用D3D_DRIVER_TYPE_HARDWARE GPU硬件加速模式遇到的崩溃问题

       为了充分地使用到GPU加速,在调用D3D11CreateDeviceAndSwapChain接口创建D3D11绘图对象时:

HRESULT D3D11CreateDeviceAndSwapChain([in, optional]  IDXGIAdapter               *pAdapter,D3D_DRIVER_TYPE            DriverType,HMODULE                    Software,UINT                       Flags,[in, optional]  const D3D_FEATURE_LEVEL    *pFeatureLevels,UINT                       FeatureLevels,UINT                       SDKVersion,[in, optional]  const DXGI_SWAP_CHAIN_DESC *pSwapChainDesc,[out, optional] IDXGISwapChain             **ppSwapChain,[out, optional] ID3D11Device               **ppDevice,[out, optional] D3D_FEATURE_LEVEL          *pFeatureLevel,[out, optional] ID3D11DeviceContext        **ppImmediateContext
);

其中第二个参数D3D_DRIVER_TYPE DriverType,我们直接传入的是D3D_DRIVER_TYPE_HARDWARE模式,代码如下所示:

       但软件运行在某个同事的Win8.1的电脑上,出现了崩溃问题。加入会议后,收到远端的视频图像,在不断的渲染播放,结果几分钟之后就出现了崩溃。取来dump后,用Windbg打开后查看到如下的函数的调用堆栈:

根据堆栈得知,程序崩溃在igdumdim32.dll库中,查看改文件的属性得知,这是系统显卡驱动相关的库。所以怀疑可能是显卡驱动版本比较老,后来使用360驱动大师将这个问题机器上显卡驱动更新了一下,就没再崩溃了。


       在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:该精品技术专栏的订阅量已达到520多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)

C++软件调试与异常排查从入门到精通系列文章汇总icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2:(本专栏涵盖了C++多方面的内容,是当前重点打造的专栏,订阅量已达160多个,专栏文章已经更新到400多篇,持续更新中...)

C/C++实战进阶(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、数据结构与算法、C++11及以上新特性(不仅看开源代码会用到,日常编码中也会用到部分新特性,面试时也会涉及到)、常用C++开源库的介绍与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。

专栏3:  

C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/131405795

常用的C++软件辅助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!

专栏4:   

VC++常用功能开发汇总(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/124272585

将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。

专栏5: 

C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/category_12695902.html

根据多年C++软件开发实践,详细地总结了C/C++软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。


2、使用D3D_DRIVER_TYPE_HARDWARE模式,出现了绘图失败的问题

       软件在某台机器上运行时出现视频图像绘制失败的问题,视频窗口显示黑屏,视频图像没有绘制出来。通过添加打印日志发现,所有调用到的D3D11库的函数都没有返回失败,好像都执行成功了,但图像就是没有绘制出来,视频窗口中始终看不到视频图像。

       猜测这个问题可能也和机器上的显卡驱动有关,后来使用360驱动大师将这个问题机器上显卡驱动更新了一下,图像就能正常绘制出来了。

3、将D3D_DRIVER_TYPE_HARDWARE模式改成D3D_DRIVER_TYPE_WARP模式,但出现了绘图失败的问题

       上面使用D3D_DRIVER_TYPE_HARDWARE模式,遇到的崩溃以及图像绘制不出来的问题,都与机器上的显卡驱动有关,但没法给所有出问题的用户机器去升级显卡驱动,还是要从代码层面去解决,不能依赖人工去处理。

       后来,尝试将D3D_DRIVER_TYPE_HARDWARE模式改成D3D_DRIVER_TYPE_WARP,上述两个问题都能解决了,但经测试,又发现了新的问题。在用python对编解码库进行单元测试时发现,当软件没有全屏的时候,视频是可以在窗口中正常显示出来的,但将视频窗口全屏后视频就绘制失败了。查看打印日志得知,在调用present接口时返回了错误,即present接口调用失败了。

       后来经分析得知,远端传过来的视频图像的分辨率为1366x768,而出问题电脑的显示屏是1080P(1920x1080),所以视频窗口全屏后窗口大小为1920x1080。之所以会出现present接口调用失败,因为视频图像的尺寸(1366x768)小于要绘制的目标区域(全屏窗口)的大小(1920x1080)。所以在D3D_DRIVER_TYPE_WARP模式下,如果视频源图像尺寸小于绘制到的目标区域大小,则会出现present接口调用失败。

4、解决办法

        为了解决使用D3D11存在的多种问题,将之前老的视频绘制模式D3D9、DirectX、DrawDIB和GDI模式等也添加到新版本的编解码库中。当发现调用D3D11接口失败时,自动切换到其他老的绘图模式。同时也提供了ini配置文件中修改绘图模式,即可以手动修改默认的绘图模式。


http://www.ppmy.cn/devtools/121441.html

相关文章

【IPv6】IPv6地址格式及地址分类(组播、单播、任播)整理

IPv6地址格式 IPv6 地址从 IPv4 地址的 32 bits 扩展到 128 bits,IPv6 地址的表示、书写方式也从 IPv4 的点分十进制,修改16进制的冒号分割 IPv4 点分格式(.) 192.168.11.11 IPv6 冒号分割(:) 2408:8459:3032:0000:0000:0000:0001:a9fd IPv6 的规范…

QT 获取视频帧Opencv获取清晰度

先展示结果&#xff1a; 1.获取摄像头的分辨率 mResSize.clear();mResSize camera_->supportedViewfinderResolutions();ui->comboBox_resulation->clear();int i0;foreach (QSize msize, mResSize) {qDebug()<<msize;ui->comboBox_resulation->addItem(…

HTTP【网络】

文章目录 HTTPURL(Uniform Resource Lacator) HTTP协议格式HTTP的方法HTTP的状态码HTTP常见的Header HTTP 超文本传输协议&#xff0c;是一个简单的请求-响应协议&#xff0c;HTTP通常运行在TCP之上 URL(Uniform Resource Lacator) 一资源定位符&#xff0c;也就是通常所说的…

js将对象的键和值分别归纳进对象,并将多层对象转化成数据的方法

前言&#xff1a; 后端传给我一个没有处理过的json串&#xff0c;但是我要传入el-tree做渲染&#xff0c;此篇来记录一下整个数据处理过程以及el-tree的使用 需求描述&#xff1a; 一、树结构可以展开可以收缩&#xff0c;默认全部展开 二、有一些关键词需要高亮展示红色 …

分享几个做题网站------学习网------工具网;

以下是就是做题网站&#xff1b;趣IT官网-互联网求职刷题神器趣IT——互联网在线刷题学习平台&#xff0c;汇集互联网大厂面试真题&#xff0c;拥有java、C、Python、前端、产品经理、软件测试、新媒体运营等多个热门IT岗位面试笔试题库&#xff0c;提供能力测评、面试刷题、笔…

Windows环境 源码编译 FFmpeg

记录一下windows环境纯代码编译ffmeg的过程&#xff01; 目录 一、安装MSYS2 1.下载安装 2.配置 3.修改源 4.测试与更新 二、安装其他必要工具 1.安装MinGW-w64 2.安装git 3..安装make等工具 4.编译前的其他准备工作 ①.重命名link.exe ②.下载和安装YASM ③.安装…

Java数据结构链表(LinkedList详解)

前言&#xff1a; Java数据结构链表部分和顺序表有所相似&#xff1a; 首先都扩展了接口List&#xff0c;List里面的方法都会在LinkedList中重写。 其次都可以实现数据的增删查改等基础功能。 当然ArrayList相较于LinkedList有一定的缺陷&#xff0c;比如果在中间位置插入数据&…

常用性能优化方法

在一个Java项目中进行性能优化是至关重要的。性能优化能够提高项目的效率和响应速度&#xff0c;提升用户体验&#xff0c;并且可以节省服务器资源和成本。 首先&#xff0c;性能优化可以确保项目的高效运行。当项目在运行时&#xff0c;性能问题可能会导致应用程序变慢、响应时…