كيف يمكنك تحديد ما إذا كان WPF يستخدم عرض الأجهزة أو البرامج؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

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

يبدو أنني أتذكر مكالمة هاتفية لتحديد ذلك، لكن لا يمكنني أن أضع يدي عليها الآن.

أيضًا، هل هناك طريقة سهلة تعتمد على التعليمات البرمجية لفرض مسار عرض واحد على الآخر؟

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

المحلول

تحقق من RenderCapability.Tier

[تحديث]

  • RenderCapability.IsPixelShaderVersionSupported - الحصول على قيمة تشير إلى ما إذا كان إصدار تظليل البكسل المحدد مدعومًا أم لا.
  • RenderCapability.IsShaderEffectSoftwareRenderingSupported - الحصول على قيمة تشير إلى ما إذا كان النظام يمكنه عرض تأثيرات الصور النقطية في البرنامج.
  • RenderCapability.Tier - يحصل على قيمة تشير إلى طبقة العرض للسلسلة الحالية.
  • RenderCapability.TierChanged - يحدث عندما تتغير طبقة العرض لكائن المرسل لمؤشر الترابط الحالي.

قدرة العرض.المستوى >> 16

  • تقديم الطبقة 0 - لا يوجد تسريع لأجهزة الرسومات.مستوى إصدار DirectX أقل من الإصدار 7.0.
  • تقديم المستوى 1 - تسريع أجهزة الرسومات الجزئية.مستوى إصدار DirectX أكبر من أو يساوي الإصدار 7.0، وأقل من الإصدار 9.0.
  • تقديم المستوى 2 - تستخدم معظم ميزات الرسومات تسريع أجهزة الرسومات.مستوى إصدار DirectX أكبر من أو يساوي الإصدار 9.0.

نصائح أخرى

يوفر .NET 4.0 القدرة على فرض عرض البرامج في التعليمات البرمجية:

public partial class App : Application 
{    
    protected override void OnStartup(StartupEventArgs e)    
    {         
        if (WeThinkWeShouldRenderInSoftware())            
            RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;    
    }
}

يرى هذا المشنور للمزيد من المعلومات.

على أساس روابط RenderingTier, ، إليك بعض التعليمات البرمجية:

        logger.InfoFormat("WPF Tier = {0}",RenderCapability.Tier / 0x10000);
        RenderCapability.TierChanged +=
            (sender, args) => logger.InfoFormat("WPF Tier Changed to {0}",
                                                RenderCapability.Tier / 0x10000);

ما زلت أختبر وأعمل على هذا.راجع التعديلات/الإجابات المستقبلية لما أجده.

ربما يمكن أن يساعدك ما يلي في حل الجزء الثاني من سؤالك، وهو هل يمكنك فرض مسار عرض واحد على الآخر:

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

هناك شيء واحد واضح يجب ملاحظته هنا ...هو أن هذا يؤثر الجميع يجب استخدام تطبيقات WPF فقط لأغراض الاختبار.

لتعطيل تسريع الأجهزة:

[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000001

لتمكين تسريع الأجهزة:

[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000000

ألق نظرة على هذا رابط MSDN لمزيد من المعلومات.

أو استخدم أدوات التشكيل الجانبي...

تمت إضافة مربع اختيار جديد لتلوين عناصر التطبيق المستهدفة التي تستخدم تأثيرات الصورة النقطية القديمة المقدمة من SW.

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

لقد قمت بإنشاء تطبيق بسيط باستخدام لوحة قماشية وقمت فقط بتدوير مستطيل باستخدام RotateTransform الذي يستخدم الكثير من وحدة المعالجة المركزية للتطبيق المعروض.هذا وقيمة "RenderCapability.Tier" هي 2، لذا هناك قدرة كافية للقيام بذلك.

لماذا لا إذن؟

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

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

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