1

我正在包装 IDirect3D8 类(基本上是重新实现它)并且我使用 DXGI 来枚举适配器模式。问题来了。

D3DDISPLAYMODE 的 Format 成员要求它是 D3DFORMAT 枚举类型的成员,尽管 IDXGIOutput::GetDisplayModeList 显然返回 DXGI_FORMAT 枚举类型的成员,这与 D3DFORMAT 完全不同。我需要将 DXGI_FORMAT 成员链接到 D3DFORMAT 成员。

我的第一个想法是编写一个函数来检查类型并相应地将其重定向到正确的 D3DFORMAT 成员,但这不是一个很好的主意(它们是 D3DFORMAT 中的 67 个成员)。然后我想出了一个想法,我可以有一个数组,其索引将是 DXGI_FORMAT 成员的值,它们的值将是相应的 D3DFORMAT 成员,但我不确定 - 可能有更好的方法,我会浪费时间。有没有更好或更简单的方法来做到这一点?

4

1 回答 1

0

您是否真的需要此映射取决于您的具体实现。但是,我找不到更好的方法来映射这些枚举器。静态数组常量比std::mapor更节省内存和运行时效率std::multimap,因为键/索引是连续的,并且键和值都只需要 (8 - ) 32 位。但是初始化数组常量可能比动态地将值放入映射或数组更容易出错。

为避免错误,请注释键(使用等于实际数组索引的值)...

const D3DFORMAT dxgi_d3d_format_mapping[] = {
    /*DXGI_FORMAT_UNKNOWN*/                   D3DFMT_UNKNOWN,
    /*DXGI_FORMAT_R32G32B32A32_TYPELESS*/     D3DFMT_A32B32G32R32F,
    //.
    //.
    //.
};

...或者如果可用,请使用 C99 语法,在这种情况下应该首选:

const D3DFORMAT dxgi_d3d_format_mapping[] = {
    [DXGI_FORMAT_UNKNOWN]                = D3DFMT_UNKNOWN,
    [DXGI_FORMAT_R32G32B32A32_TYPELESS]  = D3DFMT_A32B32G32R32F,
    //.
    //.
    //.
};

用法很明显,但也许索引检查不会受到伤害:

assert( 0 <= dxgi_fmt && dxgi_fmt < (sizeof(dxgi_d3d_format_mapping)/sizeof(D3DFORMAT)) );
D3DFORMAT d3d_fmt = dxgi_d3d_format_mapping[dxgi_fmt];
于 2013-09-14T13:49:52.967 回答