سؤال

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

لقد حاولت استخدام ملف التعريف وخياراته لالتقاط لقطات الذاكرة وما إلى ذلك - لكن مشكلتي تظل مراوغة.أعتقد أن هناك مشاكل معروفة في استخدام تصحيح أخطاء Flash player أيضًا؟لكني لا أشعر بالسعادة باستخدام إصدار الإصدار أيضًا.

كيف يمكنك متابعة مشكلات تسرب الذاكرة باستخدام FLEX/AS3؟ما هي بعض الاستراتيجيات أو الحيل أو الأدوات التي استخدمتها لتحديد الاستهلاك؟

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

المحلول

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

وتجنب استخدام مجموعات (على الأقل مجموعات كبيرة) كما خصائص الأجسام القيمة. كان لي عدة أنواع من فئات كائن القيمة في تطبيق كيرنجورم بلدي، وكان كل "الأطفال" الملكية التي كانت ArrayCollection، وكان يستخدم لتصفية. عندما التنميط، وجدت أن هذه كانت واحدة من أكبر أكلة ذاكرتي، حتى لقد غيرت طلبي لتخزين بدلا من ذلك "parentId" باعتبارها int واستخدام هذا الترشيح. الذاكرة المستخدمة وقطعت بشكل كبير. شيء من هذا القبيل:

وقديم الطريقة:

public class Owner1
{
    public var id:int;
    public var label:String;
    public var children:ArrayCollection; // Stores any number of Owner2 Objects
}

public class Owner2
{
    public var id:int;
    public var label:String;
    public var children:ArrayCollection; // Stores any number of Owner3 Objects
}

public class Owner3
{
    public var id:int;
    public var label:String;
}

وطريقة جديدة:

public class Owner1
{
    public var id:int;
    public var label:String;
}

public class Owner2
{
    public var id:int;
    public var label:String;
    public var parentId:int; // Refers to id of Owner1 Object
}

public class Owner3
{
    public var id:int;
    public var label:String;
    public var parentId:int; // Refers to id of Owner2 Object
}

وأود أن أقترح أيضا إزالة المستمعين الحدث عندما لم تعد مطلوبة.

نصائح أخرى

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

وبسبب قضايا مثل هذا لقد وضعت مكتبة مفتوحة المصدر التي تساعد على رصد جميع الأحداث الجارية في أي وقت من الأوقات. من السهل حقا لتنفيذ ولقد الحسبان إعادة المشاريع في 10-15 دقيقة تحويلها إلى استخدام EventController لقد وضعت.

وأساسا لسيناريو الخاص بك وأود أن تعمل من خلال جميع الأحداث واستبدالها من: obj.addEventListener (...)؛

ل: EC.add (الكائنات، ...)؛

والباقي هو نفس ما من شأنه القيام به هو تسجيل الحدث وجعله مجنون من السهل أن نرى جميع الأحداث الخاصة بك في أي وقت تريد باستخدام EC.log ()؛

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

والموقع هو: http://fla.as/ec/

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

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