2013-09-13 2 views
1

Я обматываю класс IDirect3D8 (в основном, повторно его реализую), и я использовал DXGI для перечисления режимов адаптера. Наступает проблема. член ФорматСсылка на два члена с перечислением

D3DDISPLAYMODE требует, чтобы он был членом D3DFORMAT перечисленных типов, хотя IDXGIOutput :: GetDisplayModeList возвращается, очевидно, член DXGI_FORMAT перечисленных типов, которая полностью отличается от D3DFORMAT. Мне нужно связать членов DXGI_FORMAT с D3DFORMAT.

Моя первая идея заключалась в том, чтобы написать функцию, которая проверяет тип и перенаправляет его соответствующему члену D3DFORMAT, соответственно, но это не очень хорошая идея (это 67 членов в D3DFORMAT). Затем я придумал идею, что у меня может быть массив, индексы которого будут значениями членов DXGI_FORMAT, и их значения будут соответствующими членами D3DFORMAT, но я не уверен - может быть лучший способ, и я буду тратить время. Есть ли лучший или более простой способ сделать это?

ответ

0

Независимо от того, действительно ли вы выполняете это сопоставление, зависит от конкретной реализации. Однако я не вижу лучшего способа сопоставить эти счетчики. Статическая константа массива больше памяти и времени выполнения, чем std::map или std::multimap, потому что ключи/индексы смежны, и обе клавиши и значения требуют всего 8 (8) 32 бита каждый. Но инициализация константы массива может быть более подверженной ошибкам, чем перенос значений в карту или массив динамически.

Чтобы избежать erros, аннотировать ключ (со значением, равным фактическому индексу массива) ...

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]; 
Смежные вопросы