لماذا يعمل تطبيق Direct3D بشكل أفضل في وضع ملء الشاشة؟

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

سؤال

يبدو أن أداء تطبيق Direct3D أفضل بكثير في وضع ملء الشاشة مقارنةً بوضع الإطارات.ما هي الأسباب الفنية وراء ذلك؟

أعتقد أن الأمر يتعلق بحقيقة أن تطبيق ملء الشاشة يمكنه التحكم بشكل حصري في الشاشة.ولكن لماذا لا يمكن للتطبيق الحصول على سيطرة حصرية لـ جزء من الشاشة (أيwindow) ولها نفس فوائد الأداء؟

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

المحلول

وفيما يلي الملاحظات جرف على كيفية عمل الأشياء تحتها.

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

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

وعندما لم يكن هناك تطبيق ملء الشاشة وDWM هو خارج، وهي مملوكة سطح أساسي من نظام التشغيل، وتطبيق كل إطارات ينفذ مستوى الذاكرة من backbuffer التطبيق إلى سطح أساسي. هذا مستوى الذاكرة يأخذ بعض الوقت لاستكمال GPU (وكذلك blits من التطبيقات الأخرى مرئية على الشاشة)، حتى انها ليست فعالة مثل عرض ملء الشاشة. عملت XP بهذه الطريقة.

وعندما يتم تأليف DWM الشاشة، الأمور أكثر تعقيدا. هنا، DWM يملك سطح أساسي ويحتاج إلى رسم نوافذ التطبيق هناك. لجعله ممكنا، كل نافذة لديه سطح يرتبط بعقد محتوياته، ودعا سطح توجيه (الذي يسمح DWM لتمكين الظلال نافذة، وآثار الزجاج، وجميع الاشياء التي جيدة). يصدر كل تطبيق D3D وقت الإطار، فإنه يضيف مستوى الذاكرة إلى سطح إعادة التوجيه. وبهذه الطريقة، يحتاج العديد من blits أن يحدث: مستوى الذاكرة إلى سطح التوجيه من قبل التطبيق، مستوى الذاكرة من سطح إعادة توجيه إلى الانتخابات التمهيدية التي كتبها DWM، الذي هو، مرة أخرى، بعض النفقات بالمقارنة مع وضع ملء الشاشة

.

وملاحظة كل ذلك العمل الإضافي هو على GPU، لذلك لا يؤثر على الأداء وحدة المعالجة المركزية.

والسخافات لزيادة يلي:

http://blogs.msdn.com/greg_schechter/ أرشيف / 2006/03/19 / 555087.aspx

http://blogs.msdn.com/greg_schechter/ أرشيف / 2006 / 02/05 / 588934.aspx

http://blogs.msdn.com/greg_schechter/ أرشيف / 2006/03/05 / 544314.aspx

نصائح أخرى

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

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

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

على سبيل المثال، إذا كان لديك مقطع فيديو يتم تشغيله في Windows Media Player في إحدى النوافذ، ثم قم بتشغيل Civilization في نافذة أخرى، وعندما يبدأ Civ في تنفيذ رسوماته الرائعة، فسوف يحتاج إلى مشاركة مساحة الشاشة مع كل شيء آخر (مثل الفيديو.

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

والأساس، وأجهزة الفيديو مخصص تماما لتطبيق وضع خاص.

وليس هناك خلاف على الموارد الفيديو (خط أنابيب، ذاكرة الملمس، الخ ...)

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

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