Wie ein Installationsprogramm zu schreiben, die für die Unterstützung von OpenGL überprüft?

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

Frage

Wir haben einen 3D-Viewer, die OpenGL verwendet, aber unsere Kunden darüber manchmal beschweren „nicht funktionieren“. Wir vermuten, dass die meisten dieser Probleme von ihnen stammen versuchen, zu verwenden, was in der Tat ist ein modernes 3D-Echtzeit-Spiel, auf einem businiss Laptop-Computer.

Wie können wir, in den Windows-MSI-Installer verwenden wir, überprüfen Sie die Unterstützung für OpenGL?

Und als eine Randnotiz, wenn Sie „Liste der OpenGL unterstützt Grafikkarten?“ Beantworten können, das wäre auch greate sein. Seltsam, dass Google nicht hilft hier ..

War es hilfreich?

Lösung

Abhängig von, was die Kunden bedeuten von „nicht funktioniert“. Es könnte sein, eines der folgenden:

  1. es nicht installieren / launch überhaupt, wegen des Mangels an einigen OpenGL-Unterstützung.
  2. es startet, aber Abstürze weiter.
  3. startet es, nicht abstürzt, aber Rendering ist beschädigt.
  4. es startet und macht alles richtig, aber die Leistung ist miserabel.

Alle Windows-Versionen (ab 95) haben OpenGL-Unterstützung eingebaut. So ist es unwahrscheinlich Situation verursachen 1), es sei denn, Sie Anwendung erfordert höhere OpenGL-Version.

Sie jedoch, dass Standard-OpenGL-Implementierung ist OpenGL 1.1 mit Software-Rendering . Wenn der Benutzer nicht manuell haben Treiber installieren, die OpenGL-Unterstützung haben (jeden Treiber heruntergeladen von NVIDIA / AMD / Intel-Website wird OpenGL haben), werden sie auf diese langsam und alte Implementierung Standard. Dies ist sehr wahrscheinlich Situationen verursachen 3) und 4) oben.

Auch wenn OpenGL verfügbar ist, auf Windows OpenGL-Treiber nicht sehr robust sind, zu sagen, milde. Verschiedene Fehler in den Treibern sind sehr wahrscheinlich Situation 2) zu bewirken, wobei in dem Fahrer einen Absturz etwas gültig verursacht zu tun.

Hier ist ein C ++ / WinAPI Code-Schnipsel, die einen Dummy-OpenGL-Kontext erstellt und ruft info (GL-Version, Grafikkarte Namen, Erweiterungen usw.):

// 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 );

könnten Sie stecken irgendwie diesen Code in Ihren Installateur oder die Anwendung und zumindest prüfen GL-Version für sein 1.1; dies erkennt „Treiber nicht installiert“ -Situation. um aktuelle OpenGL-Treiber Fehler zu umgehen, gut, müssen Sie sie, um herauszufinden, und um sie herum zu arbeiten. Viel Arbeit.

Andere Tipps

Ich denke, Sie ein Problem für OpenGL mit Berufung auf einfach die gewünschte Hardware-Unterstützung haben könnten, da es ziemlich sicher ist, anzunehmen, dass jeder Laptop in den letzten 10 Jahre gemacht liefert es. (Obwohl, wenn diese Laptops wirklich sind, dass alte vielleicht dann dieses Wiki könnte helfen?)

Wenn es jedoch nur, dass Ihr Programm ist grafikintensive dann würde ich wahrscheinlich ein kleines Benchmark-Programm empfehlen zu prüfen, ob Ihre Kunden Systeme bis zu kratzen an erster Stelle stehen. Sie könnten versuchen, hier , um zu sehen, wenn Sie eine der bereits bestehenden Benchmark-Tools verwenden können, um Ihnen zu helfen, oder Sie könnten versuchen, eine für Ihr Programm, das speziell zum Beispiel das Schreiben ein kleines Testskript als Simuliert Ihr Programm unter einer schweren Last und Aufzeichnungen Informationen wie FPS und so weiter laufen.
Für den ersteren kann man sogar feststellen, es ist möglich, einen Testlauf in das MSI-Installationsprogramm zu integrieren, aber ich habe keine Erfahrung in dieser Art der Sache hatte.

Hoffe, dass Sie diese nützlich finden.

OpenGL ist Bestandteil von Windows seit Windows NT oder Win95. Es ist unwahrscheinlich, dass Sie jemals ein Windows-System finden, wo OpenGL ist nicht vorinstalliert (z Windows 3.1)

Allerdings Ihre Anwendung eine neuere Version von OpenGL als die Standard-OpenGL 1.1, die mit sehr alten Versionen von Windows kommt benötigen. Sie können, dass aus Ihrem Programm überprüfen. Ich weiß nicht von irgendeiner Weise, wie das von msi zu finden.

Beachten Sie, dass die OpenGL über die Grafiktreiber aktualisiert werden, nicht durch einen Service Pack installieren oder so.

In Bezug auf OpenGL-Grafikkarten aktiviert: Alle haben OpenGL. Auch wenn der Kunde eine ISA ET4000 Grafikkarte aus der Steinzeit verwendet er zumindest hat OpenGL 1.1 über Software-Rendering.

Windows-Schiffe mit Unterstützung für OpenGL 1.1 (wie andere haben festgestellt, hier). So werden die Probleme Ihrer Benutzer konfrontiert ist auf Erweiterungen, die nach 1,1 bis OpenGL hinzugefügt wurden. Wenn Sie die GLEW Bibliothek verwenden, ist es recht einfach, Unterstützung für alle Erweiterungen zu überprüfen programmatisch Sie verwenden. Hier ist, wie für die Unterstützung von Occlusion Abfrage zu überprüfen:

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;

Weitere Informationen über GLEW finden Sie unter hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top