Неудачный тест для определения размера видеопамяти - PullRequest
2 голосов
/ 04 ноября 2010

У меня есть библиотека рендеринга на основе .net / DirectX. При запуске программы мы пытаемся выяснить объем физического видео ОЗУ. Важно определить объем физической видеопамяти, чтобы узнать, сколько можно использовать для текстур (если вы работали с серьезным DirectX, вы, вероятно, уже знаете).

Видеопамять обнаруживается путем выполнения следующего кода WMI:

var searcher = new ManagementObjectSearcher("Select * from Win32_VideoController");

foreach(ManagementObject videoCard in searcher.Get())
{
    _numVideoCards++;
    foreach (PropertyData propertyData in videoCard.Properties)
    {
        if (propertyData.Name == "AdapterRAM" && propertyData.Value != null)
        {
            _adapterRAM = Math.Max( (UInt32)(propertyData.Value), _adapterRAM );
        }
    }
}

Этот код был написан несколько лет назад людьми, которые знали DirectX лучше меня.

Проблема в том, что этот вызов теперь непредсказуемо завершается с ошибкой на оборудовании клиента (_adapterRAM == 0 после завершения кода и регистрации исключения).

Я бы хотел изменить тест, но я колеблюсь, потому что ожидаю, что есть причина, по которой видеопамять определяется таким образом, и напрямую через DirectX.

У меня двоякий вопрос:

  • Кто-нибудь знает, почему вы делаете это с WMI и / или
  • знаете ли вы более надежный способ определения объема физического видео ОЗУ?

P.S .: Нас не интересуют видеокарты с общей памятью (например, Intel). Мы используем SlimDX, если это имеет значение.

1 Ответ

1 голос
/ 04 ноября 2010

Просто потому, что D3D9 не предоставляет объем физической памяти на устройстве. Насколько я знаю, WMI - единственный независимый от поставщика вариант.

С D3D10 и D3D11 (с использованием DXGI) вы извлекаете его, используя поле DedicatedVideoMemory из struct DXGI_ADAPTER_DESC и voilà. Так что, если вы ориентируетесь на Vista или Seven OS, это должно сработать.

Опция (но не очень хорошая) будет заключаться в том, чтобы использовать OpenGL и проприетарные расширения, такие как GL_ATI_meminfo, или использовать проприетарные IHV api, такие как NVAPI, и создать для них тонкую оболочку с C ++ / CLI.

...