بهینه‌سازی (۴) – استفاده از متد getSize

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

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

    yaa110 کاربر فعال

    ارسال‌ها:
    206
    تشکر شده:
    503
    امتیاز دستاورد:
    16
    در بخش چهارم از مجموعه بهینه سازی به معرفی متد getSize در AS3.0 و Air خواهیم پرداخت. با استفاده از این متد می توان در Flash Player 9 به بعد (درصورتی که شامل Debugger باشد) و Air Debugger مقدار حافظه اشغال شده (برحسب بایت) توسط یک شی را مشاهده کرد. با بررسی میزان حافظه اشغال شده توسط هر شی (در انواع مختلف)، در مواردی که امکان انتخاب چند شی که خروجی مشابه دارند، می توان بهترین گزینه را تعیین کرد. به مثال زیر توجه کنید:

    کد (Text):
    [/FONT][/COLOR][COLOR=#333333][FONT=Courier 10 Pitch]trace(getSize(new Shape()));       // Output: 236[/FONT][/COLOR]

    trace(getSize(new Sprite()));       // Output: 412 [COLOR=#333333][FONT=Courier 10 Pitch]trace(getSize(new MovieClip()));   // Output: 448[/FONT][/COLOR][COLOR=#333333][FONT=Georgia]
    همانطور که در این مثال مشخص است، در کاربردهای مشابه، یک شی از نوع MovieClip بیشترین میزان حافظه را نسبت به انواع Sprite و Shape اشغال می کند، بنابراین درصورتی که از MovieClip اشتباها به جای Shape استفاده شود، حدود نیمی از حافظه اشغال شده هدر رفته است. بنابراین در زمان کدنویسی با توجه به محدودیت های هر شی که در زیر فهرست شده اند، انتخاب بهترین گزینه می تواند منجر به استفاده بهینه از حافظه شود:

    1- شی از نوع Shape: زمانی که نیاز به خاصیت تعاملی ندارید، حتما از Shape استفاده کنید. اشیا تعاملی، اشیایی هستند که می توانند با کاربر تعامل داشته باشند (مانند دریافت کلیدهای Mouse یا Keyboard و یا هر ورودی دیگر). برای مثال از Shape می توانید برای ترسیم شکل هایی که صرفا ظاهر اپلیکیشن را می سازند، استفاده کنید.

    2- شی از نوع Sprite: زمانی که نیاز به تعامل با کاربر دارید اما نیازی به داشتن Timeline ندارید، بهتر است به جای MovieClip از Sprite استفاده کنید.

    3- شی از نوع MovieClip: اشیای از نوع MovieClip نیز دارای خاصیت تعاملی هستند و همچنین یک Timeline برای انیمیشن در اختیار کدنویس قرار می دهند.ممکن است زمانی که به اشیای کمی برای ساخت اپلیکیشن خود نیاز دارید، دقت در انتخاب شی مناسب چندان ضروری به نظر نرسد، اما در مواردی که اپلیکیشن شامل تعداد زیادی شی می شود، انتخاب نامناسب نوع اشیا می تواند منجر به هدر رفتن مقدار زیادی از حافظه در دسترس سیستم شود. این امر به خصوص در دستگاه های موبایل که مقدار محدودی حافظه را در اختیار اپلیکیشن قرار می دهند، بسیار ضروری است، زیرا استفاده بیش از حد از حافظه می تواند منجر به از کار افتادن و یا بسته شدن ناگهانی اپلیکیشن شود.

    • انتخاب متغیرهای ابتدایی (Primitive)
    تمامی متغیرهای ابتدایی (Primitive) به جز متغیر String، از 4 تا 8 بایت در حافظه اشغال می کنند. بنابراین در انتخاب و استفاده از آنها محدودیتی از لحاظ انتخاب بهینه وجود ندارد و کدنویس می تواند با توجه به نیاز خود و بدون نگرانی از انتخاب ناصحیح، متغیرهای مورد نیاز را تعریف کند. در مثال زیر، میزان حافظه استفاده شده توسط برخی از متغیرهای ابتدایی آمده است.

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

    کد (Text):
    [FONT=Courier 10 Pitch]var n:Number;[/FONT]
    trace(getSize(n));  // Output: 8var i:int;trace(getSize(i));    // Output: 4var u:uint;trace(getSize(u));   // Output: 4var b:Boolean; [FONT=Courier 10 Pitch]trace(getSize(b));    // Output: 4[/FONT]
    همانطور که مشخص است، زمانی که مقدار اولیه برای متغیر تعیین نشده است، متغیرهای از نوع Number هشت بایت در حافظه اشغال می کنند، درحالیکه سایر متغیرها تنها 4 بایت اشغال می کنند. در استفاده از Number توجه به این نکته الزامی است که این نوع متغیر قادر به نمایش اعداد 64 بیتی نیز می باشد و درصورتیکه یک مقدار اولیه به این متغیر تخصیص داده شود، مقدار حافظه اشغال شده توسط آن نیز متفاوت خواهد بود. به مثال زیر دقت کنید:

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

    کد (Text):
    [FONT=Courier 10 Pitch]var n1:Number = 0;[/FONT]
    trace(getSize(n1)); // Output: 4var n2:Number = Number.MAX_VALUE;trace(getSize(n2));    // Output: 8var n3:Number = Number.MIN_VALUE;trace(getSize(n3));    // Output: 8var n4:Number = 0.1; [FONT=Courier 10 Pitch]trace(getSize(n4)); // Output: 8[/FONT]
    زمانیکه یک مقدار صحیح 32 بیتی (مشابه int یا uint) به متغیر Number تخصیص داده شود، همان 4 بایت را اشغال خواهد کرد ولی درصورتی که از اعداد اعشاری استفاده شود، مقدار ماکزیمم (یعنی 8 بایت) از حافظه اشغال خواهد شد. پس اگر تنها با اعداد صحیح 32 بیتی سر و کار داشتید، فرقی در استفاده از Number یا int نیست. متغیرهای از نوع int و uint هر دو 32 بیتی هستند و فرق آنها در علامت اعداد است. متغیرهای از نوع int مقادیر منفی را نیز می پذیرند (از منفی 2 به توان 31 تا مثبت 2 به توان 31 منهای یک)، درحالیکه متغیرهای uint یا همان unsigned int تنها شامل اعداد مثبت و صحیح از صفر تا 2 به توان 32 منهای یک (1-32^2) می شوند.مقدار حافظه اشغال شده توسط متغیرهای String کاملا بستگی به مقدار آن دارد که در کمترین حالت 4 بایت می باشد:

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

    کد (Text):
    [FONT=Courier 10 Pitch]var s1:String;[/FONT]
    trace(getSize(s1)); // Output: 4var s2:String = "";trace(getSize(s2));  // Output: 24var s3:String = "Salam"; [FONT=Courier 10 Pitch]trace(getSize(s3));    // Output: 24[/FONT]
    منبع: http://flashcenter.ir/fa/1392/05/02/بهینه‌سازی-4-استفاده-از-متد-getsize/
     
    نوشته شده توسط yaa110 در ‏24 جولای 2013
    r.miri19 و ++Hadi++ از این پست تشکر کرده اند.

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