خانه » ادوبی ایر » بهینه سازی فلش Cache کردن اشیا

بهینه سازی فلش Cache کردن اشیا

بهینه سازی فلش Cache کردن اشیا

یکی از روش‌های ساده و کارامد برای استفاده بهینه از حافظه سیستم و جلوگیری از هدر رفتن آن، استفاده دوباره از اشیای پیش ساخته و بعبارتی cache کردن اشیا و استفاده مجدد از آنها به جای ایجاد چندباره آنهاست. به دو مثال زیر دقت کنید، در هر دو مثال تعداد زیادی شی از یک کلاس دلخواه، پشت سر هم و برای دفعات طولانی ساخته و به stage اضافه می‌شود و سپس کل اشیا حذف می‌شود و در ادامه مجددا اشیا دوباره به stage اضافه می‌شوند.

مثال اول: بهینه نشده

import flash.system.System;

for (var i:int = 0; i < 313; i++) {
    this.removeChildren();
    for (var j:int = 0; j < 100; j++) {
        var myObject:myCostumObjectClass = new myCostumObjectClass();
        addChild(myObject);
    }
}

مثال دوم: نسخه بهینه شده مثال اول

import flash.system.System;

var chachedObjects:Array = [];

for (var i:int = 0; i < 313; i++) {
    this.removeChildren();
    for (var j:int = 0; j < 100; j++) {
        if (chachedObjects[j] is myCostumObjectClass) {
            addChild(chachedObjects[j]);
        } else {
            var myObject:myCostumObjectClass = new myCostumObjectClass();
            chachedObjects.push(myObject);
        }
    }
}

در مثال اول در هر مرحله بعد از حذف تمامی‌اشیا با دستور removeChildren مجددا اشیای جدید ساخته می‌شوند و به stage اضافه می‌شوند. اما در مثال دوم (بهینه شده) تنها در مرحله اول اشیا ساخته می‌شوند که بعد از ساخته شدن در یک آرایه قرار می‌گیرند، بنابراین در مراحل بعدی بعد از حذف تمامی‌اشیا از stage، اشیای جدید مجددا ساخته نمی‌شوند و از همان اشیای قبلی که در آرایه cache شده اند، استفاده می‌شود (یعنی اشیای cache شده به stage اضافه می‌شوند). خروجی هر دو مثال کاملا با هم مشابه است، اما تفاوت زیادی در استفاده از مموری در این دو مثال وجود دارد که این تفاوت در شکل۱ دیده می‌شود.

caching

شکل۱- مقدار حافظه مصرف شده در هر مرحله بعد از حذف کامل اشیا و اضافه کردن مجدد آنها (خط قرمز: منحنی مثال اول و خط سیاه: مثال بهینه شده).

همانطور که در شکل۱ مشخص است، مقدار مموری مصرف شده در تمامی‌مراحل در مثال بهینه شده، تقریبا ثابت مانده است (خط سیاه)، درحالیکه در مثال اول (بهینه نشده) افزایش شدیدی در طی مراحل مختلف دیده می‌شود که منجر به نوسانی شدن منحنی آن شده است (خط قرمز). علت کاهش مقدار منحنی مصرف شده بعد از افزایش شدید آن در مثال اول به  زمان اجرای Garbage Collection در Flash Player و Air Debugger مربوط می‌شود. لازم به ذکر است که میزان حافظه مصرف شده در هر مرحله توسط کد زیر ثبت شده است:

trace(Number( System.totalMemory / 1024 / 1024 ).toFixed( 2 ), "Mb");

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

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

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

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

21 نظر

  1. سلام.جناب پولادرگ عذرخواهی بابت مزاحمت..
    یه ایمیل فرستادم واستون ممنون میشم چک بفرمایید..
    شهید شی

  2. با سلام و خسته نباشید خدمت آقای پولادرگ!

    ببخشید من یه مشکلی تو نرم افزار فلش سی اس ۶ دارم
    مشکلم اینه که تو قسمت code snippets تکست کد ها رو به هم ریخته نشون میده،قبلا اینجوری نبود!
    ممنون میشم اگه کمکم کنید!

    یه عکس هم گرفتم ازش
    http://upload7.ir/imgs/2014-01/35187760475636260771.jpg

    • سلام
      مشکل از فونت های سیستم شما هست
      فونت مربوطه به بخش اسنیپ ها که این بخش نیز توسط فلش ساخته شده است ، در سیستم شما با فونتی دیگر جا به جا شده است
      و در واقع به طور مثال فونت دیگری روی آن نصب شده که با همان نام بوده
      و این مشکل از آن فونت هست
      با توجه به این که این بخش امکان تنظیم فونت را ندارد می بایست فونت های اضافه و یا جدیدی که نصب کرده اید را حذف کنید

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

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

    واقعا ممنون و خسته نباشید!

  4. سلام و عیدتون مبارک
    ممنون که وقت میزارین و سوالای ما رو جواب میدین
    سعید طاهری هستم – تبریز
    چند وقتیه که با فلش اکشن اسکریپت ۳ آشنا شدم و خیلی علاقمند هستم که وقت بزارم و همه زیر و بمشو یاد بگیرم
    با اجازه شما بازی matching game رو با نرم افزار sothink swf decompiler بازش کردم وقتی داشتم کداتونو تجزیه تحلیل میکردم رسیدم به این قسمت
    public var playAgain:SimpleButton;
    خواهشم اینه که بفرمائین چرا این متغیر رو به صورت پابلیک تعریف کردین در حالیکه بقیه متغیر ها به صورت پرایوت هستند. ممنون

    • سلام

      کلا public برای متغیر های عمومی استفاده می شود و به شما این امکان را می دهد که در کلاس ها دیگر که از این کلاس ارث می برند شی مربوطه را ویرایش کرده و مقدار آن را تغییر دهید

      سال نوی شما هم مبارک باشد
      موفق و پیروز باشید

  5. ممنون
    تو همون بازی یه کد گذاشته بودین توی تابع اصلی کلاس:
    addFrameScript(0, this.frame1, 1, this.frame2, 2, this.frame3);
    من این کد رو حذفش کردم برنامه بازم کار کرد بدون اشکال هر چقدر هم توی ایندکس اکشن اسکریپت دنبال این تابع گشتم چیزی پیدا نکردم لطف می کنید بفرمائید که این تابع رو کجای بازی تعریف کریدن؟ چون هرچی گشتم چیزی پیدا نکردم
    public function MatchingGame1() : void
    {
    this.cardlist = new Array();
    this.okSound = new ok();
    this.yesSound = new yes();
    addFrameScript(0, this.frame1, 1, this.frame2, 2, this.frame3);
    return;
    }// end function

  6. خیلی خیلی ممنون پس اگه من دنبال لیست توابع از پیش تعریف شده اکشن اسکریپت بگردم میتونم همشونو توی نت پیدا کنم؟

  7. var _loc_3:* = 0;
    var _loc_4:* = null;
    var _loc_5:* = 0;
    var _loc_1:* = 0;
    این متغیر ها بصورت ستاره دار تعریف شدن یعنی تایپشون رو از نوع ستاره قرار دادین . میخواستم بدونم منظورتون از تعریف متغیر های ستاره دار توی بازی مچینگ گیم چی بوده. همچنین چرا یکی از متغیر ها رو مقدار نال دادین (var _loc_4:* = null;)خیلی ممنون میشم این قسمت رو کمی با جزئیات توضیح بفرمایین.

    • سلام
      این ها توی دیکامپایل شما به ستاره تبدیل شده است در پروژه اصلی هر کدام نوع داده مربوطه به خودشان را دارند حال عددی یا رشته متنی و…
      ستاره یعنی نوع داده فرقی ندارد و می تواند هر چیزی باشد
      نال هم مقدار خالی برای متغییر هست و در برخی موارد برای خالی کردن متغییر استفاده می شود
      موفق و پیروز باشید

  8. سلام
    ببخشین سوالمو اینجا میپرسم
    چ کنم ک در اکشن اسکریپت متن فارسی درست نشون بده؟

  9. سلام
    آقای پولادرگ متاسفانه نرم افزار هایی مثل فلش دیکامپایلر با اینکه فایل فلش رو دیکامپایل می کنند اما نمی تونند کدی که برنامه نویس با سلیقه خودش نوشته رو واقعا برگردونن و دلیلش هم که حتما شما استحضار دارین تکنیکی هست با عنوان Obfuscation یا مبهم سازی کد که با نرم افزار های خاصی انجام میشه تا امنیت سورس برنامه رو ببره بالا .میخواستم بپرسم منبع با ارزشی سراغ دارین که فایل های غیر رمز شده رو رایگان برا دانلود بزاره تا دیکامپایلش کنیم چون از این فایل های مبهم سازی شده هیچی قابل فهم نیست. ممنون

  10. منظورم این هستش که سورسبازی مچینگ گیم که نوشتین رو هیچ ابزاری نیست که بشه باهاش عین کدیرو که شما نوشتین نشون بده؟

    • سلام
      خیر ابزاری برای نمایش کد اصلی وجود ندارد زیرا کد اصلی کامپایل شده است و طبیعتا خود کد با کیفت و خصوصیات آن توسط دیکامپایلر ها قابل استخراج نیست و در ضمن دیکامپایلر ها متغیر ها خودشان نام گزاری می کنند و در این کار هم دقت بالایی نداشته و خطاهایی نیز دارند و حتی در بخش های از کد آن را به درستی پردازش نمی کنند و کدی غلط ایجاد می کنند
      حال می بایست با توجه به دانشی که در اکشن اسکریپت کسب می کنید و تکنیک های آن کد را نوشته یا اصلاح کنید
      در آینده انشاالله مجموعه آموزشی تصویری فلش به صورت پکیج ارائه خواهم داد که آموزش هایی در زمینه دیکامپایل نیز در آن خواهد بود که بسیار کار گشا خواهد بود و به موارد آموزشی دیگر نیز خواهم پرداخت
      موفق و پیروز باشید

  11. سلام آقای پولادرگ
    من میخوام در کارم تاریخ نشون داده بشه.برای اینکه با تغییر تاریخ سیستم تاریخ نمایش داده شده هم تغییر کنه از
    function updateTimer():Void {
    var intervalID:Number = setInterval(updateTimer, 2000);
    استفاده می کنم که مثلا هر دوثانیه newDate رو اجرا کنه. به همین دلیل یک مقداری سی پی یو سیستم درگیر میشه . میخواستم بدونم روش بهتری وجود نداره؟

    • سلام

      رویدادی برای تغییر تاریخ سیستم عامل وجود ندارد که بتوانید توسط آن دستگیره ای برای این مورد ایجاد کنید

      تنها راه استفاده از یک بازه زمانی برای تست هست که طبیعتا کارایی را کاهش می دهد می توانید زمان را بیشتر کنید و از تابع Timer به جای interval استفاده کنید

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

ارسال جواب

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

*

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