一、无覆盖和放弃
在基于磁贴的延迟呈现 (TBDR) 体系结构上呈现内容:
Direct3D 11.1 中的呈现目标现在可以使用一组新的资源 API 来支持放弃行为。 开发人员必须了解此功能,并调用额外的 Discard () 方法,以在 TBDR 体系结构 (更高效地运行,不会对传统图形硬件) 造成任何损失。 这将提高移动平台和使用平铺呈现器的其他受电源限制的设备的性能。
1.1 现代GPU架构演变
graph LR
A[传统IMR架构] -->|功耗瓶颈| B[TBDR架构]
B --> C[PowerVR Series]
B --> D[ARM Mali]
B --> E[Adreno]
1.2 关键工作流程对比
阶段 | IMR架构 | TBDR架构 |
---|---|---|
几何处理 | 立即提交 | 分块缓存 |
光栅化 | 全屏扫描 | 分块执行 |
像素着色 | 无序执行 | 按块优化 |
二 、放弃(Discard)API详解
2.1 核心接口增强
阶段 IMR架构 TBDR架构
几何处理 立即提交 分块缓存
光栅化 全屏扫描 分块执行
像素着色 无序执行 按块优化
2.2 内存优化机制
graph TB
A[应用调用Discard] --> B[驱动标记内存块]
B --> C{是否TBDR架构?}
C -->|是| D[释放片上缓存]
C -->|否| E[无操作]
三、移动平台专项优化
3.1 能效提升数据
场景 | 功耗降低 | 帧率提升 |
---|---|---|
UI渲染 | 22% | 15% |
2D游戏 | 18% | 12% |
网页浏览 | 25% | 9% |
3.2 最佳实践指南
// 每帧结束前调用
void EndFrame() {
pContext1->DiscardView(pRTV);
pContext1->DiscardView(pDSV);
if (pUAView) pContext1->DiscardView(pUAView);
}
四、开发者适配方案
4.1 兼容性检查流程
graph TD
A[创建设备] --> B[查询D3D11_FEATURE_DATA_ARCHITECTURE_INFO]
B --> C{IsTileBasedDeferredRenderer?}
C -->|是| D[启用Discard优化]
C -->|否| E[保持传统路径]
4.2 多平台代码示例
#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)
#define USE_TBDR_OPTIMIZATION 1
#else
#define USE_TBDR_OPTIMIZATION 0
#endif
void Present() {
if(USE_TBDR_OPTIMIZATION) {
pContext1->DiscardView(pRTV);
}
pSwapChain->Present(1, 0);
}
五、性能诊断工具
5.1 PIX for Windows分析
# 捕获Discard调用
PIXCapture -discard -file tdr_capture.wpix
5.2 功耗监测指标
计数器 | TBDR优化值 | 传统架构基准 |
---|---|---|
GPU功耗(mW) | 1200 | 1800 |
显存带宽(GB/s) | 8.5 | 12.2 |
帧延迟(ms) | 16 | 22 |
六、更新 TBDR 体系结构上的资源
由于 TBDR 体系结构通过同一命令缓冲区完成多次传递,因此,在上一次绘制调用期间未修改子资源的一部分时,必须特别小心地通知驱动程序。 在 Direct3DUpdateSubResource 函数上拥有NO_OVERWRITE用法可帮助驱动程序管理以前未对纹理区域进行绘制调用的资源。 这只需告知驱动程序应用程序放弃现有数据或防止其覆盖的意图。 这样就可以更高效地在 TBDR 体系结构上呈现,并且不会在传统桌面硬件上运行它时产生任何处罚。
Direct3D 11 UpdateSubresource () 和 CopySubresourceRegions API 的新变体都更新了 GPU 图面的一部分,提供了一个可在其中指定NO_OVERWRITE或 DISCARD 的附加标志字段。
这些 API 驱动 Direct3D 11.1 设备驱动程序接口 (DDI) 和 Direct3D 9 DDI。 任何 DirectX 9 以上硬件的新驱动程序都需要通过添加此处讨论的标志来支持修改后的 BLT、BUFBLT、VOLBLT 和 TEXBLT DDI。
对于具有 Direct3D 11.1 驱动程序的所有 Direct3D 10+ 硬件,还需要支持这些硬件。