هل تبحث عن حل أسرع من GDI لعرض مخططات البيانات الديناميكية

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

سؤال

لقد قمت بكتابة مخطط بيانات بسيط يستند إلى GDI باستخدام C++/CLI ولكنه ليس سريعًا بشكل خاص (تشير بعض ملفات التعريف الأساسية إلى أن العرض على الشاشة هو المشكلة).

هل هناك أي طريقة لتمكين تسريع الأجهزة لـ UserControl أم أن هناك واجهة .net لـ direct3D؟...أو هل هناك بعض الخيارات الأخرى التي يمكنني وضعها في الاعتبار.

نحن نستخدم تعليمات برمجية مُدارة، لذا يجب أن يكون الحل متوافقًا مع واجهة سطر الأوامر (CLI) إذا كان ذلك ممكنًا.

[يحرر] في حال كان ذلك مفيدًا، فأنا أقوم بتقطيع شرائح (128 نقطة بيانات) من المستطيلات التي يستخدم كل منها 2 × 2 بكسل Graphics::FillRectangle - ربما هناك طريقة أفضل للقيام بذلك؟

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

المحلول

وقد تم إهمال

والمدارة دايركت لبعض الوقت. هل حقا لا تريد استخدام ذلك. بدلا من ذلك، يجب عليك استخدام SlimDX التي هي طبقة مصدر إمكانية التشغيل المتداخل مفتوحة لواجهات برمجة التطبيقات دايركت SDK مكتوب في C ++ / CLI. وهو أفضل من دايركت إدارتها وبدعم من المجتمع الخبراء من المطورين. (أنا ذاهب للعمل على تحسين الدعم DirectWrite معهم قريبا.)

نصائح أخرى

ومن تجربتي، وأنك لن تحصل على الأداء الجيد بما فيه الكفاية من استخدام GDI +. وحتى بالنسبة للرسم بسيط، فسوف ندرك بسرعة أن هناك الكثير من النفقات العامة.

والبدائل من شأنه (كما ذكرت) يكون Direct3D، أو هل يمكن النظر GDI مع يدعو النظام. وهذا يجعل من الواضح أن منصة كود تعتمد كنها يمكن أن تكون سريعة جدا. لقد كانت نتائج جيدة باستخدام ذلك.

وكل هذا يتوقف على مدى تعقيد كنت على استعداد للتعامل معها. GDI يمكن أن يكون من السهل نسبيا بمجرد معرفة الأساسيات، Direct3D هو قليلا أكثر تعقيدا. على الرغم من Direct3D هو أكثر دليل على المستقبل.

صحيح أن GDI+ ليس جيدًا جدًا من حيث الأداء، إلا أنني قمت بنفسي بكتابة راسمة GDI+ في مشروع متعلق بالعمل قادر على إخراج الرسوم البيانية بآلاف النقاط عند حوالي 30 إطارًا في الثانية بدقة 1680 × 1050 (الرسم البياني التمريري) ).

لقد استغرق الأمر الكثير من الضبط لتحقيق ذلك:

  • تحويل كل شيء إلى مسار واحد قبل الرسم.
  • في حالة استخدام المخزن المؤقت الخلفي، استخدم واحدًا بتنسيق البكسل Format32bppPArgb، حيث يمكن أن يؤدي ذلك إلى تسريع عملية النسخ بمعدل 2-4x.
  • إذا رسم مسارًا بـ a كثير من الخطوط العمودية (إشارة عالية التردد)، ارسمها كخطوط أفقية على مخزن مؤقت خلفي بدلاً من ذلك، ثم ارسم الصورة التي تم تدويرها على الشاشة.انتبه إلى أن رسم صورة تم تدويرها له أيضًا تكلفة معينة.

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

ما الدقة ومعدل الإطارات الذي نتحدث عنه هنا بالمناسبة؟

مايكروسوفت لديها الآن أيضا Direct2D, ، وهو عبارة عن رسم ثنائي الأبعاد مسرّع بالأجهزة:

Direct2D هو تسريع الأجهزة ، الوضع الفوري ، 2-D الرسومات API التي يوفر أداء عاليا و تقديم عالي الجودة ل 2-D الهندسة والصور النقطية والنص.ال تم تصميم واجهة برمجة تطبيقات Direct2D ل تعمل بشكل جيد مع GDI و GDI + و دايركت 3 دي.

يتطلب نظام التشغيل Windows 7/Server 2008 R2، ولكن تمت إضافة الدعم مرة أخرى إلى نظام التشغيل Vista/Server 2008 من خلال تحديث المنصة:

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