بهینه‌سازی (۲) – ترتیب‌دهی کدهای زمانبر

شروع موضوع توسط yaa110 ‏24 جولای 2013 در انجمن برنامه فلش Flash

کلمات کلیدی:
  1. yaa110

    yaa110 کاربر فعال

    ارسال‌ها:
    206
    تشکر شده:
    507
    امتیاز دستاورد:
    16
    در بخش اول از مجموعه بهینه سازی به آموزش روش "اجرای غیرهمزمان حلقه" به منظور بهبود کارایی اپلیکیشن توسعه یافته با AS3.0 و Air پرداخته شد. در این بخش که بخش دوم از مجموعه بهینه سازی است به آموزش روش "ترتیب دهی کدهای زمانبر" می پردازیم. در این روش سعی می کنیم مجموعه ای از عملیات های طولانی را به صورت تک تک در حلقه های فریم مجزا اجرا کنیم تا از اجرای چند عملیات زمانبر در یک حلقه فریم جلوگیری شود.


    • راه حل 1: استفاده از یک آرایه
    در این تکنیک ابتدا آرایه ای از عملیات های زمانبر که هر کدام با یک تابع مشخص می شوند، تهیه می کنیم و سپس به کمک تعریف Listener برای رویداد enterFrame پردازش کدهای زمانبر را کنترل می کنیم. به مثال زیر دقت کنید:

    [درصورتیکه کدها درست دیده نمی شوند، به وبسایت منبع مراجعه کنید.]

    کد (Text):
    import flash.events.Event;


    var savedIndex:int = 0;
    var sequence:Array = [process1(), process2(), process3()];


    addEventListener(Event.ENTER_FRAME, onEnterFrame);


    function onEnterFrame(e:Event):void {
        sequence[savedIndex];
        if (savedIndex == sequence.length - 1) {
            trace("Finished.");
            removeEventListener(Event.ENTER_FRAME, onEnterFrame);
        } else {
            savedIndex += 1;
        }
    }


    function process1():void {
        trace("Time consuming process 1 ...");
    }


    function process2():void {
        trace("Time consuming process 2 ...");
    }


    function process3():void {
        trace("Time consuming process 3 ...");
    }


    با توجه به اینکه رویداد enterFrame تنها یکبار در فاز اول حلقه فریم اجرا می شود، بنابراین در هر حلقه تنها یکی از توابع حاوی کدهای زمانبر اجرا خواهد شد. تعداد توابع و مشخص کردن کدهایی که در هر مرحله باید پردازش شوند، توسط تجربه توسعه دهنده و با سعی و خطا تعیین می شوند.


    • راه حل 2: استفاده از توالی مرحله ای
    در این تکنیک، برخلاف تکنیک قبل نیازی به آرایه و متغیر شمارنده savedIndex نداریم، بلکه به جای آن در آخر تابعی که پردازش می شود، تابع بعدی مشخص خواهد شد.

    [درصورتیکه کدها درست دیده نمی شوند، به وبسایت منبع مراجعه کنید.]

    کد (Text):
    import flash.events.Event;


    var nextProcess:String = "process1";


    addEventListener(Event.ENTER_FRAME, onEnterFrame);


    function onEnterFrame(e:Event):void {
        if (nextProcess != null) {
            this[nextProcess]();
        } else {
            removeEventListener(Event.ENTER_FRAME, onEnterFrame);
            trace("Finished.");
        }
    }


    function process1():void {
        trace("Time consuming process 1 ...");
        nextProcess = "process2";
    }


    function process2():void {
        trace("Time consuming process 2 ...");
        nextProcess = "process3";
    }


    function process3():void {
        trace("Time consuming process 3 ...");
        nextProcess = null;
    }


    ویژگی راه حل 2 نسبت به راه حل 1 این است که به متغیرهای کمتری برای انجام عملیات پردازش کد نیاز است، به طوری که به جای دو متغیر آرایه و شمارنده، تنها از یک متغیر String استفاده شده است.

    توجه: درصورتیکه با مفاهیم مربوط به تعداد فاز در هر فریم و سایر اصطلاحات آشنا نیستید، بخش اول از مجموعه بهینه سازی را مطالعه کنید.

    منبع: http://flashcenter.ir/fa/1392/05/02/بهینه-سازی-2-ترتیبدهی-کدهای-زمانبر/
     
    آخرین ویرایش: ‏24 جولای 2013
    نوشته شده توسط yaa110 در ‏24 جولای 2013
    r.miri19 و ++Hadi++ از این پست تشکر کرده اند.

به اشتراک بگذارید