2008-09-24 5 views
6

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

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

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

ответ

9

В зависимости от того, что означают клиенты, «не работает». Он может быть одним из:

  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, вам нужно разобраться с ними и обойти их. Много работы.

1

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

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

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

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

2

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

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

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

1

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

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 см here.

 Смежные вопросы

  • Нет связанных вопросов^_^