• DirectX12初始化三——DirectX图形基础结构,功能支持检测,资源驻留


    DiretX图形基础结构

    DirectX图形基础结构(DXGI)。是一种与DirectX3D配合只用的API。DXGI的基本理念是使多种图形API所共有的底层任务能借助一组通用API来进行处理。

    IDXGIFactory就只DXGI的关键接口之一。主要用于创建IDXGISwapChain接口以及枚举显示适配器。

    显示适配器就是一种硬件设备,例如独立显卡,系统也可以使用模拟的软件显示适配器。适配器用接口IDXGIAdapter表示。

    以下代码会显示出系统中所有适配器,包括软件适配器。

    void D3DApp::LogAdapters() //枚举一个系统中所有的显示适配器(显卡),也可以用软件显示适配器模拟显卡
    {
    	UINT i = 0;  //
    	IDXGIAdapter* adapter = nullptr; //IDXGIAdapter接口,用来表示显示适配器
    	std::vector<IDXGIAdapter*> adapterList;  //显示适配器列表
    	while (mdxgiFactory->EnumAdapters(i, &adapter) != DXGI_ERROR_NOT_FOUND) //EnumAdapter方法,枚举显示适配器
    	{
    		DXGI_ADAPTER_DESC desc;  //使用 DXGI 1.0 描述适配器(或视频卡)。
    		adapter->GetDesc(&desc); //GetDesc()方法,获得显示适配器的描述,例如显卡型号
    
    		std::wstring text = L"***Adapter: ";
    		text += desc.Description; //包含适配器描述的字符串。类型是WCHAR[128]
    		text += L"\n";
    	
    		OutputDebugString(text.c_str()); //将字符串发送到调试器进行显示。
    	
    		adapterList.push_back(adapter); //将显示适配器加入适配器列表
    	
    		++i;  //索引增加
    	}
    	for (size_t i = 0; i < adapterList.size(); ++i)
    	{
    		LogAdapterOutputs(adapterList[i]);  //枚举与某块适配器关联的所有显示输出
    		ReleaseCom(adapterList[i]);
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    void D3DApp::LogAdapterOutputs(IDXGIAdapter* adapter) //枚举出与某块适配器关联的所有显示输出
    {
    	UINT i = 0;
    	IDXGIOutput* output = nullptr; //IDXGIOutput表示适配器输出,例如监视器,显示器
    	while (adapter->EnumOutputs(i, &output) != DXGI_ERROR_NOT_FOUND) //枚举适配器输出
    	{
    		DXGI_OUTPUT_DESC desc; //描述适配器(视频卡)和设备之间的输出或物理连接
    		output->GetDesc(&desc);//GetDesc()方法,获得输出的描述
    
    		std::wstring text = L"***Output";
    		text += desc.DeviceName;  //包含输出设备名称的字符串
    		text += L"\n";
    		OutputDebugString(text.c_str());
    	
    		LogOutputDisplayModes(output, mBackBufferFormat);
    	
    		ReleaseCom(output);
    	
    		++i;
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    以下代码获得某个显示输出对此格式所支持的全部显示模式。

    void D3DApp::LogOutputDisplayModes(IDXGIOutput* output, DXGI_FORMAT format)//获得某个显示输出对此格式所支持的全部显示模式
    {
    	UINT count = 0;
    	UINT flags = 0;
    
    	output->GetDisplayModeList(format, flags, &count, nullptr); //这个 API 被设计为被调用两次。首先获取可用模式的数量count
    	
    	//DXGI_MODE_DESC结构体用来存储显示模式的信息
    	std::vector<DXGI_MODE_DESC> modelist(count); //显示模式列表
    	output->GetDisplayModeList(format, flags, &count, &modelist[0]);//GetDisplayModeList方法用来获取与请求的格式和其他输入选项匹配的显示模式。
    	
    	for (auto& x : modelist)
    	{
    		//RefreshRate代表一个有理数,这里以赫兹为单位表示刷新率
    		UINT n = x.RefreshRate.Numerator;  //无符号整数,代表有理数顶部
    		UINT d = x.RefreshRate.Denominator;//无符号整数,代表有理数底部
    		std::wstring text =
    			L"Width = " + std::to_wstring(x.Width) + L" " +
    			L"Height = " + std::to_wstring(x.Height) + L" " +
    			L"Refresh = " + std::to_wstring(n) + L"/" + std::to_wstring(d) +
    			L"\n";
    		OutputDebugString(text.c_str());
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    以上代码中的各种结构体、方法、函数、数据类型等都可以在微软官方文档里面查询详细解释,我是每一个未知的类型都查询并理解了的。

    功能支持的检测

    前面检测对多重采样的支持的时候,我们使用了ID3D12Device::CheckFeatureSupport方法,此方法不止可以检测多重采样,还可以检测对其他功能的支持,具体可查看SDK文档(https://docs.microsoft.com/en-us/windows/win32/api/d3d12/nf-d3d12-id3d12device-checkfeaturesupport)

    资源驻留

    复杂游戏会有大量的纹理和3D网格资源,但是大部分资源并不会立即用到,也就不需要存在显存中供GPU使用。DirectX12可以主动控制资源在显存中的去留,这就是资源驻留。使用ID3D12Device::MakeResident方法或者ID3D12Device::Evict方法。具体访问https://docs.microsoft.com/zh-cn/windows/win32/direct3d12/residency 。

  • 相关阅读:
    Spring Boot 中的 ApplicationRunner 和 CommandLineRunner
    高性能本地缓存Ristretto(二)——过期策略
    Objective-C——基础知识2(协议)
    【技术积累】Vue.js中的核心知识【三】
    学习如何将Jenkins与UI测试报告完美整合,事半功倍,轻松获取高薪职位!
    大厂标配 | 百亿级并发系统设计 | 学完薪资框框涨
    缓存的力量:提升API性能和可扩展性
    论文精读ResNet: Deep Residual Learning for Image Recognition
    动态内存管理改造简易通讯录
    【数据库范式】实际案例分析
  • 原文地址:https://blog.csdn.net/qq_51599283/article/details/125566159