当前位置: 首页 > news >正文

DirectX3D设备丢失(lost device)的处理(一)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

在创建时使用D3DPOOL_MANAGED标志的资源可以不需要重新载入,但D3DPOOL_DEFAULT加载的资源就需要先释放,后重建。

通常需要这样处理的有ID3DXFont和ID3DXSprite,而.X模型什么的就不需要。
在发现设备丢失时,我们要调用 OnLostDevice(void)函数让D3DPOOL_DEFAULT加载的资源释放掉。
好在ID3DXFont和ID3DXSprite有设备丢失处理函数,直接调用就好了

void OnLostDevice(void)
{

    m_sprite->OnLostDevice();
    m_font->OnLostDevice();
}


可是,怎么知道设备丢失了呢?
如果设备丢失,Present()函数就会“出问题”,返回值是D3DERR_DEVICELOST。

m_pIDirect3DDevice->EndScene();

HRESULT hr;
hr 
= m_pIDirect3DDevice->Present(NULL, NULL, NULL, NULL);
if(hr == D3DERR_DEVICELOST)
{
    
if(m_pIDirect3DDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET)
    {
        OnLostDevice();
        OnResetDevice();
    }
}

TestCooperativeLevel()== D3DERR_DEVICENOTRESET时,就可以恢复设备了。
于是,我们调用
OnLostDevice()让D3DPOOL_DEFAULT加载的资源释放掉,之后,调用OnResetDevice()来恢复设备就可以了。

怎么恢复设备呢?

void OnResetDevice(void)
{
    
if(FAILED(m_pIDirect3DDevice->Reset(&d3dpp)))
    {
        
return;
    }

    m_sprite
->OnResetDevice();
    m_font
->OnResetDevice();

    InitDevice();
}

先让D3D设备reset,然后调用ID3DXFont和ID3DXSprite的恢复函数,最后,需要把D3D设备中的状态啊,矩阵变换啊这些重新设置下就完成了,也就是调用InitDevice()。
 

void InitDevice()
{
m_pIDirect3DDevice
->SetRenderState( D3DRS_ZENABLE, TRUE );

m_pIDirect3DDevice
->SetRenderState( D3DRS_AMBIENT, 0xffffffff );

m_pIDirect3DDevice
->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
m_pIDirect3DDevice
->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
m_pIDirect3DDevice
->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

D3DXMatrixPerspectiveFovLH( 
&matProj, D3DX_PI/41.0f1.0f1000.0f );
m_pIDirect3DDevice
->SetTransform( D3DTS_PROJECTION, &matProj );

vEyeVec
=D3DXVECTOR3(0.0f,0.0f,-1.0f);
vLookatVec
=D3DXVECTOR3(0.0f,0.0f,0.0f);
vUpVec
=D3DXVECTOR3(0.0f,1.0f,0.0f);
D3DXMatrixLookAtLH( 
&matView, &vEyeVec, &vLookatVec, &vUpVec );
m_pIDirect3DDevice
->SetTransform( D3DTS_VIEW, &matView );

}


啊,这样设备丢失就处理好了

转载于:https://my.oschina.net/u/3773235/blog/1612633

相关文章:

  • Ubuntu12.04_X64 apt-get install 报错404
  • 面试必问的volatile,你了解多少?
  • Day04——Python模块
  • [UWP]附加属性2:实现一个Canvas
  • 微信支付demo 报错解决方案:ld: symbol(s) not found for architecture arm64 clang: error: lin
  • java ftp上传方法
  • SQLServer 复制中移除和添加发布而不初始化所有项目
  • gitignore的配置
  • CXF WebService中传递复杂对象(List、Map、Array)
  • 常规活动页面制作
  • Oracle、PostgreSQL的对象命名规则
  • Spring Cloud教程 (一)云原生应用程序
  • Eclipse环境下如何配置tomcat,并且把项目部署到Tomcat服务器上
  • 使用WinDbg获取SSDT函数表对应的索引再计算得出地址
  • 二次排序
  • Apache Pulsar 2.1 重磅发布
  • ECS应用管理最佳实践
  • js 实现textarea输入字数提示
  • passportjs 源码分析
  • php面试题 汇集2
  • Wamp集成环境 添加PHP的新版本
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 测试开发系类之接口自动化测试
  • 程序员最讨厌的9句话,你可有补充?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何合理的规划jvm性能调优
  • 入手阿里云新服务器的部署NODE
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用docker-compose进行多节点部署
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 小程序button引导用户授权
  • 新手搭建网站的主要流程
  • 一个SAP顾问在美国的这些年
  • 在weex里面使用chart图表
  • 主流的CSS水平和垂直居中技术大全
  • linux 淘宝开源监控工具tsar
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #pragma data_seg 共享数据区(转)
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (笔试题)分解质因式
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (转)iOS字体
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 使用配置文件
  • ??eclipse的安装配置问题!??
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @Data注解的作用
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [AHOI2009]中国象棋 DP,递推,组合数