سؤال

لدينا عارض ثلاثي الأبعاد يستخدم OpenGL، لكن عملائنا يشكون أحيانًا من أنه "لا يعمل".نشك في أن معظم هذه المشكلات تنبع من محاولتهم استخدام ما هو في الواقع لعبة حديثة ثلاثية الأبعاد في الوقت الفعلي على كمبيوتر محمول خاص بالأعمال.

كيف يمكننا، في مثبت windows msi الذي نستخدمه، التحقق من دعم openGL؟

وكملاحظة جانبية، إذا كان بإمكانك الإجابة على "قائمة بطاقات الرسومات المدعومة لبرنامج OpenGL؟"، فسيكون ذلك رائعًا أيضًا.الغريب أن جوجل لا يساعد هنا ..

هل كانت مفيدة؟

المحلول

يعتمد على ما يعنيه العملاء بـ "لا يعمل".يمكن أن يكون واحدًا من:

  1. لا يتم تثبيته/تشغيله على الإطلاق، بسبب عدم وجود بعض دعم OpenGL.
  2. يتم إطلاقه، لكنه يتعطل أكثر.
  3. يتم تشغيله، ولا يتعطل، ولكن العرض تالف.
  4. يتم تشغيله وعرض كل شيء بشكل صحيح، ولكن الأداء سيئ للغاية.

تحتوي جميع إصدارات Windows (منذ 95) على دعم OpenGL مدمج.لذلك فمن غير المرجح أن يسبب الموقف 1) أعلاه، إلا إذا قمت بتقديم الطلب يتطلب إصدار OpenGL أعلى.

ومع ذلك، فإن تطبيق OpenGL الافتراضي هو OpenGL 1.1 تقديم البرمجيات.إذا لم يقم المستخدم يدويًا بتثبيت برامج التشغيل التي تدعم OpenGL (أي برنامج تشغيل تم تنزيله من موقع NVIDIA/AMD/Intel سيكون به OpenGL)، فسيتم افتراضيًا استخدام هذا التنفيذ البطيء والقديم.من المحتمل جدًا أن يسبب هذا الموقفين 3) و4) أعلاه.

حتى لو كان برنامج OpenGL متاحًا، فإن برامج تشغيل OpenGL على نظام التشغيل Windows ليست قوية جدًا، على أقل تقدير.من المحتمل جدًا أن تتسبب الأخطاء المختلفة في برامج التشغيل في حدوث الموقف 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 لأنه من الآمن إلى حد ما افتراض أن كل كمبيوتر محمول تم تصنيعه خلال السنوات العشر الماضية يوفر ذلك.(على الرغم من أنه إذا كانت أجهزة الكمبيوتر المحمولة هذه قديمة جدًا، فربما هذا الويكي قد تساعد؟)

ومع ذلك، إذا كان الأمر يتعلق فقط بأن برنامجك يعتمد على الرسومات بشكل مكثف، فمن المحتمل أن أوصي ببرنامج قياس أداء صغير للتحقق من أن أنظمة عملائك تصل إلى الصفر في المقام الأول.بامكانك ان تحاول هنا, ، لمعرفة ما إذا كان بإمكانك استخدام إحدى أدوات قياس الأداء الموجودة مسبقًا لمساعدتك، أو يمكنك محاولة كتابة واحدة لبرنامجك على وجه التحديد، على سبيل المثال.برنامج نصي اختباري صغير يحاكي تشغيل البرنامج الخاص بك تحت حمل ثقيل ويسجل معلومات مثل FPS وما إلى ذلك.
بالنسبة للأول، قد تجد أنه من الممكن دمج اختبار التشغيل في مثبت MSI، ولكن ليس لدي أي خبرة في هذا النوع من الأشياء.

نأمل أن تجد هذه مفيدة.

يعد OpenGL جزءًا من Windows منذ Windows NT أو Win95.من غير المحتمل أن تجد نظام Windows لم يتم تثبيت OpenGL عليه مسبقًا (على سبيل المثال.ويندوز 3.1)

ومع ذلك، قد يحتاج تطبيقك إلى إصدار أحدث من OpenGL من الإصدار الافتراضي OpenGL 1.1 الذي يأتي مع إصدارات قديمة جدًا من النوافذ.يمكنك التحقق من ذلك من خلال برنامجك.لا أعرف بأي طريقة كيفية العثور على ذلك من MSI.

لاحظ أنه يتم تحديث برنامج OpenGL عبر برامج تشغيل الرسومات، وليس عن طريق تثبيت حزمة خدمة أو نحو ذلك.

فيما يتعلق ببطاقات الرسومات الممكّنة لبرنامج OpenGL:جميعها تحتوي على برنامج OpenGL.حتى إذا كان العميل يستخدم بطاقة رسومية ISA ET4000 من العصور الحجرية، فهو على الأقل لديه OpenGL 1.1 عبر عرض البرامج.

يأتي Windows مزودًا بدعم OpenGL 1.1 (كما لاحظ الآخرون هنا).لذا، فإن المشكلات التي يواجهها المستخدمون لديك ترجع إلى الامتدادات التي تمت إضافتها إلى OpenGL بعد 1.1.إذا كنت تستخدم مكتبة GLEW، فمن السهل جدًا التحقق من دعم جميع الملحقات التي تستخدمها برمجيًا.فيما يلي كيفية التحقق من دعم استعلام الغلق:

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