سؤال

من الصعب وضع هذا في العنوان، لذلك اسمحوا لي أن أشرح.

لدي تطبيق يستخدم Direct3D لعرض بعض الشبكات والعرض المباشر (vmr9 + المخصص) لتشغيل بعض مقاطع الفيديو، ثم أرسل إطار الفيديو كنسيج إلى جزء Direct3D ليتم تطبيقه على الشبكة.يحتاج التطبيق إلى التشغيل 24/7.على الأقل يُسمح بإعادة تشغيله كل 24 ساعة ولكن ليس بشكل متكرر أكثر من ذلك.

المشكلة الآن هي أن العرض المباشر يبدو أنه يسبب مشكلة بعد بضع ساعات من التشغيل، إما بسبب برنامج الترميز أو برنامج تشغيل الفيديو أو ملف الفيديو نفسه.وعند هذه النقطة يرفض التطبيق ببساطة تشغيل المزيد من الفيديو.لكن جزء Direct3D لا يزال يعمل بشكل جيد، ولا تزال الشبكة معروضة.بمجرد إعادة تشغيل التطبيق، يعود كل شيء إلى طبيعته.

لذا، أفكر في تقسيم الجزأين إلى عمليتين مختلفتين.لذا، عندما تفشل عملية الفيديو في تشغيل الفيديو، يمكنني على الأقل إعادة تشغيله على الفور، دون فقدان الجزء Direct3D.

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

لقد قمت بإعداد اتصال TCP في كلتا العمليتين، ودعنا لا نقلق بشأن توصيل المؤشر في هذه المرحلة.

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

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

المحلول

ونعم يمكنك القيام بذلك مع Direct3D 9Ex. هذا يعمل فقط مع ويندوز فيستا ويجب استخدام Direct3DDevice9Ex. يمكنك أن تقرأ عن تقاسم الموارد هنا.

نصائح أخرى

<اقتباس فقرة>   

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

لماذا لا مجرد إصلاح هذا الخطأ بدلا من ذلك؟

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

تمرير القوام لا يعمل.

سأفعل ذلك باستخدام الطرق التالية:

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

لاحظ أنك ستحتاج إلى نقل بيانات الصورة إلى بطاقة الرسومات.والفرق الكبير هو أن هذا النقل يحدث الآن في تطبيق Direct3D وليس في تطبيق DirectShow.

يمكنك أيضًا محاولة استخدام VMR لهذا الغرض.لست متأكدًا مما إذا كانت أجزاء المُخصص/العارض المخصصة ستسمح لك بالعرض في الذاكرة المشتركة.

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

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