خانه » ادوبی ایر » بهینه سازی فلش – unloadAndStop در فلش پلیر ۱۰

بهینه سازی فلش – unloadAndStop در فلش پلیر ۱۰

بهینه سازی در فلش یک اصل مهم به حساب می آید و افزایش و کار بر روی آن برای توسعه دهندگان فلش امری الزامی است. به عنوان یک توسعه دهنده فلش و به عنوان کسی که برای آینده این نرم افزار بزرگ احساس مسئولیت می کند ، ما وظیفه داریم در ساخت عناصر فلش که کارایی بهتری دارند پیش گام باشیم و همواره بهترین و بهینه ترین روش را استفاده کنیم. در این مجموعه آموزشی بهینه سازی فلش به نکات مهم برای مدیریت بر عناصر و حافظه ها … می پردازیم و تلاش می کنیم که بتوانیم با استفاده از نکات ارائه شده خروجی بهینه تر و سبک تری از پروژه فلش خود داشته باشیم.

بخش ششم – unloadAndStop در فلش پلیر ۱۰

متد unloadAndStop در پاسخ به چالش های پیش روی توسعه دهندگان اکشن اسکریپت برای توقف محتوای swf بارگزاری شده و حذف آن از حافظه (Memory) ، به اکشن اسکریپت در فلش پلیر ۱۰ افزوده شد.

البته این مورد افزوده شده را نمی توان مانند گلوله ای جادویی برای حل همه مشکلاتی که در این زمینه وجود دارد دانست! ، برای روشن شدن بیشتر توضیح می دهیم که این مورد چه کاری انجام می دهد ، در مرحله اول این متد تلاش می کند محتوای بارگزاری شده را برای جمع آوری آماده کند ، و در مرحله بعد به جمع آورنده زباله (Garbage Collector) که می بایست عملیات جمع آوری زباله را انجام دهد ارجاع می شود. شما می توانید از مرحله دوم (که همان جمع آوری زباله gc می باشد)  با دادن مقدار false به عنوان آرگمان اول متد ، جلوگیری به عمل آورید.

با استفاده از این متد دریافت فایل swf باقی مانده در حافظه ساده می باشد ، اما انجام این کار به صورت تصادفی خیلی دشوار تر می باشد.

در زیر به فهرستی از مواردی که unloadAndStop آنها را برای فایل های swf بارگزاری شده آماده می کند را مشاهده می کنید :

* ایست کردن تمامی MovieClip ها
* ایست کردن تمامی صداهای در حال پخش و Stream (پخش در جریان)
* ایست و حذف همه تایمر (Timer) های استفاده شده
* حذف همه شنونده های رویداد عمومی ، برای enterFrame , exitFrame , frameconstructed , activeate , deactivate
* حدف همه شنونده های مربوطه به  stage که توسط فرزند (child) ایجاده شده است
* بستن همه NetConnection ها و NetStream ها (Video.attachNetStream/attachCamera(0) – Microphone.setLoopback(0))
* حدف فونت های AS3 از جدول فونت های عمومی
* ایست ؛ socket ها ، xmlsocket ها ،دانلودهای filerefrence ، و دیگر اشاء مربوطه به دانلود (grandchildren (سطح نوه والد) ) و…
* آزاد کردن bitmap های در ارتباط با cacheAsBitmap و filterها و…

تذکر : تمامی موارد بالا به صورت بازگشتی اجرا می شوند ، به طوری که این موارد به هر یک از فرزندان تو در تو (nested) و فایل های swf بارگزاری شده در آن ها ، نیز اعمال می شود.

حال به مثالی در این زمینه می پردازیم :


var loader:Loader = new Loader();

loader.load( new URLRequest ( "sample_content.swf" ) );

addChild( loader );

stage.addEventListener( MouseEvent.CLICK, unloadSWF );

function unloadSWF( e:MouseEvent ):void
{
	//unloadAndStop استفاده از متد
	loader.unloadAndStop();
}

در کد بالا ابتدا یک شی Loader ساخته می شود و فایل نمونه آزمایشی ما را با نام sample_content.swf را بارگزاری می کند و سپس شی به DisplayObject افزوده (addChild) می شود.

در مرحله بعد با رویدادی که برای کلیک موس در stage در این مثال ایجاد می کنیم در زمان کلیک تابع unloadSWF را فراخوانی می کنیم

در این تابع با استفاده از متد unloadAndStop عمل unload را انجام می دهیم.

موفق و پیروز باشید.

Print Friendly
تگ ها :
پیوند مطلب قبلی
پیوند مطلب بعدی

درباره بهروز پولادرگ

متولد : ۵ مرداد سال ۱۳۶۷ ، حرفه : ادوبی فلش ، برنامه نویسی و طراحی وب ، طراحی گرافیک ، مالتی مدیا ، نرم افزار های تحت وب

14 نظر

  1. سلام بهروز جان

    امیدوارم که خوب و خوش وخرم باشی. دوست عزیز من یه سوال خیلی خیلی مهم دارم از حضورت. همونطور که در جریانی، زمانی که در فلش CS5 با استفاده از actionscript 3 یک پروژه فلش طراحی می کنیم و در اون از فونت های فارسی استفاده می کنیم (مشکل بنده در فارسی نویسی نیست اشتباه نشه!) در سیستم ما به طور کاملا صحیح نشون داده میشه اما اگر این بنر یا هر چیز دیگه ای رو توی وبسایت خودمون قرار می دیم و اگر طرف مقابل که از وبسایت ما بازدید میکنه، اون فونتی رو که در پروژه فلشمون استفاده کردیم نداشته باشه اونوقت اون طرف پروژه ما رو با یک فونت دیگه می بینه! می خواستم ببینم آیا راهی داره که اشخاصی هم که اون فونت ها رو در سیستم خودشون ندارن بتونن پروژه ما رو با همون فونت های اصلی ببینن؟

    ممنون می شم جوابم رو بدی کارم خیلی گیره. راستی برای دیدن نمونه مشکل هم می تونی به سایتم مراجعه کنی بالای سایتم دو تا بنر فلش هست.

    موفق و موید باشی

    • سلام مهرشاد عزیز
      شما در صورتی که از classic text استفاده می کنید و مثلا فارسی نویس های ساده تنها کافیست که متن را به صورت static قرار دهید.
      در صورتی که شما از dynamic text و یا TLF استفاده کنید می بایست فونت مورد نظر خود را embed کنید. البته اگر از TLF استفاده نمی کنید بهتر هست که از متن به صورت static استفاده کنید ولی اگر از TLF استفاده می کنید در بخش embed رفته و تیک مربوطه به همه کاراکتر ها را بزنید
      با این کار همه کاراکتر های مربوطه به پروژه شما افزوده می شود و کاربر در صورتی که فونت را هم نداشته باشد مشکلی نخواهد داشت
      توجه داشته باشید در صورتی که فونت جدید برای متن جدیدی قرار دهید می بایست آن را نیز Embed کتید

      موفق و پیروز باشید

      • خیلی ممنون بهروز جان. فقط یه سوا داشتم. شما چرا یه دی وی دی حرفه ای از این نکات مهم برای ساخت فلش نمی زنی تا ما طراحا بتونیم ازش استفاده کنیم؟ بنده خودم اولین نفریم که این آموزش رو تهیه می کنم چون خداییش تو کارت استادی. بازم یه دنیا ممنون

  2. سلام

    این دستور unloadandstop تو cs3 جواب نمیده

    من ۱ مشکل دارم تو unload که بعد unload حافظه پاک نمیشه

    میتونی ۱ راهنمایی کنی

    • این دستور در فلش پلیر ۱۰ ارائه شده است ، می بایست اکشن اسکریپت ۳ و فلش پلیر ۱۰ را انتخاب نمایید
      بهتر هست برای این کار از نسخه جدید برنامه فلش CS5 استفاده کنید

      توجه داشته باشید خروجی شما نیز به صورت فلش پلیر ۱۰ خواهد بود و به طبع کاربر مشاهده کننده هم می بایست این نسخه یا نسخه بالاتر فلش پلیر را داشته باشد.

      در مورد برای پاکسازی حافظه شما می توانید رویدادهای مربوطه را حذف کنید و در نهایت متغیر مربوطه را برابر با null قرار دهید ، در سری مقالات بهینه سازی در این باره توضیح داده ام.

      موفق و پیروز باشید

      • راهی نیست با فلش cs3 فایل رو unload کرد و از حافظه پاک کرد ؟؟؟

        • کدم رو اگه ممکنه ۱ نگاه بکن

          //import flash.display.Loader;
          var up:String = "step1";
          var myLoader:Loader = new Loader(); 
          
          
          function loadstep(st)
          {
          	
          	bk.gotoAndStop(st);
          	var url:URLRequest = new URLRequest("step/"+st+".swf"); 
          	step.addChild(myLoader); 
          	myLoader.load(url);	
          	
          }
          
          function unloadstep(st)
          {
          	//myLoader.unloadAndStop(true/*default pos*/);
          	step.removeChild(myLoader);
          	myLoader.unload();
          	//step = null;
          
          
          	loadstep(st)
          }
          
          
          
          loadstep(up);
          
          

          چی رو باید null کنم ؟؟

          stage که lمقدار null نمی گیره

        • myLoader = null;
          

          البته توجه داشته باشید این مورد مانند unloadAndStop نیست و به همین دلیل هست که برای رفع این مشکل در فلش پلیر ۱۰ این فرمان معرفی شد تا راه حلی برای توسعه دهندگان باشد.
          موفق و پیروز باشید.

  3. ۱ سوال دیگه دارم

    میخوام ۱ متغیر رو در root از ۱ کلیپ مقدار دهی کنم

    مثلا برای اجرای ۱ متود مثل stop از این کد moviclip(root) . mc.play()

    برای متغیر چی کار کنم ؟؟

    • سلام
      می توانید یک تابع در محل تایم راین ایجاد کنید و آن در را در محل مورد نظر فراخوانی کنید
      مسیر دهی را هم هر وقت برایتان سخت بود می توانید از دکمه target در بخش اکشن کمک بگیرید
      موفق و پیروز باشید

  4. با عرض سلام و تشکر فراوان برای آموزهای عالی شما

    من یک سوال داشتم الان من با این کد یک swf رو فراخوانی میکنم

    حالا کد شما رو چطور باید به این اضافه کنم که با کلیک روی جایی غیر از خود swf

    اون رو آنلود کنه چون کد شما واقعا عالی عمل میکنه ولی من نمیخوام همین که وارد صفحه شد

    swf شروع به پخش کنه و میخوام با زدن دکمه quiz_btn پخش بشه و سپس با کد شما قطع بشه

    انشاءالله سربلند باشید

    quiz_btn.addEventListener(MouseEvent.CLICK, fl_ClickToLoadUnloadSWF);

    var fl_Loader:Loader;

    //This variable keeps track of whether you want to load or unload the SWF
    var fl_ToLoad:Boolean = true;

    function fl_ClickToLoadUnloadSWF(event:MouseEvent):void
    {
    if(fl_ToLoad)
    {
    fl_Loader = new Loader();
    fl_Loader.load(new URLRequest(“quiz.swf”));
    addChild(fl_Loader);
    quiz_btn.x=0;
    quiz_btn.y=0;
    }
    else
    {
    fl_Loader.unload();
    removeChild(fl_Loader);
    fl_Loader = null;

    quiz_btn.x=100;
    quiz_btn.y=100;
    }
    fl_ToLoad = !fl_ToLoad;
    }

  5. سلام
    من برای پروژه ام چندتا مووی کلیپ ساختم( برای منو ها) و با دستور addChild() به استیج اضافه شون می کنم و با دستور
    stage.addEventlistener(MouseEvent.MOUSE_UP,….
    با چندتا دستور شرطی if , else if
    و با دستور
    removeChild()
    با این دستور برشون می دارم اما مشکلی که پیش اومده کند شدن رندرینگه. ولی تو فایل نهایی برنامه مشکلی نداره اما موقع کامپایل خیلی کند شده به نظرتون چیکارش کنم

    • سلام

      این موارد می تواند دلایل زیادی داشته باشد
      در کل وقتی یک پروژه همه المان های آن در قالب یک فایل اجرا شود ممکن هست این مشکلات که سرعت پایین کامپایل هست به وجود آید

      بهترین کار برای پروژه های بزرگ بخش بخش کردن آنها ست و با این که شما مثلا بخش خبر را در قالب یک فایل دیگر ایجاد می کنید و در زمان لازم در پروژه اصلی خود لود می کنید

      این کار هم سرعت کامپایل را بالا می برد و هم سرعت اجرای کلی پروژه.

      و برای رفع اشکال پروژه و تست هر بخش هم بسیار کار راحت تر می شود

      موفق و پیروز باشید

ارسال جواب

آدرس رایانامه شما منتشر نخواهد شد.فیلد های اجباری علامت گزاری شده اند *

*

رفتن به بالای صفحه