خانه » ادوبی ایر » بهینه سازی فلش – انجماد اشیاء

بهینه سازی فلش – انجماد اشیاء

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

بخش هفتم – انجماد (ثابت کردن) اشیاء و آزاد کردن اشیاء

برای بهینه سازی کد خود ، سعی کنید همیشه ازثابت کردن (Freeze) و آزاد کردن (Unfreeze) اشیاء استفاده کنید. این موارد برای همه اشیاء مهم هستند ، اما به صورت ویژه برای Display Object ها مهم هستند. حتی اگر شی نمایشی (Display Object) مدت زیادی در لیست نمایشی (Display List) نباشد و در انتظار جمع آوری زباله (Garbage collection) باشد ، این اشیاء می توانند هنوز حافظه و  CPU را درگیر خود کنند.

برای مثال ، ما می توانید با استفاده از Event.ENTER_FRAME رویدادی کیبورد را کنترل کنید ، در نتیجه شما امکان freeze کردن و unfreeze کردن را با رویداد های Event.REMOVE_FROM_STAGE و Event.ADDED_TO_STAGE در اختیار دارید.

مثال زیر نمونه این کار را در قالب Movie Clip ی که در حال پخش در stage هست و با کنترلر کیبورد در تعامل می باشد ، را مشاهده می کنید :


// تعریف رویداد های کیبورد

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyIsDown);

stage.addEventListener(KeyboardEvent.KEY_UP, keyIsUp);

// ساخت یک شی برای ذخیره کردن کلید تعیین شده

var keys:Dictionary = new Dictionary(true);

function keyIsDown(e:KeyboardEvent):void
{

	// به یاد داشتن کلیدی که فشرده شده است

	keys[e.keyCode] = true;

	if (e.keyCode == Keyboard.LEFT || e.keyCode == Keyboard.RIGHT)
	{

		runningBoy.play();

	}

}

function keyIsUp(e:KeyboardEvent):void
{

	// به یاد داشتن کلیدی که بعد از فشرده شدن رها شده است

	keys[e.keyCode] = false;

	for each (var value:Boolean in keys)
	{

		if (value)
		{
			return;
		}
	}

	runningBoy.stop();

}

runningBoy.addEventListener(Event.ENTER_FRAME, handleMovement);

runningBoy.stop();

var currentState:Number = runningBoy.scaleX;

var speed:Number = 15;

function handleMovement(e:Event):void
{

	if (keys[Keyboard.RIGHT])
	{

		e.currentTarget.x +=  speed;

		e.currentTarget.scaleX = currentState;

	}
	else if (keys[Keyboard.LEFT])
	{

		e.currentTarget.x -=  speed;

		e.currentTarget.scaleX =  -  currentState;

	}

}

زمانی که روی دکمه مربوطه به حذف با نام  removeBtn کلیک شود ، Movie Clip از لیست نمایش (Display List) حذف می شود:


// نمایش یا حذف مووی کلیپ توسط رویداد های دکمه های مربوطه

showBtn.addEventListener(MouseEvent.CLICK,showIt);

removeBtn.addEventListener(MouseEvent.CLICK,removeIt);

function showIt(e:MouseEvent):void
{

	addChild(runningBoy);

}

function removeIt(e:MouseEvent):void
{

	// حذف مووی کلیپ در صورتی موجود بودن

	if (contains(runningBoy))
	{
		removeChild(runningBoy);
	}

}

زمانی که Movie Clip از لیست نمایش حذف می شود ، Movie Clip هنوز رویداد Event.ENTER_FRAME را ارسال می کند. Movie Clip اجرا می شود ولی رندر (Render) نمی شود. برای ایجاد دستگیره به این وضعیت به صورت درست ، می بایست رویداد های دیگری را برای حذف تعریف کنیم ، برای پیش گیری از فشاری که این مساله به CPU وارد می آورد :


// Listen to Event.ADDED_TO_STAGE and Event.REMOVED_FROM_STAGE

runningBoy.addEventListener(Event.ADDED_TO_STAGE,activate);

runningBoy.addEventListener(Event.REMOVED_FROM_STAGE,deactivate);

function activate(e:Event):void
{

	// باز نشانی همه چیز

	e.currentTarget.addEventListener(Event.ENTER_FRAME,handleMovement);

}

function deactivate(e:Event):void
{

	//فریز کردین مووی کلیپ برای داشتن کمترین مصرف از سی پی یو در حالتی که مووی کلیپ حذف شده است

	e.currentTarget.removeEventListener(Event.ENTER_FRAME,handleMovement);

	e.currentTarget.stop();

}

زمانی که دوباره روی دکمه showBtn کلیک می شود ، Movie Clip باز نشانی می شود و رویداد Event.ENTER_FRAME دوباره به آن داده می شود ، و کیبورد به صورت درست باز هم امکان کنترل Movie Clip را دارد.

نکته : اگر شی نمایشی از لیست نمایش حذف شده است ،به مرجع آن مقدار null (تهی) بدهید تا اطمینان داشته باشید که شی freeze شده است. اگر جمع آورنده زباله (garbage collector) اجرا نشود ، شی همچنان به مصرف حافظه و پردازش CPU ادامه می دهد، حتی اگر شی نمایش داده نشود.

برای اطمینان از این که شی کمترین مصرف حافظه و پردازش CPU را دارد ، می بایست زمانی که شی از لیست نمایش حذف می شود ، کاملا freeze شده باشد.

از نسخه ۱۰ فلش پلیر ، در صورتی که پخش کننده اصلی در فریم ها به فریم خالی برسد ، شی نمایشی به صورت خودکار freeze می شود، حتی اگر شما هیچ کاری برای انجماد (freeze) کردن اشیاء انجام ندهید.

مفهوم انجماد در هنگام بارگزاری از دور(یا خارج) توسط کلاس Loader نیز مهم می باشد. زمانی که از کلاس Loader توسط فلش پلیر ۹ استفاده می کنید ، نیاز هست که به صورت دستی محتوا را در زمانی که رویداد Event.UNLOAD توسط شی LoaderInfo ارسال می شود freeze کنید. هر شی ی می بایست به صورت دستی freeze شود ، که کار سخت و بیهوده می باشد.

فلش پلیر ۱۰ متدی جدیدی برای کلاس Loader با نام unloadAndStop() معرفی کرده است. که این متد به شما این امکان را می دهد که فایل swf در زمان unload به صورت خودکار تمامی اشیاء بارگزاری شده را  freeze کند و فلش پلیر را مجبور به اجرای جمع آورنده زباله (garbage collection) بعد از عمل freeze کند.

در کد زیر یک فایل SWF توسط متد unload() بعد از بارگزاری شدن unload می شود ، که نیاز به پردازش بیشتر و freeze دستی دارد :


var loader:Loader = new Loader();

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

addChild( loader );

stage.addEventListener( MouseEvent.CLICK, unloadSWF );

function unloadSWF( e:MouseEvent ):void
{

	// Unload the SWF file with no automatic object deactivation

	// All deactivation must be processed manually

	loader.unload();

}

بهترین راه استفاده از متد unloadAndStop() ، که یک دستگیره بومی برای اجبار جمع آوری زباله در روند اجرا ایجاد می کند ، می باشد:


var loader:Loader = new Loader();

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

addChild( loader );

stage.addEventListener( MouseEvent.CLICK, unloadSWF );

function unloadSWF( e:MouseEvent ):void
{

	// Unload the SWF file with automatic object deactivation

	// All deactivation is handled automatically

	loader.unloadAndStop();

}

در زیر به فهرستی از مواردی که 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ها و…

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

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

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

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

21 نظر

  1. سلام، مثل همیشه عالی بود. مولا یارتون

  2. سلام بهروز جان، در مورد مسئله cs5.5 که فرمودید باید تاریخ سیستم را عقب بکشید و بعد سریال را وارد کنید.

  3. سلام دوست عزیز من یک مشکل دارم لطفا مرا راهنمایی کنید.من فلش پلیر ورژن ۹ رادانلود کرده وان را نصب کرده ام ولی هنوز سیستم فایلهای فلش رابافلش پلیر ۸ باز میکند.چکار باید بکنم که فایلها بافلش پلیر ورژن جدید باز شود؟

    • سلام دوست گرامی
      شما می بایست فلش پلیر Standalone که یگ فایل exe هست را دانلود کنید و یک بار آن را روی سیستم خود اجرا کنید (اجرا باعث فعال شدن فلش پلیر برای فایل های روی سیستم شما می شود).
      برای مرورگرها می بایست فلش پلیر مخصوص آنها را دانلود کنید
      انشاء الله مساله حل می شود
      موفق و پیروز باشید

  4. سلام، در فلش CS5.5 وقتی Align مربوط به tlfTextField را به سمت راست منتقل می کنیم به هم میریزه و محدوده ای که به کلیک حساس میشه جا به جا میشه … این مشکل را داشتید؟ راه حلی دارید؟

    • سلام
      بنده این مورد را تست کردم و با تغییر Align به چپ و راست هیچ مشکلی پیش نیامد و محدوده لینک درون متن به درستی عمل می کرد.
      تنظیمات مربوطه به راست به چپ و زبان فارسی را در دو بخش موجود در properties انجام داده اید؟

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

      • ممنون که وقت گذاشتید، متاسفانه در حالت Editable این مشکل به وجود میاد، ممکنه مشکل از فلشی که نصب کردم باشه. باز هم ممنون

        • بنده هم با حالت ساده و هم selectable تست کردم و مشکلی نبود
          محتوای شما به صورت پویا و از فایل HTML هست یا به صورت مستقیم وارد می کنید؟
          شاید از تگ های اضافی و یا کدهایی HTML مشکل دار استفاده شده باشد.

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

        • اصلا به فیلد ورودی نمیدم، وقتی فیلد را راست چین می کنم و در حالت Editable قرار میدم، کاربر برای اینکه بتونه متن وارد کنه باید در سمت راست فیلد (بیرون از فیلد) کلیک کنه تا فیلد فعال بشه. هم در حالت rtl و هم در حالت ltr این مشکل وجود داره.

  5. سلام و خسته نباشید .
    من یه مشکلی توی فتوشاپ ، برای طراحی بنر سایت دارم
    توی یه سایت حجم پایین و کیفیت تصویر در بنر خیلی مهمه
    و من توی این مسئله مشکل دارم
    با save for web & device هم این کارو امتحان کردم
    ولی وقتی حجم میاد پایین ، کیفیت به طرز وحشتناکی بهم میریزه
    خواهش میکنم کمکم کنید کارم خیلی لنگه
    ممنونم

    • سلام
      بنر خود را با کیفیت بالا یا متوسط خروجی بگیرید و سپس از برنامه های gif compressor برای فشرده سازی فایل خود و رسیدن به حجم و کیفیت قابل قبول استفاده کنید
      برنامه های فشرده کننده و کاهش دهنده حجم فایل های gif زیاد هستند می توانید نمونه های مختلف را جستجو کرده و تست نمایید
      موفق و پیروز باشید

  6. سلام من یک سی دی آموزشی درست کردم در قسمت محتوای آموزشی سی دی به جای اینکه متنها را فرم به فرم بذارم آنها را تبدیل به movie clip کردم بعد با دستور switch و تعریف متغیر عمومی برای هر دکمه ای که تعداد صفحات آن از یک صفحه بیشتر بود استفاده کردم آیا این کار من درست است و روی حافظه تاثیر بدی ندارد میشه یکم راهنماییم کنید چون تاحالا با فلش کار نکردم و چیزی زیادی از آن نمی دونم
    تشکر

    • سلام
      کلا از سرعت برای شما مهم هست متن ها به Bitmap یا همان تصویر تبدیل کنید و بعد می توانید آنها را به صورت MovieClip استفاده کنید و در سرعت تاثیر بدی ندارد ولی وکتور و shape کلا افت سرعت ایجاد می کند به خصوص در صورتی ایجاد انیمیت در MovieClip شما….
      در صورتی که وکتور بودن برای شما الزامی است بهتر هست از TextFilde استفاده نمایید
      موفق و پیروز باشید

  7. باسلام و عرض خسته نباشید.من از فایل هایی فلش به صورت exeخروجی میگیرم ولی مشکلی که دارم اینه که خروجیResizeمیشه و کاربرمیتونه پنجره فلش پلایرشو هراندازه که خواست تغییر بده واسه اینکه این قابلیت غیرفعال باشه و خروجی مثلا فقط ۸۰۰*۶۰۰باشه چیکارکنم؟؟

    • سلام
      شما این امکان را به صورت عادی ندارید
      شما می توانید توسط برنامه هایی مثل MDM Zinc و یا mProjector استفاده کنید این برنامه ها این امکان و ده ها امکان دیگر برای شما ایجاد می کند
      موفق و پیروز باشید

  8. سلام
    برای رفتن به فریمی خاص در مووی کلیپی که لود شده , در اکشن ۳ راهی به ذهنتون می رسه ؟
    مثلا به فریم ۲۰ بره . و یا اینکه چطور stop بشه بدون اینکه unload اش کنیم؟
    ;()mc.stop هم جواب نمیده.
    این هم بخشی از کد:

    ;var L = new Loader
    ;(“L.load(new URLRequest(“filename.swf
    ;(addChild(L
    ;(L.gotoAndPlay(20

    که خط آخر جواب نمیده . یعنی لود میشه اما از فریم اول شروع به اجرا می کنه .
    برنامه اینطور نوشته شده که با زدن کلیدی به فریم ۲۰ این مووی کلیپ بره و اجراش کنه . اگه یه مقاله کامل هم تو این زمینه سراغ دارید خوشحال میشم معرفی کنید .

    ممنونم

ارسال جواب

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

*

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