ما هي أسرع طريقة لرسم مجموعة ثنائية الأبعاد من ثلاثة توائم ملونة على الشاشة؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

اللغة المستهدفة هي C/C++ ويجب أن يعمل البرنامج فقط على Linux، ولكن من الواضح أن الحلول المستقلة عن النظام الأساسي مفضلة.أقوم بتشغيل Xorg وXVideo وOpenGL المتوفرة.

ما عدد الإطارات في الثانية التي يمكنني توقعها على 1024x768 على معالج Intel Core 2 Duo مع رسومات Intel؟(يتم احتساب الرسم فقط، مع الأخذ في الاعتبار أن المصفوفات جاهزة في ذاكرة الوصول العشوائي؛لا حاجة لتشخيص دقيق)

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

المحلول

أسرع طريقة لرسم مجموعة ثنائية الأبعاد من ثلاثة توائم ملونة:

  1. استخدم تعويم (لا بايت, لا مزدوج) التخزين.يتكون كل ثلاثي من 3 عوامات من 0.0 إلى 1.0 لكل منها.هذا هو التنسيق الذي يتم تنفيذه على النحو الأمثل بواسطة وحدات معالجة الرسومات (ولكن استخدم التدرج الرمادي GL_LUMINANCE التخزين عندما لا تحتاج إلى تدرج اللون - بشكل أسرع بكثير!)
  2. قم بتحميل المصفوفة إلى نسيج باستخدام glTexImage2D
  3. تأكد من أن GL_TEXTURE_MIN_FILTER تم ضبط معلمة النسيج على GL_NEAREST
  4. قم بتعيين النسيج إلى رباعي مناسب.

هذه الطريقة أسرع قليلاً من glDrawPixels (والذي يميل لسبب ما إلى التنفيذ بشكل سيء) و كثيراً أسرع من استخدام التصفح الأصلي للمنصة.

كما أنه يوفر لك خيار القيام بالخطوة 4 بشكل متكرر دون الخطوة 2 عندما لا تتغير الصورة البيكسلية الخاصة بك، وهو بالطبع أسرع بكثير.

تشمل المكتبات التي توفر فقط النسخ الأصلي البطيء ما يلي:

  • ويندوز GDI
  • SDL على X11 (على نظام التشغيل Windows يوفر واجهة خلفية opengl سريعة عند استخدام HW_SURFACE)
  • كيو تي

بالنسبة إلى FPS، يمكنك توقع رسم نسيج مقاس 1024 × 768 على معالج Intel Core 2 Duo مع رسومات Intel:حوالي 60 إطارًا في الثانية إذا تغير النسيج في كل إطار و> 100 إطارًا في الثانية إذا لم يتغير.

ولكن فقط افعل ذلك بنفسك وانظر ;)

نصائح أخرى

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

وإليك بعض رمز المثال، ونأمل أن تتمكن من الاستفادة منه.

#include <GL/glut.h>
#include <GL/glut.h>

#define WIDTH 1024
#define HEIGHT 768

unsigned char texture[WIDTH][HEIGHT][3];             

void renderScene() {    

    // render the texture here

    glEnable (GL_TEXTURE_2D);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glTexImage2D (
        GL_TEXTURE_2D,
        0,
        GL_RGB,
        WIDTH,
        HEIGHT,
        0,
        GL_RGB,
        GL_UNSIGNED_BYTE,
        &texture[0][0][0]
    );

    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0, -1.0);
        glTexCoord2f(1.0f, 0.0f); glVertex2f( 1.0, -1.0);
        glTexCoord2f(1.0f, 1.0f); glVertex2f( 1.0,  1.0);
        glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0,  1.0);
    glEnd();

    glFlush();
    glutSwapBuffers();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

    glutInitWindowPosition(100, 100);
    glutInitWindowSize(WIDTH, HEIGHT);
    glutCreateWindow(" ");

    glutDisplayFunc(renderScene);

    glutMainLoop();

    return 0;
}

خيارات أخرى بخلاف SDL (كما هو مذكور)

  • القاهرة الأسطح ذات الواجهة الجذابة (في لغة C، تعمل على جميع الأنظمة الأساسية ولكنها الأفضل في Linux)
  • قماش كيو تي (في C++، متعدد المنصات)
  • OpenGL API الخام أو كيو تي أوبن جي إل (تحتاج إلى معرفة برنامج openGL)
  • نقي Xlib/XCB إذا كنت تريد أن تأخذ في الاعتبار المنصات غير المفتوحة

اقتراحي

  1. كيو تي إذا كنت تفضل C++
  2. القاهرة إذا كنت تفضل C

لا يمكن الإجابة على سؤال "كم عدد الإطارات في الثانية التي يمكنني توقعها" بجدية.ولا حتى لو قمت بتسمية جد الرجل الذي قام بتصميم المعالج.ذلك يعتمد على العديد من المتغيرات.

  • كم عدد التوائم الثلاثية التي تحتاج إلى تقديمها؟
  • هل يتغيرون بين الإطارات؟
  • بأي معدل (لن تلاحظ التغيير إذا كان أكثر من 30 مرة في الثانية)؟
  • هل تتغير كل وحدات البكسل طوال الوقت أم أن بعض وحدات البكسل فقط في بعض المناطق؟
  • هل تنظر إلى البكسلات دون أي تشويه للمنظور؟
  • هل ترى دائما كل بكسل؟
  • اعتمادا على إصدار برنامج تشغيل opengl سوف تحصل على نتائج مختلفة

يمكن أن يستمر هذا إلى الأبد، فالإجابة تعتمد تمامًا على الخوارزمية الخاصة بك.إذا التزمت بأسلوب opengl، فيمكنك أيضًا تجربة امتدادات مختلفة (http://www.opengl.org/registry/specs/NV/pixel_data_range.txt يتبادر إلى ذهنك على سبيل المثال)، لمعرفة ما إذا كان يناسب احتياجاتك بشكل أفضل؛على الرغم من أن طريقة glTexSubImage() المذكورة بالفعل سريعة جدًا.

<اقتباس فقرة>   

وكم FPS يمكن أن أتوقع على 1024x768؟

والجواب على هذا السؤال تعتمد على العديد من العوامل التي من المستحيل أن أقول.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top