DirectDraw播放中BLT failed与Lock失败问题
DirectDraw播放中BLT failed与Lock失败问题
编者:李国帅
qq:9611153 微信lgs9611153
时间:2009-10-13 03:07下午
背景原因:
这是一个曾经遇到的播放问题,并不会造成严重问题。发生在win32的年代,一个曾经的记忆。
所需资源:
VC,DirectDraw
问题描述:
在其它的机器上出现了以下错误,奇怪的现象
(1)频繁出现BLT failed
BLT failed ddrval=-2147467259. dstRect(745,763;1005,983) //FFFFFFFF 0x80004005l //FFFFFFFF80004005
2009/09/01 07:16:51 BLT failed ddrval=-2147467259. dstRect(761,97;1013,322)
blt 出现E_FAIL错误,很经常。已经进行了锁定。
没有图像可能与pullid(播放流标记)得到的数据有关系?播放过程中出现间接中断并继续,说明不是因为pullid发生了改变。
blt贴图失败,能不能不进行提示,使用try把错误扔掉。
贴图失败不会导致程序出错,出错的原因是其他的问题。
看是不是越界 一般blt失败就是越界Blt到不该Blt的地方了,曾经有过copymemory错误,但是只要锁定成功就不会了。
(2)出现lock失败
Lock又出现失败的情况了,在一台新机器上,没有安装显卡。
播放器后备缓冲在锁定缓冲区的时候出现了无数的lock失败,不是显卡问题。
CUtil::Instance()->DbgFilePrintf(L"TSPlayer",_T("LockBuffer Backsurface Lock Failed. ddrval=%d."),ddrval);
2009/10/14 14:53:44 TSPlayer: LockBuffer Backsurface Lock Failed. ddrval=-2005532222.//FFFFFFFF887601C2
这个问题不会导致程序出现异常错误。
unsigned char* CDisplayHandle::LockBuffer(LPDIRECTDRAWSURFACE7 lpddsBack) { ATLASSERT (lpddsBack != NULL); if(lpddsBack == NULL) return NULL; //DDLOCK_SURFACEMEMORYPTR HRESULT ddrval; DDSURFACEDESC2 ddsd; ZeroMemory(&ddsd, sizeof(DDSURFACEDESC2)); ddsd.dwSize = sizeof(DDSURFACEDESC2); //ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); //ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_CAPS; //ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; //ddsd.dwHeight = Height; //ddsd.dwWidth = Width; //ddsd.dwFlags |= DDSD_PIXELFORMAT; //ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC; //ddsd.ddpfPixelFormat.dwFourCC = SubType.Data1; ddrval = lpddsBack->Lock(NULL, &ddsd, DDLOCK_NOSYSLOCK | DDLOCK_WRITEONLY/* | DDLOCK_WAIT*/, NULL); if (FAILED(ddrval))//if (ddrval != DD_OK) { if (ddrval == DDERR_INVALIDPARAMS) { ddrval = lpddsBack->Lock(NULL, &ddsd, /*DDLOCK_WAIT |*/ DDLOCK_WRITEONLY, NULL); } if (ddrval == DDERR_SURFACELOST) { lpddsBack->Restore(); //已经Restore但还是无法锁定。 ddrval = lpddsBack->Lock(NULL, &ddsd, /*DDLOCK_WAIT |*/ DDLOCK_WRITEONLY, NULL); } } //ATLASSERT(SUCCEEDED(ddrval)); if (FAILED(ddrval))//if (ddrval != DD_OK) { CUtil::Instance()->DbgFilePrintf(L"TSClient",_T("TSPlayer: LockBuffer Backsurface Lock Failed. ddrval=0x%X."),ddrval); return NULL; } unsigned char* pBuffer = NULL; pBuffer = (unsigned char*)ddsd.lpSurface; ATLASSERT(pBuffer != NULL); if(pBuffer == NULL)lpddsBack->Unlock(NULL); return pBuffer; } |
可能的原因:
在后期处理程序的时候也出现,原因是cpu和内存使用量过大,导致计算错误。
程序在运行过程中,突然出现BLT failed,程序开始响应缓慢,出现问题。
2010/01/27 22:39:39 **Player: BLT failed ddrval=0X80004005. dstRect(218,234;426,371)
2010/01/27 22:39:39 **Player: BLT failed ddrval=0X80004005. dstRect(428,512;637,649)
2010/01/27 22:39:39 **Player: BLT failed ddrval=0X80004005. dstRect(218,96;426,232)
2010/01/27 22:39:39 **Player: BLT failed ddrval=0X80004005. dstRect(428,234;637,371)
2010/01/29 09:16:04 *** fail for (BYTE*)malloc(262144) failed.
参考
/* * Display hardware is capable of bltting to or from system memory */ #define DDERR_GENERIC E_FAIL #define E_FAIL _HRESULT_TYPEDEF_(0x80004005L) #define DDERR_NOZBUFFERHW MAKE_DDHRESULT(340) #define MAKE_DDHRESULT(code) MAKE_HRESULT(1,_FACDD,code) #define MAKE_HRESULT(sev,fac,code) \ ((HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) ) #define MAKE_SCODE(sev,fac,code) \ ((SCODE) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))) ) #define _FACDD 0x876 #define MAKE_DDHRESULT( code ) MAKE_HRESULT( 1, _FACDD, code ) /*DDERR_SURFACEBUSY Access to this surface is being refused because the surface is already locked by another thread. */ /*DDERR_SURFACELOST Access to this surface is being refused because the surface is gone. * The DIRECTDRAWSURFACE object representing this surface should have Restore called on it. */ #define DDERR_SURFACEBUSY MAKE_DDHRESULT( 430 ) = ((1<<31) | (0x876)<<16 | 430 ) = 0x887601ae #define DDERR_SURFACELOST MAKE_DDHRESULT( 450 ) = 0x887601C2 |
DirectDraw播放中BLT failed与Lock失败问题相关推荐
- VMware虚拟机出现Reason: Failed to lock the file
打开VMware出现Cannot open the disk *.vmdk or one of the snapshot disks it depends on.Reason: Failed to l ...
- c++调用mysql存储过程_C++中ADO调用MySQL存储过程失败,诡异的语法异常,求解中,附源码...
C++中ADO调用mysql存储过程失败,诡异的语法错误,求解中,附源码 不管怎么调整,死活都出现下面的错误 C++ADO代码我实在找不到什么错误了,难道是MySQL有什么问题,或者有其他需要注意的地 ...
- go插件 vscode 报错_MacOS中 VSCode 安装 GO 插件失败问题的快速解决方法
问题重现 Installing golang.org/x/tools/cmd/guru FAILED Installing golang.org/x/tools/cmd/gorename FAILED ...
- CentOS7中使用systemctl列出启动失败的服务
列出启动失败的服务 # systemctl list-units --state failed 可以发现,有个两个服务启动失败了. is-failed选项 可以使用is-failed选项检查指定的服务 ...
- boost中的mutex与lock
最近在多线程编程中多次使用到mutex来互斥,看了下项目的代码,有自己封装的mutex类,也有直接使用boost::mutex的,而boost中关于mutex可谓令人眼花撩换.这里总结一下. 对于mu ...
- 虚机打不开报failed to lock the file错误原因及解决方案
问题出现的原因: 虚拟磁盘(.vmdk)本身有一个磁盘保护机制,为了防止多台虚拟机同时访问同一个虚拟磁盘(.vmdk)带来的数据丢失和性能削减方面的隐患,每次启动虚拟机的时候虚拟机会使用扩展名为.lc ...
- Qt程序添加音乐和音效,解决QtCreator中给程序添加音乐失败的问题
Qt程序添加音乐和音效,解决QtCreator中给程序添加音乐失败的问题 最近写了个Qt小游戏,希望添加个背景音乐,却失败了很多次,下面总结一下经验. 添加音乐或者音效一般需要使用multimedia ...
- 虚拟机Failed to lock the file 和Reason: The file is too large错误的解决方法
转自http://hi.baidu.com/perfectxyz/blog/item/23ac06f871720b04d8f9fd57.html 1.VMware 启动报错 "Failed ...
- Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案
关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案 转载于:https://www.cnblogs.com/daemonFlY/p/10916812. ...
最新文章
- 解决Neither the JAVA_HOME nor the JRE_HOME environment variable is defined问题
- ‘复杂变简单‘的代码例子
- 【SpringMVC】SpringMVC 对 Date 类型转换
- 如何成为架构师?3条有效的实战经验
- (98)FPGA localparam 与parameter区别?
- Silvaco TCAD仿真2——Silvaco TCAD 档名
- 计算机标准体重计算公式,项目2:就拿胖子说事---(2)计算出标准体重,当超重时,请给出提示...
- 33、Python第三方库安装和使用
- 3A简介(持续更新)
- Android设备root及xposedPrivacy的安装
- DHCP工作过程及DHCP中继
- DeepNet :Scaling Transformers to 1000 Layer
- python轮子下载教程
- 系列文章深度解读|SwiftUI 背后那些事儿
- kde调整分辨率_7个很酷的KDE调整将改变您的生活
- 冷启动问题——协同过滤(推荐系统)
- 农作物病虫害AI智能监测预警系统
- c语言经典测试,c语言经典写作测试(非常完整).doc
- Android 存档
- 雅马哈机器人以太网通信_紧凑型机器人控制器 - RCX320 - Yamaha Motor Co.,Ltd./雅马哈 - 以太网通信接口...
热门文章
- 区块链USDT承兑商支付系统开发应用技术
- mysql chown_请教,mysql编译时出错,chown: “mysql”: 无效的用 户
- 数学公式中的侧m 求和符号∑详解
- 八代的cpu能装服务器系统吗,8代i5能不能装win7
- 01背包问题详解(浅显易懂)
- NS版暗黑破坏神3金手指开发教程(17)
- 【C/C++】【面经】2022 寒武纪 面经;( 媒体软件方向 )(更新:一面;二面;)
- C#学习记录(30)windows应用程序基础之控件
- 中国移动政企科创专题:5G网联无人机,逆风飞行,使命必达
- 我们正进入另一个黑暗和无知的时代----《三联生活周刊》 (转载)