مشاركة عبر


أمثلية الأداء: سلوك كائن

فهم سلوك مضمن WPF وسوف تساعدك على جعل الكائنات على المبادلات بين الحق وظائف والأداء.

يشتمل هذا الموضوع على الأقسام التالية.

  • لا إزالة معالجات الأحداث على كائنات حية قد حافظ على الأجسام
  • خصائص الأجسام والتبعية
  • قابل للتجميد الأجسام
  • الوضع الظاهري واجهة المستخدم
  • موضوعات ذات صلة

لا إزالة معالجات الأحداث على كائنات حية قد حافظ على الأجسام

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

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

هناك العديد من الأدوات ، مثل المحلل CLR وعارض تعيين العامل ، التي يمكن أن يقدم معلومات عن استخدام الذاكرة لعملية المحدد. منشئ ملفات التعريف CLR يحتوي على عدد من طرق العرض مفيدة جداً من التشكيل الجانبي تخصيص بما في ذلك مدرج تكراري أنواع المخصصة "و" تخصيص "و" رسومات استدعاء سطر وقت إظهار مجموعات البيانات المهملة generations متعددة "و" الناتج عن عملية الدمج الكومة المدارة بعد هذه المجموعات و شجرة استدعاء تبين عمليات تخصيص لكل أسلوب التحميلات التجميع. للحصول على المعلومات, راجع .NET Framework المطور مركز .

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

خصائص الأجسام والتبعية

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

أمثل التبعية الملكية

يجب أن تقوم بتعريف الاعتماد على خصائص التبعية في التطبيق الخاص بك بعناية. إذا كان لديك DependencyProperty تقديم يؤثر فقط نوع بيانات التعريف الخيارات، بدلاً من الخيارات بيانات التعريف الأخرى مثل AffectsMeasure و يجب أن علامة عليه كما بواسطة تجاوز بيانات التعريف الخاصة به. للحصول على مزيد من المعلومات حول تجاوز أو الحصول على تعريف بيانات الخاصية، راجع الخاصية التبعية بيانات التعريف.

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

جعل الملكية التبعية موروث لا يخلو غير حر

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

سجل استخدام معالج فئة بعناية

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

تعيين الافتراضي صواب لـ DependencyProperty أثناء التسجيل

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

تعيين قيمة PropertyMetadata باستخدام تسجيل

عند إنشاء DependencyProperty ، يكون لديك خيار الإعداد PropertyMetadata باستخدام إما Register أو OverrideMetadata أساليب. ورغم أن لديك كائن منشئ ثابتة للاتصال OverrideMetadata ، هذا هو الحل الأمثل كما سوف يؤثر على الأداء. للحصول على أفضل ، تعيين PropertyMetadata أثناء الاستدعاء Register.

قابل للتجميد الأجسام

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

كل Freezable يحتوي Changed الحدث الذي يتم رفع كلما كان التغييرات. ومع ذلك، يتم الإعلام بتغيير المكلفة من أداء التطبيق.

خذ بعين الاعتبار المثال التالي في أي كل Rectangle يستخدم نفس Brush الكائن:

            rectangle_1.Fill = myBrush
            rectangle_2.Fill = myBrush
            rectangle_3.Fill = myBrush
            ' ...
            rectangle_10.Fill = myBrush
rectangle_1.Fill = myBrush;
rectangle_2.Fill = myBrush;
rectangle_3.Fill = myBrush;
// ...
rectangle_10.Fill = myBrush;

افتراضياً، WPF يوفر معالج أحداث للحصول SolidColorBrush الكائن Changed الحدث إبطال Rectangle الكائن Fill الخاصية. في هذه الحالة، كل مرة SolidColorBrush يحتوي إطلاق به Changed الحدث مطلوب استدعاء وظيفة رد الاتصال لكل Rectangle — تفرض له accumulation invocations الدالة رد الاتصال هذه إلى جزاء الأداء الهامة. وبالإضافة إلى ذلك ، فإنه من أداء جدا مكثفة لإضافة وإزالة معالجات في هذه المرحلة منذ تطبيق سيتعين على اجتياز قائمة كاملة للقيام بذلك. إذا تغير سيناريو التطبيق أبداً على SolidColorBrush ، سوف يتم سداد تكلفة الاحتفاظ Changed معالجات الأحداث unnecessarily.

تجميد Freezable يمكنه تحسين الأداء الخاص به لأنه لم يعد يحتاج إلى صرف الموارد في إعلامات التغيير. يوضح الجدول التالي الحجم بسيطة SolidColorBrush عند به IsFrozen الى تعيين true ، مقارنة عندما لا يكون. يفترض هذا تطبيق الفرشاة واحد Fill الخاصية من 10 Rectangle الكائنات.

"الحالة" (State)

Size

<تجميد/>SolidColorBrush

212 بايت

SolidColorBrush غير مجمد

972 بايت

نموذج التعليمات البرمجية التالي يوضح هذا المفهوم :

            Dim frozenBrush As Brush = New SolidColorBrush(Colors.Blue)
            frozenBrush.Freeze()
            Dim nonFrozenBrush As Brush = New SolidColorBrush(Colors.Blue)

            For i As Integer = 0 To 9
                ' Create a Rectangle using a non-frozed Brush.
                Dim rectangleNonFrozen As New Rectangle()
                rectangleNonFrozen.Fill = nonFrozenBrush

                ' Create a Rectangle using a frozed Brush.
                Dim rectangleFrozen As New Rectangle()
                rectangleFrozen.Fill = frozenBrush
            Next i
Brush frozenBrush = new SolidColorBrush(Colors.Blue);
frozenBrush.Freeze();
Brush nonFrozenBrush = new SolidColorBrush(Colors.Blue);

for (int i = 0; i < 10; i++)
{
    // Create a Rectangle using a non-frozed Brush.
    Rectangle rectangleNonFrozen = new Rectangle();
    rectangleNonFrozen.Fill = nonFrozenBrush;

    // Create a Rectangle using a frozed Brush.
    Rectangle rectangleFrozen = new Rectangle();
    rectangleFrozen.Fill = frozenBrush;
}

قد تم تغيير معالجات على Freezables مجمد الاحتفاظ Alive صوابقد

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

WPF أيضاً ربطChanged الأحداث داخلياً. على سبيل المثال، كافة التى تأخذ التبعية والذي يستغرق Freezable كقيمة سوف الاستماع إلى Changed أحداث تلقائياً. Fill الخاصية ، الذي يأخذ Brush كما توضح هذا المفهوم.

            Dim myBrush As Brush = New SolidColorBrush(Colors.Red)
            Dim myRectangle As New Rectangle()
            myRectangle.Fill = myBrush
Brush myBrush = new SolidColorBrush(Colors.Red);
Rectangle myRectangle = new Rectangle();
myRectangle.Fill = myBrush;

تعيين myBrush الى myRectangle.Fill ، مفوض الإشارة مرة أخرى Rectangle إضافة كائن الى SolidColorBrush الكائن Changed الحدث. وهذا يعني أن التعليمات البرمجية التالية في الواقع لا يجعل myRect مؤهلة للحصول على المهملة:

            myRectangle = Nothing
myRectangle = null;

في هذه الحالة myBrush لا يزال يتم الاحتفاظ myRectangle الحياة و سيتم أعد الاتصال به فإنه عند ذلك بالالتقاط به Changed الحدث. لاحظ أن تعيين myBrush إلى Fill خاصية من جديد Rectangle ببساطة إضافة معالج الحدث آخر إلى myBrush.

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

            myRectangle.Fill = Nothing
            myRectangle = Nothing
myRectangle.Fill = null;
myRectangle = null;

الوضع الظاهري واجهة المستخدم

WPF كما يوفر تباين فى العنصرStackPanel و الذى "يصور" تلقائياً بيانات المحتوى التابع المرتبطة . في هذا السياق، الكلمة "يصور" تشير إلى الأسلوب الذي يتم به إنشاء مجموعة فرعية من العناصر عناصر من عدد أكبر من عناصر البيانات استناداً إلى العناصر التي تكون مرئية على الشاشة. يتم بصورة مكثفة كلاً من خلال الذاكرة والمعالج، لإنشاء عدد كبير من عناصر واجهة المستخدم فى حين قد يكون عدد قليل فقط على الشاشة في وقت محدد. VirtualizingStackPanel (خلال الوظيفة التي يوفرها VirtualizingPanel) بحساب العناصر المرئية ويعمل معItemContainerGenerator منItemsControl (مثل ListBox أو ListView) فقط لإنشاء عناصر للعناصر المرئية.

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

يعرض الجدول أدناه الوقت المنقضي إضافة و تقديم 5000 TextBlock عناصر الى StackPanel و VirtualizingStackPanel. في هذا السيناريو، القياسات تمثل الوقت بين إرفاق سلسلة نصية ItemsSource الخاصية من ItemsControl الكائن إلى الوقت عند عرض عناصر لوحة سلسلة النص.

لوحة المضيف

وقت التقديم (بالملي ثانية)

StackPanel

3210

VirtualizingStackPanel

46

راجع أيضًا:

المبادئ

تحسين أداء تطبيق WPF

التخطيط لأداء التطبيق

أمثلية الأداء: الاستفادة من الأجهزة

أمثلية الأداء: التصميم و التخطيط

أمثلية الأداء: الرسومات ثنائية الأبعاد و التصوير

أمثلية الأداء: موارد التطبيق

أمثلية الأداء: Text

أمثلية الأداء: ربط البيانات.

أمثلية الأداء: توصيات أخرى

أدوات الأداء WPF و الموارد