سؤال

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

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

هل واجه أي شخص آخر هذه المشكلة أيضًا؟هل وجدت حلاً أفضل من استخدام مثيل عالمي تعيد استخدامه للتو لكل فيديو جديد؟

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

المحلول

لا يمكنك حل مشاكل الذاكرة كثيرًا حتى يضيف Flash أدوات تدميرية وحذفًا صريحًا للكائنات، للأسف.انظر هذا الموضوع:

تفريغ ByteArray في Actionscript 3

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

أوه، ولا أعتقد أن استخدام مثيل واحد هو حل أنيق أيضًا.أقوم حاليًا بكتابة وظيفة التخلص () لفئاتي المخصصة، في انتظار بعض الأيام عندما يمكن تحويلها إلى أداة تدمير مناسبة.

نصائح أخرى

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

وهنا بلوق وظيفة حول هذا الموضوع

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

aib سأعترف بأن حل المثيل الفردي ليس أنيقًا، ولكن نظرًا لأن الفلاش لن يتخلى عن ملفات FLV هذه، فأنا عالق فيه نوعًا ما.

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

أتمنى أيضًا أن أتمتع بسمعة التصويت لصالح كل من إجاباتك لأنها كانت مفيدة ...هذه هي الحياة

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

وأيضًا، إذا كنت تقوم بإنشاء مقاطع فيديو فردية، فإن VideoPlayer يكون أخف وزنًا بكثير، ويتم تنظيفه بشكل أفضل.

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

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