لماذا يستخدم استخدام الأقلام مع أنماط Dash Devedation ضخمة (!) أداء في رسم WPF مخصص 2D؟

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

  •  22-08-2019
  •  | 
  •  

سؤال

نأمل أن يستطيع أي شخص إلقاء الضوء على هذا حتى أتمكن من استخدام الأقلام مع أنماط اندفاعة؟

أنا أكتب مخططا شرج (أ Panel في داخل ScrollViewer هذا ينفذ IScrollInfo) في WPF باستخدام DrawingVisualDataContext.Drawعاشر. وبعد لدي عدة آلاف DrawingVisualS التي يتم تمريرها باستخدام TranslateTransform على ال Panel يستضيفهم. لقد قمت بتنفيذ شبكة عن طريق وضع Panel علاوة على رأسه ورسم خطوط أفقية بسيطة من حافة إلى أخرى باستخدام DataContext.DrawLine(pen, new Point(0, y), new Point(widthOfPanel, y)); // (ملاحظة: هذه الخطوط ثابتة دائما، لا تتحرك أبدا).

أداء التمرير هو مجنون تماما (يتم رسم التسمم على الفور وتمرير هو فوري). ولكن إذا كنت تستخدم Pen يستخدم أن أنماط Dash (انظر أدناه على سبيل المثال) لرسم خطوط الشبكة، ثم التمرير متشنج للغاية ويبدو أن الأداء قد انخفض من قبل عامل قدره 100 (تقدير). هل يمكن لأي شخص أن يفسر سبب حدوث ذلك وكيف يمكنني حل هذا؟

مثال على القلم مع نمط اندفاعة:

<Pen x:Key="PenUsingDashPatterns" Brush="Black" Thickness="1">
   <Pen.DashStyle >
      <DashStyle Dashes="3, 3" />
   </Pen.DashStyle>
</Pen>
هل كانت مفيدة؟

المحلول

هي الأقلام الحصول على المجمدة؟ تجميد كائنات الرسم تساعد الأداء كثيرا.

يمكنك إعداد معالج محمل وتصحيح لمعرفة ما إذا كانت أقلامك المجمدة. إذا لم يكن الأمر كذلك، فاتصل بالقلم القلم () زر يدويا عليها.

لاحظ أن التجميد يجعل الأقلام قراءة فقط ... لن تكون غير قادر على تعديلها بعد تجميدها.

نصائح أخرى

إليك حل مبدع محتمل - إذا كنت تقوم فقط برسم الخطوط الأفقية و / أو الرأسية، فيمكنك تجربة إنشاء Pen مع نمط المدقق DrawingBrush مثل:

  <Pen x:Key="PenUsingDashPatterns" Thickness="1">
        <Pen.Brush>
            <DrawingBrush TileMode="Tile" 
                          Viewport="0 0 6 6" ViewportUnits="Absolute">
                <DrawingBrush.Drawing>
                    <GeometryDrawing Brush="Black">
                        <GeometryDrawing.Geometry>
                            <GeometryGroup>
                                <RectangleGeometry  Rect="0 0 3 3"/>
                                <RectangleGeometry  Rect="3 3 3 3"/>
                            </GeometryGroup>
                        </GeometryDrawing.Geometry>
                    </GeometryDrawing>
                </DrawingBrush.Drawing>
            </DrawingBrush>
        </Pen.Brush>
    </Pen>   

بدلا من ذلك، يمكنك استخدام فرش مختلفة للخطوط الفيرية والأفقية، أو ربما ImageBrush لأداء أفضل.

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

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

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

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