سؤال

يستخدم برنامجي Pyopengl (لذلك هو Python) مع Psyco.

لديّ حوالي 21000 قطعة من الخطوط التي أحتاج إلى تقديمها في كل إطار من العرض الخاص بي (ما لم يكن المستخدم يتكبير ، وفي هذه الحالات يتم إعدام شرائح خط الحالة وعدم إرسالها إلى البطاقة على الإطلاق). هذا يستغرق حاليًا حوالي 1.5 ثانية لكل إطار لإكماله. هذا ليس جيدًا بما فيه الكفاية ، لذلك أنا أبحث عن طرق لتقليل عدد قطاعات الخطوط المتميزة.

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

أى أفكار كانت لتقدر أكثر.

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

المحلول

من شبه المؤكد أن النفقات العامة لجميع مكالمات وظيفة الوضع الفوري التي تقتل أدائك. سأفعل ما يلي.

لا تستخدم GL_LINE_STRIPS, ، استخدم قائمة واحدة من GL_LINES بدلاً من ذلك ، يمكن تقديمها دفعة واحدة.

يستخدم glDrawArrays بدلاً من عرض الوضع الفوري:

float* coordinates = {....}; //x and y coordinate pairs for all line segments
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 2 * sizeof(float), coordinates);
glDrawArrays(GL_LINES, 0, 2 * linecount);
glDisableClientState(GL_VERTEX_ARRAY);

(من أجل أداء أفضل ، يمكنك تخزين المخزن المؤقت للقمة في شيء يسمى كائن مخزن مؤقت ، ولكن يجب أن يكون هذا جيدًا في البداية)

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

نصائح أخرى

20K شرائح ليست كثيرا. أيضًا ، ستكون محظوظًا عندما تتمكن من دمج 10-100 خطوط لكل إطار ، وبالتالي فإن التسريع بواسطة هذا التحسين سيكون قابلاً للإهمال. ربما تكون عملية التقديم بطيئة لأنك تقوم بإنشاء النموذج مرارًا وتكرارًا. يستخدم glNewList() لحفظ جميع أوامر التقديم في قائمة عرض GL على البطاقة ثم إصدار فقط glCallList() لتقديمه بأمر واحد.

يمكنك تحديد مقياس خطأ لدمج قسمين في خط واحد ثم اختبار جميع أزواج الأجزاء ثم دمجها إذا كان الخطأ أقل من عتبة معينة.

مثال واحد هو هذه الخوارزمية:

  1. قم ببناء قطاع خط جديد X من النقطتين بعيدًا عن بعضهما البعض في الجزءين من الخطين A و B.
  2. ابحث عن المسافة الدنيا إلى x لجميع النقاط في A و B.
  3. تعيين الخطأ كحد أقصى لتلك المسافات الحد الأدنى.
  4. استبدل A و B بـ X إذا كان الخطأ أقل من عتبةك.

هذه ليست أفضل خوارزمية ، ولكن من السهل تنفيذها.

تحرير 1

بالتأكيد حاول القيام بقوائم العرض أو عرض كائن العازلة في Vertex قبل تنفيذ هذا.

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