یه مشکل پیچیده که داره ورشکستم می کنه

sabersoft

Active Member
سلام
من یه پروژه بزرگ با فلش گرفتم که یه سیستم مانیتورینگ هست یک بخشش اینه که اخبار را از اینترنت می گیره به صورت اسلاید نمایش می ده 2 خبر یکی به صورت افقی و از چپ به راست و دیگری از پایین به بالا حرکت می کنند.
اما هنگام تست متوجه ایراد عجیبی شدم اینکه بعد از حدود یکساعت کارکرد برنامه سرعت پایین میاد و اسلایدها دیگه روان نیستند و به حدی میرسه که گیرشون زیاد میشه نه اینکه آرام حرکت کنند گیر می کنند:-?
هر کاری کردم درست نشد به جای تایمر از فریم ریت EnterFrame استفاده کردم بازهم مشکل پیدا کرد:sad:
حتی تمام جزییات رویدادها مثل پاک کردن به موقع یک رویداد غیر قابل استفاده و استفاده از weakup و ... هم درست به کاربردم اما مشکل سرجاشه
جالبه بعد از یکساعت کار کرد فلش که گیر می کنه اگه یه فلش دیگه(یه کپی از همون برنامه) رو اجرا کنیم سرعتش خوبه!
لطفا کمک کنید
 

JavidFlasher

کاربر فعال
اون موقع performanceسیستمت رو ببین cpu usageبالا رفته یا memory usage!
فکر کنم تو کد زدن اشتباه کری !
سعی کن تو کارت از تایمر و اینتر فریم استفاده نکنی برای توین کردن از tweenMaxاستفاده کن.
 

++Hadi++

Active Member
علت اینه که اشیا یا event ها رو درست پاک نمی کنی یا اینکه از سیستم فریم مووی کلیپ های فلش استفاده می کنید. کلا از فریم های مووی کلیپ استفاده نکنید.به هیچ وجه . در عین حال بعد از removeChild کردم اشیای نمایشی نا لازم و null کردن متغیر های نا لازم ، دستور system.gc رو اجرا کنید که اوا رو از رم بیاره بیرون.
 

sabersoft

Active Member
اون موقع performanceسیستمت رو ببین cpu usageبالا رفته یا memory usage!
فکر کنم تو کد زدن اشتباه کری !
سعی کن تو کارت از تایمر و اینتر فریم استفاده نکنی برای توین کردن از tweenMaxاستفاده کن.

ممنونم
جالبه یه بخشی هست به اسم اطلاعیه ها که با استفاده ازTweenMax نوشتمش اون تنها بخش متحرکیه که گیر نمی کنه

علت اینه که اشیا یا event ها رو درست پاک نمی کنی یا اینکه از سیستم فریم مووی کلیپ های فلش استفاده می کنید. کلا از فریم های مووی کلیپ استفاده نکنید.به هیچ وجه .
ببخشید منظور از فریم های مووی کلیپ این است که مثلا چندتا مووی کلیپ باشند و هرکدام تایم لاین خود را داشته باشند؟این بخش هایی که من برای پروژه گذاشتم هر بخش یک مووی کلیپ است که که فقط یک فریم دارد و تمام کارها در فریم اول آن با استفاده از اکشن اسکریپت انجام می شود، آیا این هم مشکل ساز است؟

یه سوال دیگه اینکه من برای یکی از اسلایدها تصویر خبر را هم کنارش نشان می دهم برای اینکار بعد از لود کردن تصاویر را دریک اسپرایت آنها را همراه خبر حرکت و با کمک یک ماسک نمایش می دهم حالا سوال این است وقتی تصاویر جدید لود می شوند آیا removeChild کردن اسپرایت حاوی آنها و اجرای دستور system.gc کافی است یا باید تک تک تصاویر داخل اسپرایت را removeChild کنم؟
 
آخرین ویرایش:

JavidFlasher

کاربر فعال
به نظرم کار رو اصولی انجام بده . بعد از لود که دیگه نمی خئای ازش استفاده کنی اون شی رو unloadکن بعد آبجکت نگه دارنده رو ریمو کن.اگه دیگه از اون شی استفاده نمی کنی اون رو nullقرار بده بعد اون رو با Garbage colection فلش از روند پردازش بیرون بیار.
ولی باز بهت میگم tweenLiteخیلی بهینه نوشته شده حتما سعی کن از اون استفاده کنی.شاید بگی واسه تکرارش مشکل داشته باشی که اونم توابعی مثل onCompleteو onUpdateداره که میتونی بیشتر روش تسلت داشته باشی.
 
آخرین ویرایش:

sabersoft

Active Member
از راهنماییاتون ممنونم،کمی کد رو اصلاح کردم بهتر شد اما هنوز مشکل داره
این کدش هست اگه ممکنه ببینید ایرادش کجاست:
PHP:
package classes{

    import flash.display.Sprite;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.events.Event;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    import com.greensock.*;
    import com.greensock.easing.*;
    import flash.display.Loader;
    import flash.display.Bitmap;
    import flash.system.System;
    import flash.display.MovieClip;

    public class ONews extends MovieClip {

        var timer:Timer = new Timer(10000);
        var imgArray:Array=new Array();
        var currentImage:uint = 1;
        var galleryData:XML;
        var imageCount:uint = 0;
        var lastGalleyUpdate = 0;
        var currentUpdate = 0;
        var isUpdating = false;
        var t4:Timer = new Timer(300000);
        var galleryLoader:URLLoader;
        var container:Sprite=new Sprite();

        public function ONews() {
            stop();
            galleryLoader = new URLLoader();
            galleryLoader.addEventListener(Event.COMPLETE, onGalleryDataLoaded, false, 0, true);
            t4.addEventListener(TimerEvent.TIMER, resetGallery,false,0,true);
            galleryLoader.load(new URLRequest("./xml/res.xml"));
            
            t4.start();
            timer.addEventListener(TimerEvent.TIMER, onTimer);
            timer.start();
            container.x = 560;
            container.y = 40;
            container.mask = msk;
            addChild(container);
        }

        private function resetGallery(evt:TimerEvent) {
            galleryLoader.load(new URLRequest("./xml/res.xml"));
        }

        private function onGalleryDataLoaded(evt:Event):void {
            var _tmp:XML = new XML(evt.target.data);

            if (lastGalleyUpdate< Number(_tmp.@lastupdate)) {
                galleryData = _tmp;
                imageCount = galleryData.news.length();
                lastGalleyUpdate = Number(galleryData. @ lastupdate);
                if (currentImage!=imageCount) {
                    updateGallery();
                }
            }
            _tmp = null;
            System.gc();

        }

        private function updateGallery() {
            //currentImage=0;
            isUpdating = true;
            //gloading_mc.visible = true;
            for (var j=0; j<container.numChildren; j++) {
                container.removeChild(container.getChildAt(j));
            }
            removeChild(container);
            container=new Sprite();
            container.x = 560;
            container.y = 40;
            container.mask = msk;
            imgArray = null;
            System.gc();
            imgArray=new Array();

            for (var i:uint=0; i<imageCount; i++) {
                var thumb:Thumb=new Thumb();
                thumb.index.visible = false;
                var loader:Loader=new Loader();
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadImage);
                loader.load(new URLRequest("."+galleryData.news[i].thumbnail));
                thumb.addChild(loader);
                thumb.x = thumb.width / 2;
                if (i==0) {
                    thumb.y = thumb.height/2 + (thumb.height)*i;
                }
                else {
                    thumb.y = thumb.height/2 + (thumb.height+10)*i;
                }
                container.addChild(thumb);
                /*thumb.addChild(thumb.index);
                thumb.index.visible = true;*/

                imgArray.push(thumb);
                if (i==imageCount-1) {
                    addChild(container);
                    //gloading_mc.visible = false;
                    isUpdating = false;
                }
            }

            newsContent_mc.newsText_txt.text = galleryData.news[0].text;
            newsContent_mc.newsTitle_txt.text = galleryData.news[0].title;

            currentImage = 1;
            activateImage(0);

        }

        private function onLoadImage(evt:Event) {
            var bmp:Bitmap = Bitmap(evt.target.content);
            bmp.width = 180;
            bmp.height = 130;
            bmp.x = 22;
            bmp.y = 8;
            evt.target.removeEventListener(Event.COMPLETE, onLoadImage);
        }

        private function onTimer(evt:TimerEvent) {

            if (currentImage==imageCount) {
                TweenMax.to(container,0.8,{y:40,ease:Expo.easeInOut});

                newsContent_mc.newsText_txt.text = galleryData.news[0].text;
                newsContent_mc.newsTitle_txt.text = galleryData.news[0].title;

                currentImage = 0;
                activateImage(currentImage);
            }
            else if (currentImage!=imageCount) {
                activateImage(currentImage);
                newsContent_mc.newsText_txt.text = galleryData.news[currentImage].text;
                newsContent_mc.newsTitle_txt.text = galleryData.news[currentImage].title;
            }//TweenMax.from(newsContent_mc.newsText_txt,0.8,{alpha:0});
            //TweenMax.from(newsContent_mc.newsTitle_txt,0.8,{alpha:0});
            currentImage++;

            if (currentImage>=3 && currentImage<imageCount) {
                //var cy=container.y;
                var ny = container.y - 155;
                TweenMax.to(container,0.9,{y:ny,ease:Expo.easeInOut});
            }
        }


        private function activateImage(j:uint) {
            for (var i:uint=0; i<imgArray.length; i++) {
                imgArray[i].index.visible = false;
            }
            imgArray[j].index.visible = true;
        }
    }

}
 

JavidFlasher

کاربر فعال
ممکنه تو اون مدت زمانی xmlشما لود نشده باشه و شما هی دارین از اول لود میکنین.
بهتره تایمر رو جوری بزارین که اگه لود قبلی تموم شده باشه بیاد دوباره لود کنه.
PHP:
private var isLoaded:Boolean//inside class


private function resetGallery(evt:TimerEvent) {
	if(isLoaded){
            galleryLoader.load(new URLRequest("./xml/res.xml"));
	}esle {trace("Error in Loading !")}
        }

        private function onGalleryDataLoaded(evt:Event):void {
            var _tmp:XML = new XML(evt.target.data);
			isLoaded=true
            if (lastGalleyUpdate< Number(_tmp.@lastupdate)) {
                galleryData = _tmp;
                imageCount = galleryData.news.length();
                lastGalleyUpdate = Number(galleryData. @ lastupdate);
                if (currentImage!=imageCount) {
                    updateGallery();
                }
     
       }

            _tmp = null;
            System.gc();

        }
 
آخرین ویرایش:

sabersoft

Active Member
ممکنه تو اون مدت زمانی xmlشما لود نشده باشه و شما هی دارین از اول لود میکنین.
بهتره تایمر رو جوری بزارین که اگه لود قبلی تموم شده باشه بیاد دوباره لود کنه.
PHP:
private var isLoaded:Boolean//inside class


private function resetGallery(evt:TimerEvent) {
    if(isLoaded){
            galleryLoader.load(new URLRequest("./xml/res.xml"));
    }esle {trace("Error in Loading !")}
        }

        private function onGalleryDataLoaded(evt:Event):void {
            var _tmp:XML = new XML(evt.target.data);
            isLoaded=true
            if (lastGalleyUpdate< Number(_tmp.@lastupdate)) {
                galleryData = _tmp;
                imageCount = galleryData.news.length();
                lastGalleyUpdate = Number(galleryData. @ lastupdate);
                if (currentImage!=imageCount) {
                    updateGallery();
                }
     
       }

            _tmp = null;
            System.gc();

        }

فاصله بین لودها 5 دقیقه و حجم فایل xml 4 کیلو بایت هست که بعید می دونم در زمان 5 دقیقه نتونه همه اش رو لود کنه مساله دیگر اینکه اگه لود کامل نشده باشه اصلا کد خطا می ده که من هیچ خطایی را در کد دریافت نمی کنم
فقط مشکل برنامه اینه که بعد حدودا 2 ساعت خیل کند میشه!در صورتی که قراره از 7 صبح تا 8 شب کار کنه:sad:
 

جدیدترین ارسال ها

بالا