Как написать установщик, который проверяет наличие поддержки OpenGL?

StackOverflow https://stackoverflow.com/questions/126028

Вопрос

У нас есть программа просмотра 3D, которая использует OpenGL, но наши клиенты иногда жалуются на то, что она "не работает".Мы подозреваем, что большинство этих проблем связано с тем, что они пытаются использовать то, что по сути является современной 3D-игрой в реальном времени, на бизнес-ноутбуке.

Как мы можем в используемом нами установщике Windows msi проверить наличие поддержки OpenGL?

И в качестве дополнительного примечания, если вы можете ответить "Список графических карт, поддерживаемых OpenGL?", это тоже было бы здорово.Странно, что Google здесь не помогает..

Это было полезно?

Решение

Зависит от того, что клиенты подразумевают под "не работает".Это может быть один из:

  1. он вообще не устанавливается / запускается из-за отсутствия какой-либо поддержки OpenGL.
  2. он запускается, но в дальнейшем выходит из строя.
  3. он запускается, не выходит из строя, но рендеринг поврежден.
  4. он запускает и отрисовывает все корректно, но производительность ужасна.

Все версии Windows (начиная с 95-й) имеют встроенную поддержку OpenGL.Так что это вряд ли вызовет ситуацию 1), описанную выше, если только вы не примените требует более высокая версия OpenGL.

Однако этой реализацией OpenGL по умолчанию является OpenGL 1.1 с рендеринг программного обеспечения.Если пользователь вручную не устанавливал драйверы с поддержкой OpenGL (любой драйвер, загруженный с сайта NVIDIA / AMD / Intel, будет иметь OpenGL), он по умолчанию будет использовать эту медленную и старую реализацию.Это, вполне вероятно, приведет к ситуациям 3) и 4), описанным выше.

Даже если OpenGL доступен, в Windows драйверы OpenGL, мягко говоря, не очень надежны.Различные ошибки в драйверах с большой вероятностью приведут к ситуации 2), когда выполнение чего-либо действительного приводит к сбою в драйвере.

Вот фрагмент кода C ++ / WinAPI, который создает фиктивный контекст OpenGL и извлекает информацию (версия GL, название видеокарты, расширения и т.д.):

// setup minimal required GL
HWND wnd = CreateWindow(
    "STATIC",
    "GL",
    WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
    0, 0, 16, 16,
    NULL, NULL,
    AfxGetInstanceHandle(), NULL );
HDC dc = GetDC( wnd );

PIXELFORMATDESCRIPTOR pfd = {
    sizeof(PIXELFORMATDESCRIPTOR), 1,
    PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL,
    PFD_TYPE_RGBA, 32,
    0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0,
    16, 0,
    0, PFD_MAIN_PLANE, 0, 0, 0, 0
};

int fmt = ChoosePixelFormat( dc, &pfd );
SetPixelFormat( dc, fmt, &pfd );

HGLRC rc = wglCreateContext( dc );
wglMakeCurrent( dc, rc );

// get information
const char* vendor = (const char*)glGetString(GL_VENDOR);
const char* renderer = (const char*)glGetString(GL_RENDERER);
const char* extensions = (const char*)glGetString(GL_EXTENSIONS);
const char* version = (const char*)glGetString(GL_VERSION);

// DO SOMETHING WITH THOSE STRINGS HERE!

// cleanup
wglDeleteContext( rc );
ReleaseDC( wnd, dc );
DestroyWindow( wnd );

Вы могли бы каким-то образом подключить этот код к своему установщику или приложению и, по крайней мере, проверить версию GL на наличие 1.1;это позволит обнаружить ситуацию "драйвер не установлен".Чтобы обойти реальные ошибки в драйверах OpenGL, что ж, вы должны разобраться с ними и обойти их.Много работы.

Другие советы

Я думаю, у вас могут возникнуть проблемы с простой проверкой аппаратной поддержки OpenGL, поскольку можно с уверенностью предположить, что каждый ноутбук, созданный за последние 10 лет, предоставляет ее.(Хотя, если эти ноутбуки действительно такие старые, то, возможно эта вики - страница может помочь?)

Однако, если дело просто в том, что ваша программа интенсивно использует графику, то я бы, вероятно, порекомендовал небольшую тестовую программу, чтобы в первую очередь проверить, что системы ваших клиентов находятся на должном уровне.Ты мог бы попробовать здесь, чтобы узнать, можете ли вы использовать один из уже существующих инструментов тестирования, который поможет вам, или вы могли бы попробовать написать его специально для вашей программы, напримернебольшой тестовый скрипт, имитирующий запуск вашей программы под большой нагрузкой и записывающий такую информацию, как FPS и так далее.
В первом случае вы даже можете обнаружить, что можно интегрировать тестовый запуск в программу установки MSI, однако у меня не было никакого опыта в подобных вещах.

Надеюсь, вы найдете это полезным.

OpenGL является частью Windows начиная с Windows NT или Win95.Маловероятно, что вы когда-нибудь найдете систему Windows, в которой OpenGL не предустановлен (напримерWindows 3.1)

Однако вашему приложению может потребоваться более свежая версия OpenGL, чем стандартная OpenGL 1.1, которая поставляется с очень старыми версиями Windows.Вы можете проверить это в своей программе.Я не знаю ни одного способа, как найти это у msi.

Обратите внимание, что OpenGL обновляется через графические драйверы, а не путем установки пакета обновления или около того.

Что касается графических карт с поддержкой OpenGL:У всех есть OpenGL.Даже если клиент использует графическую карту ISA ET4000 времен каменного века, у него, по крайней мере, есть OpenGL 1.1 с помощью программного рендеринга.

Windows поставляется с поддержкой OpenGL 1.1 (как отмечали здесь другие ).Итак, проблемы, с которыми сталкиваются ваши пользователи, связаны с расширениями, которые были добавлены в OpenGL после версии 1.1.Если вы используете библиотеку GLEW, довольно легко проверить поддержку всех расширений, которые вы используете программно.Вот как проверить поддержку запроса Occlusion:

if (GLEW_OK != glewInit())
{
    // GLEW failed!
    exit(1);
}

// Check if required extensions are supported
if (!GLEW_ARB_occlusion_query)
    cout << "Occlusion query not supported" << endl;

Подробнее об использовании GLEW см. здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top