سؤال

كيف يمكنني بقوة إنزال ByteArray من الذاكرة باستخدام ActionScript 3?

لقد حاولت التالية:

// First non-working solution
byteArray.length = 0;
byteArray = new ByteArray();

// Second non-working solution
for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}

لا يوجد حل صحيح

نصائح أخرى

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

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

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

عندما كنت تستخدم جهاز ماك لمدة 5 دقائق 95% من 3 غيغابايت من ذاكرة الوصول العشوائي ، وسوف تبقى على هذا النحو ، فإنه لم يذهب إلى أسفل.هكذا نظام التشغيل يتعامل مع الذاكرة.

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

(انا لست متأكد من هذا, ولكن...)

AS3 يستخدم غير القطعية جمع القمامة.وهو ما يعني أن unreferenced الذاكرة سيتم تحرير كلما وقت يشعر مثل ذلك (عادة ليس ما لم يكن هناك سبب لتشغيل, لأنها عملية مكلفة تنفيذ).وهذا هو نفس النهج المتبع من قبل معظم الحديث القمامة التي تم جمعها لغات (مثل C# و Java كذلك).

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

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

إلى قوة GC, حاول (نعم مرتين):

flash.system.System.gc();
flash.system.System.gc();

يمكنك قراءة المزيد هنا.

إلقاء نظرة على هذه المادة

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

IANA أكشن مبرمج, ومع ذلك شعور بأنني أستطيع ذلك, لأن جمع القمامة قد لا تعمل عندما تريد ذلك.

ومن ثم http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

لذلك أنصح تحاول جمع كود ومعرفة ما إذا كان هذا يساعد

private var gcCount:int;
private function startGCCycle():void{
    gcCount = 0;
    addEventListener(Event.ENTER_FRAME, doGC);
}
private function doGC(evt:Event):void{
    flash.system.System.gc();
    if(++gcCount > 1){
        removeEventListener(Event.ENTER_FRAME, doGC);
        setTimeout(lastGC, 40);
    }
}
private function lastGC():void{
    flash.system.System.gc();
}

أعتقد أنك قد أجبت على سؤالك...

System.totalMemory يعطيك إجمالي مقدار الذاكرة بأنها "تستخدم" لا تخصيص.صحيح أن التطبيق الخاص بك قد يكون فقط باستخدام 20mb ، ولكن قد 5mb خالية في المستقبل المخصصات.

أنا لست متأكدا مما إذا كان برنامج Adobe مستندات من شأنها أن تسلط الضوء على الطريقة التي يدير الذاكرة...

للأسف عندما يتعلق الأمر إلى إدارة الذاكرة في فلاش/أكشن ليس هناك الكثير يمكنك القيام به.أكشن صمم ليكون سهل الاستخدام (حتى أنها لا تريد الناس أن لديك ما يدعو للقلق حول إدارة الذاكرة)

التالي هو الحل بدلا من خلق ByteArray متغير محاولة هذا.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

//Then when you are finished delete the variable from byteObject
delete byteObject.byteArray;

حيث byteArray دينامية الملكية من byteObject, يمكنك تحرير الذاكرة التي تم تخصيصها لذلك.

لذا ، إذا كنت تحميل أقول 20MB من الخلية في إدارة المهام من ذاكرة الوصول العشوائي عن تطبيق ترتفع بنحو 25MB.ثم عند إغلاق اتصال ومحاولة التخلص ByteArray, RAM لم يحرر.ومع ذلك ، إذا كنت تستخدم نظام.totalMemory, فلاش بلاير يدل على أن الذاكرة يتم الإفراج عنهم ، الذي ليس هو الحال.

هو مشغل الفلاش تفعل شيئا مثل جافا و حجز مساحة الكومة وليس إطلاقه حتى إنهاء التطبيق?

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

لذا ، إذا كنت تحميل أقول 20MB من الخلية في إدارة المهام من ذاكرة الوصول العشوائي عن تطبيق ترتفع بنحو 25MB.ثم عند إغلاق اتصال ومحاولة التخلص ByteArray, RAM لم يحرر.ومع ذلك ، إذا كنت تستخدم نظام.totalMemory, فلاش بلاير يدل على أن الذاكرة يتم الإفراج عنهم ، الذي ليس هو الحال.

لاعب "الإفراج عن" الذاكرة.إذا قمت بتصغير النافذة استعادته يجب أن نرى أن memeory هو الآن أقرب بكثير إلى ما هو نظام.totalMemory يظهر.

كنت قد تكون مهتمة أيضا في استخدام FlexBuilder التنميط الأدوات التي يمكن أن تظهر لك إذا كان لديك حقا تسرب الذاكرة.

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