کاهش حجم بازی

این راهنما نحوه کاهش اندازه یک بازی را توضیح می دهد. پس از نصب، یک بازی کوچکتر به زمان کمتری برای دانلود و داده کمتری نیاز دارد. هر دوی اینها منجر به تبدیل نصب بالاتر می شود. تحقیقات گوگل نشان می دهد که افزایش 6 مگابایتی در اندازه APK ارائه شده منجر به کاهش 1٪ در نرخ نصب می شود. بسیاری از توسعه دهندگان دارایی ها را از APK به یک شبکه تحویل محتوا (CDN) منتقل می کنند، اما سپس هزینه هایی را هم در میزبانی CDN و هم در توسعه و نگهداری سیستم مدیریت دارایی متحمل می شوند.

برای کاهش حجم بازی مراحل زیر را انجام دهید:

  1. از روش‌های تحویل بهینه‌شده مانند App Bundles و Play Asset Delivery استفاده کنید .
  2. اندازه پایه بازی را تعیین کنید و ساختار آن را درک کنید .
  3. دارایی ها و فایل های دیگری را که می توان حجم آنها را کاهش داد جستجو کنید .
  4. بافت های گرافیکی را بررسی کنید و فرصت های بهینه سازی را شناسایی کنید .
  5. توصیه های کلی برای دارایی ها را دنبال کنید.

از روش‌های تحویل بهینه‌شده مانند Android App Bundles و Play Asset Delivery استفاده کنید

روش های تحویل زیر را در نظر بگیرید:

  • در حالی که پروژه‌های قدیمی معمولاً یک APK برای انتشار تولید می‌کنند، بازی‌هایی که در Google Play منتشر می‌شوند باید از Android App Bundle استفاده کنند. بسته‌های برنامه فایل‌های APK بهینه‌سازی شده را متناسب با پیکربندی دستگاه هر کاربر ارائه می‌کنند. به طور متوسط، بسته‌های برنامه، اندازه برنامه را تا ۲۰ درصد کاهش می‌دهند.

  • برای ارائه دارایی‌های بازی از طریق Google Play و فراتر از حد مجاز حجم دانلود 200 مگابایت برای بسته‌های برنامه تا چند گیگابایت، از Play Asset Delivery (PAD) استفاده کنید. هیچ CDN خارجی مورد نیاز نیست. PAD از سه روش تحویل متمایز پشتیبانی می کند که هر کدام را می توان در یک بازی استفاده کرد:

    • زمان نصب: پس از نصب، دارایی ها را دانلود کنید. دارایی‌ها در بسته‌های دارایی بسته‌بندی می‌شوند که جایگزینی برای فایل‌های Opaque Binary Blob (OBB) هستند.
    • دنبال کردن سریع: پس از نصب دارایی ها را دانلود کنید.
    • بر حسب تقاضا: بازی در صورت نیاز دانلود دارایی را آغاز می کند.

    PAD مستلزم این است که بازی ها با استفاده از قالب App Bundle بسته بندی شوند. PAD همچنین می‌تواند میزان داده‌های مورد استفاده توسط CDN توسعه‌دهنده را کاهش دهد (اگر هنوز به آن نیاز است).

  • Google Play از Android App Bundles برای تولید و ارائه فایل‌های APK بهینه‌شده برای پیکربندی دستگاه هر کاربر استفاده می‌کند. این فایل‌های APK بهینه‌سازی شده شامل مجموعه‌ای از دارایی‌های بافت هستند که با فرمت فشرده‌سازی بهینه برای دستگاه قالب‌بندی شده‌اند. بسته نرم افزاری خود را برای پشتیبانی از فرمت های مختلف فشرده سازی بافت برای پشتیبانی از وسیع ترین آرایه دستگاه ها پیکربندی کنید.

اندازه پایه بازی را تعیین کنید و ساختار آن را درک کنید

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

  1. از یک ساخت تولیدی (غیر اشکال‌زدایی) از توسعه‌دهنده یا APK منتشر شده استفاده کنید.
  2. اندازه فایل باینری را به صورتی که توسط سازنده ارائه شده است یا در صورتی که بازی منتشر شده است، در صفحه Play Store بازی ضبط کنید. برای اندازه APK، مهم‌ترین عامل میزان داده‌ای است که کاربر برای اجرای بازی واقعی باید دانلود کند.
  3. بازی را روی یک دستگاه نصب کنید و آن را در منوی اولیه بازی اجرا کنید. در این مرحله، اندازه نصب بازی را همانطور که توسط Android گزارش شده است بررسی کنید (در قسمت تنظیمات > ذخیره سازی ). برخی از بازی‌ها اندازه نصب اولیه کمی دارند، زیرا این عدد کلیدی برای بهینه‌سازی است، اما پس از نصب، داده‌های اضافی را دانلود کنید. برخی از بازی ها پس از نصب چندین گیگابایت داده دانلود می کنند.
  4. برخی از بازی ها فقط پس از شروع بازی، داده ها را دانلود می کنند. باید کمی بازی را انجام دهید تا مشخص شود که بازی برای یک کاربر معمولی که برای اولین بار بازی را انجام می دهد، چقدر داده اضافی دانلود می کند.

دارایی ها و فایل های دیگری را که می توان حجم آنها را کاهش داد جستجو کنید

در این بخش نحوه کاهش حجم فایل ها در APK توضیح داده شده است. می‌توانید از App Bundle Explorer برای دانلود فایل‌های APK خاص دستگاه استفاده کنید.

برای کاهش حجم فایل های بسته بندی شده مستقیماً در APK، مراحل زیر را انجام دهید:

  1. از Android Studio APK Analyzer استفاده کنید. در Android Studio، File > Profile یا Debug APK را انتخاب کنید و APK خود را انتخاب کنید.
  2. پوشه Assets را انتخاب کنید. برای هر فایل، حجم فایل خام و درصد حجم کل دانلود ذکر شده است.
  3. پوشه Assets را بررسی کنید و مشخص کنید که قسمت عمده ای از داده های بازی در کجا قرار دارد. تعیین کنید که آیا دارایی هایی وجود دارد که فضای زیادی را اشغال می کند (یعنی بیش از 1٪ از کل). به طور خاص به دنبال موارد زیر باشید:

    • فایل‌های تصویری و ویدیویی بزرگ (به عنوان مثال، فایل‌های PNG، JPEG و mp4): این فایل‌ها معمولاً در صفحه‌نمایش‌ها، پس‌زمینه‌ها و لوگوها استفاده می‌شوند. این فایل‌ها به ندرت در بیشتر بازی‌ها استفاده می‌شوند و می‌توان آن‌ها را بدون تأثیر بر تجربه کاربر، بیشتر فشرده کرد. فایل های PNG بدون از دست دادن به ویژه بزرگ هستند و کاندیدای عالی برای فشرده سازی هستند.
    • فایل‌های فونت بزرگ (به عنوان مثال، فایل‌های TTF): اگر پشتیبانی از شکلک اضافه کنید، می‌تواند اندازه فایل فونت را به میزان قابل توجهی افزایش دهد. اگر یک فایل فونت بزرگتر از چند صد کیلوبایت است، راه هایی برای کاهش اندازه آن در نظر بگیرید.
    • فرمت های فایل صوتی یا نسخه های تکراری که می توانید ترکیب کنید.
  4. اگر چندین رابط باینری برنامه (ABI) در APK گنجانده شده است، به App Bundles بروید یا چندین APK بسازید.

  5. اندازه فایل های باینری اشتراک گذاری شده (.so) را تعیین کنید. برای بررسی فایل‌های باینری و مشاهده مواردی که ممکن است نیازی به گنجاندن آنها نباشد، مانند فایل‌های گزارش، می‌توانید از ابزار Bloaty McBloatface استفاده کنید. برای اطلاعات بیشتر در مورد نحوه بهینه سازی فایل های باینری، به کامپایل پرچم ها و گزینه ها مراجعه کنید.

  6. فایل مانیفست اندروید را برای فرمت های گرافیکی پشتیبانی شده مرور کنید. تعیین کنید که آیا چندین تگ <supports-gl-texture> در APK وجود دارد یا خیر. اگر بازی از فرمت‌های چند پردازنده گرافیکی در یک APK پشتیبانی می‌کند، از Binomial's Basis Universal استفاده کنید. این سیستم فشرده‌سازی بافت GPU فایل‌های بافت را در قالبی متوسط ​​ایجاد می‌کند که می‌تواند به سرعت به GPU تبدیل شود.

بافت های گرافیکی را بررسی کنید و فرصت های بهینه سازی را شناسایی کنید

این بخش ابزارها و روش‌های مورد نیاز برای تعیین اینکه آیا بافت‌های گرافیکی مورد استفاده در بازی را می‌توان بهینه کرد، توضیح می‌دهد.

برای بررسی بافت‌های موجود در بازی، از Android GPU Inspector (AGI)، RenderDoc یا فقط برای پردازنده‌های گرافیکی Qualcomm Snapdragon از Snapdragon Profiler استفاده کنید.

به دنبال موارد زیر باشید:

  • بافت هایی که می توان آنها را به وضوح کوچکتر تغییر اندازه داد، مانند یک بافت بزرگ برای چیزی که فقط در اندازه کوچک در بازی رندر می شود. نمونه برداری از بافت ها از نظر محاسباتی گران است.
  • استفاده از چندین بافت کوچک که می توانند در یک نقشه بافت واحد ترکیب شوند.
  • بافت هایی که می توانند از بیت های کمتری در کانال های رنگی استفاده کنند. کاندیداهای خوب بافت هایی با بافت های کم و جامد هستند. گرادیان‌ها و سایه‌های رنگی نیاز به وضوح بیشتری دارند و بنابراین کاندیدای خوبی نیستند.
  • الگوریتم‌های فشرده‌سازی بافت بهتر، از ETC1 تا ETC2 و ASTC را کاوش کنید.
  • هنگام بارگیری بافت‌ها در دستگاه‌های پایین‌تر برای صرفه‌جویی در حافظه، سطح بالای mipmap را کنار بگذارید. سیستم Texture Streaming Unity می تواند این کار را انجام دهد.

  • اگر قبلاً این کار را نکرده‌اید، فایل مانیفست اندروید را برای قالب‌های گرافیکی پشتیبانی شده بررسی کنید. تعیین کنید که آیا چندین تگ <supports-gl-texture> در APK وجود دارد یا خیر. اگر بازی از فرمت‌های چند پردازنده گرافیکی در یک APK پشتیبانی می‌کند، از Binomial's Basis Universal استفاده کنید. این سیستم فشرده‌سازی بافت GPU فایل‌های بافت را در قالبی متوسط ​​ایجاد می‌کند که می‌تواند به سرعت به GPU تبدیل شود.

توصیه های کلی برای دارایی ها

این توصیه‌ها را برای دارایی‌های APK دنبال کنید:

  • دارایی‌های تصویر، صدا و ویدیو (نه بافت‌های GPU): تعیین کنید که آیا می‌توان اندازه دارایی‌ها را تغییر داد یا حتی بیشتر فشرده کرد. نسبت فشرده سازی بالاتر معمولاً برای بازی ها قابل قبول است. فایل های PNG بدون از دست دادن به ویژه بزرگ هستند و بنابراین کاندیدای عالی برای فشرده سازی هستند.
  • دارایی‌های تصویر (نه بافت‌های GPU): استفاده از WEBP را در نظر بگیرید، یک فرمت فشرده‌سازی تصویر هم برای فشرده‌سازی با اتلاف و هم برای فشرده‌سازی بدون تلفات. Lossy WEBP تصاویر را 25% تا 34% بیشتر از JPG فشرده می کند.
  • کاهش وضوح بافت: بافت بسیار بزرگتر از تعداد پیکسل هایی که در نهایت روی صفحه نمایش داده می شود، استفاده ناکارآمد از فضا و منابع GPU است. برای تغییر بافت و دیدن ظاهر آن در یک قاب بدون نیاز به بازسازی بازی، از AGI استفاده کنید.
  • تغییر فرمت‌های بافت گرافیکی: از قالب‌های بافتی استفاده کنید که بیت‌های کمتری در هر کانال استفاده می‌کنند. به عنوان مثال، به جای فرمت بافت 32 بیتی مانند ARGB از یک فرمت بافت 16 بیتی مانند RGB565 استفاده کنید. برای اطلاعات بیشتر به ادامه مطلب مراجعه کنید:

منابع اضافی

،

این راهنما نحوه کاهش اندازه یک بازی را توضیح می دهد. پس از نصب، یک بازی کوچکتر به زمان کمتری برای دانلود و داده کمتری نیاز دارد. هر دوی اینها منجر به تبدیل نصب بالاتر می شود. تحقیقات گوگل نشان می دهد که افزایش 6 مگابایتی در اندازه APK ارائه شده منجر به کاهش 1٪ در نرخ نصب می شود. بسیاری از توسعه دهندگان دارایی ها را از APK به یک شبکه تحویل محتوا (CDN) منتقل می کنند، اما سپس هزینه هایی را هم در میزبانی CDN و هم در توسعه و نگهداری سیستم مدیریت دارایی متحمل می شوند.

برای کاهش حجم بازی مراحل زیر را انجام دهید:

  1. از روش‌های تحویل بهینه‌شده مانند App Bundles و Play Asset Delivery استفاده کنید .
  2. اندازه پایه بازی را تعیین کنید و ساختار آن را درک کنید .
  3. دارایی ها و فایل های دیگری را که می توان حجم آنها را کاهش داد جستجو کنید .
  4. بافت های گرافیکی را بررسی کنید و فرصت های بهینه سازی را شناسایی کنید .
  5. توصیه های کلی برای دارایی ها را دنبال کنید.

از روش‌های تحویل بهینه‌شده مانند Android App Bundles و Play Asset Delivery استفاده کنید

روش های تحویل زیر را در نظر بگیرید:

  • در حالی که پروژه‌های قدیمی معمولاً یک APK برای انتشار تولید می‌کنند، بازی‌هایی که در Google Play منتشر می‌شوند باید از Android App Bundle استفاده کنند. بسته‌های برنامه فایل‌های APK بهینه‌سازی شده را متناسب با پیکربندی دستگاه هر کاربر ارائه می‌کنند. به طور متوسط، بسته‌های برنامه، اندازه برنامه را تا ۲۰ درصد کاهش می‌دهند.

  • برای ارائه دارایی‌های بازی از طریق Google Play و فراتر از حد مجاز حجم دانلود 200 مگابایت برای بسته‌های برنامه تا چند گیگابایت، از Play Asset Delivery (PAD) استفاده کنید. هیچ CDN خارجی مورد نیاز نیست. PAD از سه روش تحویل متمایز پشتیبانی می کند که هر کدام را می توان در یک بازی استفاده کرد:

    • زمان نصب: پس از نصب، دارایی ها را دانلود کنید. دارایی‌ها در بسته‌های دارایی بسته‌بندی می‌شوند که جایگزینی برای فایل‌های Opaque Binary Blob (OBB) هستند.
    • دنبال کردن سریع: پس از نصب دارایی ها را دانلود کنید.
    • بر حسب تقاضا: بازی در صورت نیاز دانلود دارایی را آغاز می کند.

    PAD مستلزم این است که بازی ها با استفاده از قالب App Bundle بسته بندی شوند. PAD همچنین می‌تواند میزان داده‌های مورد استفاده توسط CDN توسعه‌دهنده را کاهش دهد (اگر هنوز به آن نیاز است).

  • Google Play از Android App Bundles برای تولید و ارائه فایل‌های APK بهینه‌شده برای پیکربندی دستگاه هر کاربر استفاده می‌کند. این فایل‌های APK بهینه‌سازی شده شامل مجموعه‌ای از دارایی‌های بافت هستند که با فرمت فشرده‌سازی بهینه برای دستگاه قالب‌بندی شده‌اند. بسته نرم افزاری خود را برای پشتیبانی از فرمت های مختلف فشرده سازی بافت برای پشتیبانی از وسیع ترین آرایه دستگاه ها پیکربندی کنید.

اندازه پایه بازی را تعیین کنید و ساختار آن را درک کنید

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

  1. از یک ساخت تولیدی (غیر اشکال‌زدایی) از توسعه‌دهنده یا APK منتشر شده استفاده کنید.
  2. اندازه فایل باینری را به صورتی که توسط سازنده ارائه شده است یا در صورتی که بازی منتشر شده است، در صفحه Play Store بازی ضبط کنید. برای اندازه APK، مهم‌ترین عامل میزان داده‌ای است که کاربر برای اجرای بازی واقعی باید دانلود کند.
  3. بازی را روی یک دستگاه نصب کنید و آن را در منوی اولیه بازی اجرا کنید. در این مرحله، اندازه نصب بازی را همانطور که توسط Android گزارش شده است بررسی کنید (در قسمت تنظیمات > ذخیره سازی ). برخی از بازی‌ها اندازه نصب اولیه کمی دارند، زیرا این عدد کلیدی برای بهینه‌سازی است، اما پس از نصب، داده‌های اضافی را دانلود کنید. برخی از بازی ها پس از نصب چندین گیگابایت داده دانلود می کنند.
  4. برخی از بازی ها فقط پس از شروع بازی، داده ها را دانلود می کنند. باید کمی بازی را انجام دهید تا مشخص شود که بازی برای یک کاربر معمولی که برای اولین بار بازی را انجام می دهد، چقدر داده اضافی دانلود می کند.

دارایی ها و فایل های دیگری را که می توان حجم آنها را کاهش داد جستجو کنید

در این بخش نحوه کاهش حجم فایل ها در APK توضیح داده شده است. می‌توانید از App Bundle Explorer برای دانلود فایل‌های APK خاص دستگاه استفاده کنید.

برای کاهش حجم فایل های بسته بندی شده مستقیماً در APK، مراحل زیر را انجام دهید:

  1. از Android Studio APK Analyzer استفاده کنید. در Android Studio، File > Profile یا Debug APK را انتخاب کنید و APK خود را انتخاب کنید.
  2. پوشه Assets را انتخاب کنید. برای هر فایل، حجم فایل خام و درصد حجم کل دانلود ذکر شده است.
  3. پوشه Assets را بررسی کنید و مشخص کنید که قسمت عمده ای از داده های بازی در کجا قرار دارد. تعیین کنید که آیا دارایی هایی وجود دارد که فضای زیادی را اشغال می کند (یعنی بیش از 1٪ از کل). به طور خاص به دنبال موارد زیر باشید:

    • فایل‌های تصویری و ویدیویی بزرگ (به عنوان مثال، فایل‌های PNG، JPEG و mp4): این فایل‌ها معمولاً در صفحه‌نمایش‌ها، پس‌زمینه‌ها و لوگوها استفاده می‌شوند. این فایل‌ها به ندرت در بیشتر بازی‌ها استفاده می‌شوند و می‌توان آن‌ها را بدون تأثیر بر تجربه کاربر، بیشتر فشرده کرد. فایل های PNG بدون از دست دادن به ویژه بزرگ هستند و کاندیدای عالی برای فشرده سازی هستند.
    • فایل‌های فونت بزرگ (به عنوان مثال، فایل‌های TTF): اگر پشتیبانی از شکلک اضافه کنید، می‌تواند اندازه فایل فونت را به میزان قابل توجهی افزایش دهد. اگر یک فایل فونت بزرگتر از چند صد کیلوبایت است، راه هایی برای کاهش اندازه آن در نظر بگیرید.
    • فرمت های فایل صوتی یا نسخه های تکراری که می توانید ترکیب کنید.
  4. اگر چندین رابط باینری برنامه (ABI) در APK گنجانده شده است، به App Bundles بروید یا چندین APK بسازید.

  5. اندازه فایل های باینری اشتراک گذاری شده (.so) را تعیین کنید. برای بررسی فایل‌های باینری و مشاهده مواردی که ممکن است نیازی به گنجاندن آنها نباشد، مانند فایل‌های گزارش، می‌توانید از ابزار Bloaty McBloatface استفاده کنید. برای اطلاعات بیشتر در مورد نحوه بهینه سازی فایل های باینری، به کامپایل پرچم ها و گزینه ها مراجعه کنید.

  6. فایل مانیفست اندروید را برای فرمت های گرافیکی پشتیبانی شده مرور کنید. تعیین کنید که آیا چندین تگ <supports-gl-texture> در APK وجود دارد یا خیر. اگر بازی از فرمت‌های چند پردازنده گرافیکی در یک APK پشتیبانی می‌کند، از Binomial's Basis Universal استفاده کنید. این سیستم فشرده‌سازی بافت GPU فایل‌های بافت را در قالبی متوسط ​​ایجاد می‌کند که می‌تواند به سرعت به GPU تبدیل شود.

بافت های گرافیکی را بررسی کنید و فرصت های بهینه سازی را شناسایی کنید

این بخش ابزارها و روش‌های مورد نیاز برای تعیین اینکه آیا بافت‌های گرافیکی مورد استفاده در بازی را می‌توان بهینه کرد، توضیح می‌دهد.

برای بررسی بافت‌های موجود در بازی، از Android GPU Inspector (AGI)، RenderDoc یا فقط برای پردازنده‌های گرافیکی Qualcomm Snapdragon از Snapdragon Profiler استفاده کنید.

به دنبال موارد زیر باشید:

  • بافت هایی که می توان آنها را به وضوح کوچکتر تغییر اندازه داد، مانند یک بافت بزرگ برای چیزی که فقط در اندازه کوچک در بازی رندر می شود. نمونه برداری از بافت ها از نظر محاسباتی گران است.
  • استفاده از چندین بافت کوچک که می توانند در یک نقشه بافت واحد ترکیب شوند.
  • بافت هایی که می توانند از بیت های کمتری در کانال های رنگی استفاده کنند. کاندیداهای خوب بافت هایی با بافت های کم و جامد هستند. گرادیان‌ها و سایه‌های رنگی نیاز به وضوح بیشتری دارند و بنابراین کاندیدای خوبی نیستند.
  • الگوریتم‌های فشرده‌سازی بافت بهتر، از ETC1 تا ETC2 و ASTC را کاوش کنید.
  • هنگام بارگیری بافت‌ها در دستگاه‌های پایین‌تر برای صرفه‌جویی در حافظه، سطح بالای mipmap را کنار بگذارید. سیستم Texture Streaming Unity می تواند این کار را انجام دهد.

  • اگر قبلاً این کار را نکرده‌اید، فایل مانیفست اندروید را برای قالب‌های گرافیکی پشتیبانی شده بررسی کنید. تعیین کنید که آیا چندین تگ <supports-gl-texture> در APK وجود دارد یا خیر. اگر بازی از فرمت‌های چند پردازنده گرافیکی در یک APK پشتیبانی می‌کند، از Binomial's Basis Universal استفاده کنید. این سیستم فشرده‌سازی بافت GPU فایل‌های بافت را در قالبی متوسط ​​ایجاد می‌کند که می‌تواند به سرعت به GPU تبدیل شود.

توصیه های کلی برای دارایی ها

این توصیه‌ها را برای دارایی‌های APK دنبال کنید:

  • دارایی‌های تصویر، صدا و ویدیو (نه بافت‌های GPU): تعیین کنید که آیا می‌توان اندازه دارایی‌ها را تغییر داد یا حتی بیشتر فشرده کرد. نسبت فشرده سازی بالاتر معمولاً برای بازی ها قابل قبول است. فایل های PNG بدون از دست دادن به ویژه بزرگ هستند و بنابراین کاندیدای عالی برای فشرده سازی هستند.
  • دارایی‌های تصویر (نه بافت‌های GPU): استفاده از WEBP را در نظر بگیرید، یک فرمت فشرده‌سازی تصویر هم برای فشرده‌سازی با اتلاف و هم برای فشرده‌سازی بدون تلفات. Lossy WEBP تصاویر را 25% تا 34% بیشتر از JPG فشرده می کند.
  • کاهش وضوح بافت: بافت بسیار بزرگتر از تعداد پیکسل هایی که در نهایت روی صفحه نمایش داده می شود، استفاده ناکارآمد از فضا و منابع GPU است. برای تغییر بافت و دیدن ظاهر آن در یک قاب بدون نیاز به بازسازی بازی، از AGI استفاده کنید.
  • تغییر فرمت‌های بافت گرافیکی: از قالب‌های بافتی استفاده کنید که بیت‌های کمتری در هر کانال استفاده می‌کنند. به عنوان مثال، به جای فرمت بافت 32 بیتی مانند ARGB از یک فرمت بافت 16 بیتی مانند RGB565 استفاده کنید. برای اطلاعات بیشتر به ادامه مطلب مراجعه کنید:

منابع اضافی

،

این راهنما نحوه کاهش اندازه یک بازی را توضیح می دهد. پس از نصب، یک بازی کوچکتر به زمان کمتری برای دانلود و داده کمتری نیاز دارد. هر دوی اینها منجر به تبدیل نصب بالاتر می شود. تحقیقات گوگل نشان می دهد که افزایش 6 مگابایتی در اندازه APK ارائه شده منجر به کاهش 1٪ در نرخ نصب می شود. بسیاری از توسعه دهندگان دارایی ها را از APK به یک شبکه تحویل محتوا (CDN) منتقل می کنند، اما سپس هزینه هایی را هم در میزبانی CDN و هم در توسعه و نگهداری سیستم مدیریت دارایی متحمل می شوند.

برای کاهش حجم بازی مراحل زیر را انجام دهید:

  1. از روش‌های تحویل بهینه‌شده مانند App Bundles و Play Asset Delivery استفاده کنید .
  2. اندازه پایه بازی را تعیین کنید و ساختار آن را درک کنید .
  3. دارایی ها و فایل های دیگری را که می توان حجم آنها را کاهش داد جستجو کنید .
  4. بافت های گرافیکی را بررسی کنید و فرصت های بهینه سازی را شناسایی کنید .
  5. توصیه های کلی برای دارایی ها را دنبال کنید.

از روش‌های تحویل بهینه‌شده مانند Android App Bundles و Play Asset Delivery استفاده کنید

روش های تحویل زیر را در نظر بگیرید:

  • در حالی که پروژه‌های قدیمی معمولاً یک APK برای انتشار تولید می‌کنند، بازی‌هایی که در Google Play منتشر می‌شوند باید از Android App Bundle استفاده کنند. بسته‌های برنامه فایل‌های APK بهینه‌سازی شده را متناسب با پیکربندی دستگاه هر کاربر ارائه می‌کنند. به طور متوسط، بسته‌های برنامه، اندازه برنامه را تا ۲۰ درصد کاهش می‌دهند.

  • برای ارائه دارایی‌های بازی از طریق Google Play و فراتر از حد مجاز حجم دانلود 200 مگابایت برای بسته‌های برنامه تا چند گیگابایت، از Play Asset Delivery (PAD) استفاده کنید. هیچ CDN خارجی مورد نیاز نیست. PAD از سه روش تحویل متمایز پشتیبانی می کند که هر کدام را می توان در یک بازی استفاده کرد:

    • زمان نصب: پس از نصب، دارایی ها را دانلود کنید. دارایی‌ها در بسته‌های دارایی بسته‌بندی می‌شوند که جایگزینی برای فایل‌های Opaque Binary Blob (OBB) هستند.
    • دنبال کردن سریع: پس از نصب دارایی ها را دانلود کنید.
    • بر حسب تقاضا: بازی در صورت نیاز دانلود دارایی را آغاز می کند.

    PAD مستلزم این است که بازی ها با استفاده از قالب App Bundle بسته بندی شوند. PAD همچنین می‌تواند میزان داده‌های مورد استفاده توسط CDN توسعه‌دهنده را کاهش دهد (اگر هنوز به آن نیاز است).

  • Google Play از Android App Bundles برای تولید و ارائه فایل‌های APK بهینه‌شده برای پیکربندی دستگاه هر کاربر استفاده می‌کند. این فایل‌های APK بهینه‌سازی شده شامل مجموعه‌ای از دارایی‌های بافت هستند که با فرمت فشرده‌سازی بهینه برای دستگاه قالب‌بندی شده‌اند. بسته نرم افزاری خود را برای پشتیبانی از فرمت های مختلف فشرده سازی بافت برای پشتیبانی از وسیع ترین آرایه دستگاه ها پیکربندی کنید.

اندازه پایه بازی را تعیین کنید و ساختار آن را درک کنید

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

  1. از یک ساخت تولیدی (غیر اشکال‌زدایی) از توسعه‌دهنده یا APK منتشر شده استفاده کنید.
  2. اندازه فایل باینری را به صورتی که توسط سازنده ارائه شده است یا در صورتی که بازی منتشر شده است، در صفحه Play Store بازی ضبط کنید. برای اندازه APK، مهم‌ترین عامل میزان داده‌ای است که کاربر برای اجرای بازی واقعی باید دانلود کند.
  3. بازی را روی یک دستگاه نصب کنید و آن را در منوی اولیه بازی اجرا کنید. در این مرحله، اندازه نصب بازی را همانطور که توسط Android گزارش شده است بررسی کنید (در قسمت تنظیمات > ذخیره سازی ). برخی از بازی‌ها اندازه نصب اولیه کمی دارند، زیرا این عدد کلیدی برای بهینه‌سازی است، اما پس از نصب، داده‌های اضافی را دانلود کنید. برخی از بازی ها پس از نصب چندین گیگابایت داده دانلود می کنند.
  4. برخی از بازی ها فقط پس از شروع بازی، داده ها را دانلود می کنند. باید کمی بازی را انجام دهید تا مشخص شود که بازی برای یک کاربر معمولی که برای اولین بار بازی را انجام می دهد، چقدر داده اضافی دانلود می کند.

دارایی ها و فایل های دیگری را که می توان حجم آنها را کاهش داد جستجو کنید

در این بخش نحوه کاهش حجم فایل ها در APK توضیح داده شده است. می‌توانید از App Bundle Explorer برای دانلود فایل‌های APK خاص دستگاه استفاده کنید.

برای کاهش حجم فایل های بسته بندی شده مستقیماً در APK، مراحل زیر را انجام دهید:

  1. از Android Studio APK Analyzer استفاده کنید. در Android Studio، File > Profile یا Debug APK را انتخاب کنید و APK خود را انتخاب کنید.
  2. پوشه Assets را انتخاب کنید. برای هر فایل، حجم فایل خام و درصد حجم کل دانلود ذکر شده است.
  3. پوشه Assets را بررسی کنید و مشخص کنید که قسمت عمده ای از داده های بازی در کجا قرار دارد. تعیین کنید که آیا دارایی هایی وجود دارد که فضای زیادی را اشغال می کند (یعنی بیش از 1٪ از کل). به طور خاص به دنبال موارد زیر باشید:

    • فایل‌های تصویری و ویدیویی بزرگ (به عنوان مثال، فایل‌های PNG، JPEG و mp4): این فایل‌ها معمولاً در صفحه‌نمایش‌ها، پس‌زمینه‌ها و لوگوها استفاده می‌شوند. این فایل‌ها به ندرت در بیشتر بازی‌ها استفاده می‌شوند و می‌توان آن‌ها را بدون تأثیر بر تجربه کاربر، بیشتر فشرده کرد. فایل های PNG بدون از دست دادن به ویژه بزرگ هستند و کاندیدای عالی برای فشرده سازی هستند.
    • فایل‌های فونت بزرگ (به عنوان مثال، فایل‌های TTF): اگر پشتیبانی از شکلک اضافه کنید، می‌تواند اندازه فایل فونت را به میزان قابل توجهی افزایش دهد. اگر یک فایل فونت بزرگتر از چند صد کیلوبایت است، راه هایی برای کاهش اندازه آن در نظر بگیرید.
    • فرمت های فایل صوتی یا نسخه های تکراری که می توانید ترکیب کنید.
  4. اگر چندین رابط باینری برنامه (ABI) در APK گنجانده شده است، به App Bundles بروید یا چندین APK بسازید.

  5. اندازه فایل های باینری اشتراک گذاری شده (.so) را تعیین کنید. برای بررسی فایل‌های باینری و مشاهده مواردی که ممکن است نیازی به گنجاندن آنها نباشد، مانند فایل‌های گزارش، می‌توانید از ابزار Bloaty McBloatface استفاده کنید. برای اطلاعات بیشتر در مورد نحوه بهینه سازی فایل های باینری، به کامپایل پرچم ها و گزینه ها مراجعه کنید.

  6. فایل مانیفست اندروید را برای فرمت های گرافیکی پشتیبانی شده مرور کنید. تعیین کنید که آیا چندین تگ <supports-gl-texture> در APK وجود دارد یا خیر. اگر بازی از فرمت‌های چند پردازنده گرافیکی در یک APK پشتیبانی می‌کند، از Binomial's Basis Universal استفاده کنید. این سیستم فشرده‌سازی بافت GPU فایل‌های بافت را در قالبی متوسط ​​ایجاد می‌کند که می‌تواند به سرعت به GPU تبدیل شود.

بافت های گرافیکی را بررسی کنید و فرصت های بهینه سازی را شناسایی کنید

این بخش ابزارها و روش‌های مورد نیاز برای تعیین اینکه آیا بافت‌های گرافیکی مورد استفاده در بازی را می‌توان بهینه کرد، توضیح می‌دهد.

برای بررسی بافت‌های موجود در بازی، از Android GPU Inspector (AGI)، RenderDoc یا فقط برای پردازنده‌های گرافیکی Qualcomm Snapdragon از Snapdragon Profiler استفاده کنید.

به دنبال موارد زیر باشید:

  • بافت هایی که می توان آنها را به وضوح کوچکتر تغییر اندازه داد، مانند یک بافت بزرگ برای چیزی که فقط در اندازه کوچک در بازی رندر می شود. نمونه برداری از بافت ها از نظر محاسباتی گران است.
  • استفاده از چندین بافت کوچک که می توانند در یک نقشه بافت واحد ترکیب شوند.
  • بافت هایی که می توانند از بیت های کمتری در کانال های رنگی استفاده کنند. کاندیداهای خوب بافت هایی با بافت های کم و جامد هستند. گرادیان‌ها و سایه‌های رنگی نیاز به وضوح بیشتری دارند و بنابراین کاندیدای خوبی نیستند.
  • الگوریتم‌های فشرده‌سازی بافت بهتر، از ETC1 تا ETC2 و ASTC را کاوش کنید.
  • هنگام بارگیری بافت‌ها در دستگاه‌های پایین‌تر برای صرفه‌جویی در حافظه، سطح بالای mipmap را کنار بگذارید. سیستم Texture Streaming Unity می تواند این کار را انجام دهد.

  • اگر قبلاً این کار را نکرده‌اید، فایل مانیفست اندروید را برای قالب‌های گرافیکی پشتیبانی شده بررسی کنید. تعیین کنید که آیا چندین تگ <supports-gl-texture> در APK وجود دارد یا خیر. اگر بازی از فرمت‌های چند پردازنده گرافیکی در یک APK پشتیبانی می‌کند، از Binomial's Basis Universal استفاده کنید. این سیستم فشرده‌سازی بافت GPU فایل‌های بافت را در قالبی متوسط ​​ایجاد می‌کند که می‌تواند به سرعت به GPU تبدیل شود.

توصیه های کلی برای دارایی ها

این توصیه‌ها را برای دارایی‌های APK دنبال کنید:

  • دارایی‌های تصویر، صدا و ویدیو (نه بافت‌های GPU): تعیین کنید که آیا می‌توان اندازه دارایی‌ها را تغییر داد یا حتی بیشتر فشرده کرد. نسبت فشرده سازی بالاتر معمولاً برای بازی ها قابل قبول است. فایل های PNG بدون از دست دادن به ویژه بزرگ هستند و بنابراین کاندیدای عالی برای فشرده سازی هستند.
  • دارایی‌های تصویر (نه بافت‌های GPU): استفاده از WEBP را در نظر بگیرید، یک فرمت فشرده‌سازی تصویر هم برای فشرده‌سازی با اتلاف و هم برای فشرده‌سازی بدون تلفات. Lossy WEBP تصاویر را 25% تا 34% بیشتر از JPG فشرده می کند.
  • کاهش وضوح بافت: بافت بسیار بزرگتر از تعداد پیکسل هایی که در نهایت روی صفحه نمایش داده می شود، استفاده ناکارآمد از فضا و منابع GPU است. برای تغییر بافت و دیدن ظاهر آن در یک قاب بدون نیاز به بازسازی بازی، از AGI استفاده کنید.
  • تغییر فرمت‌های بافت گرافیکی: از قالب‌های بافتی استفاده کنید که بیت‌های کمتری در هر کانال استفاده می‌کنند. به عنوان مثال، به جای فرمت بافت 32 بیتی مانند ARGB از یک فرمت بافت 16 بیتی مانند RGB565 استفاده کنید. برای اطلاعات بیشتر به ادامه مطلب مراجعه کنید:

منابع اضافی

،

این راهنما نحوه کاهش اندازه یک بازی را توضیح می دهد. پس از نصب، یک بازی کوچکتر به زمان کمتری برای دانلود و داده کمتری نیاز دارد. هر دوی اینها منجر به تبدیل نصب بالاتر می شود. تحقیقات گوگل نشان می دهد که افزایش 6 مگابایتی در اندازه APK ارائه شده منجر به کاهش 1٪ در نرخ نصب می شود. بسیاری از توسعه دهندگان دارایی ها را از APK به یک شبکه تحویل محتوا (CDN) منتقل می کنند، اما سپس هزینه هایی را هم در میزبانی CDN و هم در توسعه و نگهداری سیستم مدیریت دارایی متحمل می شوند.

برای کاهش حجم بازی مراحل زیر را انجام دهید:

  1. از روش‌های تحویل بهینه‌شده مانند App Bundles و Play Asset Delivery استفاده کنید .
  2. اندازه پایه بازی را تعیین کنید و ساختار آن را درک کنید .
  3. دارایی ها و فایل های دیگری را که می توان حجم آنها را کاهش داد جستجو کنید .
  4. بافت های گرافیکی را بررسی کنید و فرصت های بهینه سازی را شناسایی کنید .
  5. توصیه های کلی برای دارایی ها را دنبال کنید.

از روش‌های تحویل بهینه‌شده مانند Android App Bundles و Play Asset Delivery استفاده کنید

روش های تحویل زیر را در نظر بگیرید:

  • در حالی که پروژه‌های قدیمی معمولاً یک APK برای انتشار تولید می‌کنند، بازی‌هایی که در Google Play منتشر می‌شوند باید از Android App Bundle استفاده کنند. بسته‌های برنامه فایل‌های APK بهینه‌سازی شده را متناسب با پیکربندی دستگاه هر کاربر ارائه می‌کنند. به طور متوسط، بسته‌های برنامه، اندازه برنامه را تا ۲۰ درصد کاهش می‌دهند.

  • برای ارائه دارایی‌های بازی از طریق Google Play و فراتر از حد مجاز حجم دانلود 200 مگابایت برای بسته‌های برنامه تا چند گیگابایت، از Play Asset Delivery (PAD) استفاده کنید. هیچ CDN خارجی مورد نیاز نیست. PAD از سه روش تحویل متمایز پشتیبانی می کند که هر کدام را می توان در یک بازی استفاده کرد:

    • زمان نصب: پس از نصب، دارایی ها را دانلود کنید. دارایی‌ها در بسته‌های دارایی بسته‌بندی می‌شوند که جایگزینی برای فایل‌های Opaque Binary Blob (OBB) هستند.
    • دنبال کردن سریع: پس از نصب دارایی ها را دانلود کنید.
    • بر حسب تقاضا: بازی در صورت نیاز دانلود دارایی را آغاز می کند.

    PAD مستلزم این است که بازی ها با استفاده از قالب App Bundle بسته بندی شوند. PAD همچنین می‌تواند میزان داده‌های مورد استفاده توسط CDN توسعه‌دهنده را کاهش دهد (اگر هنوز به آن نیاز است).

  • Google Play از Android App Bundles برای تولید و ارائه فایل‌های APK بهینه‌شده برای پیکربندی دستگاه هر کاربر استفاده می‌کند. این فایل‌های APK بهینه‌سازی شده شامل مجموعه‌ای از دارایی‌های بافت هستند که با فرمت فشرده‌سازی بهینه برای دستگاه قالب‌بندی شده‌اند. بسته نرم افزاری خود را برای پشتیبانی از فرمت های مختلف فشرده سازی بافت برای پشتیبانی از وسیع ترین آرایه دستگاه ها پیکربندی کنید.

اندازه پایه بازی را تعیین کنید و ساختار آن را درک کنید

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

  1. از یک ساخت تولیدی (غیر اشکال‌زدایی) از توسعه‌دهنده یا APK منتشر شده استفاده کنید.
  2. اندازه فایل باینری را به صورتی که توسط سازنده ارائه شده است یا در صورتی که بازی منتشر شده است، در صفحه Play Store بازی ضبط کنید. برای اندازه APK، مهم‌ترین عامل میزان داده‌ای است که کاربر برای اجرای بازی واقعی باید دانلود کند.
  3. بازی را روی یک دستگاه نصب کنید و آن را در منوی اولیه بازی اجرا کنید. در این مرحله، اندازه نصب بازی را همانطور که توسط Android گزارش شده است بررسی کنید (در قسمت تنظیمات > ذخیره سازی ). برخی از بازی‌ها اندازه نصب اولیه کمی دارند، زیرا این عدد کلیدی برای بهینه‌سازی است، اما پس از نصب، داده‌های اضافی را دانلود کنید. برخی از بازی ها پس از نصب چندین گیگابایت داده دانلود می کنند.
  4. برخی از بازی ها فقط پس از شروع بازی، داده ها را دانلود می کنند. باید کمی بازی را انجام دهید تا مشخص شود که بازی برای یک کاربر معمولی که برای اولین بار بازی را انجام می دهد، چقدر داده اضافی دانلود می کند.

دارایی ها و فایل های دیگری را که می توان حجم آنها را کاهش داد جستجو کنید

در این بخش نحوه کاهش حجم فایل ها در APK توضیح داده شده است. می‌توانید از App Bundle Explorer برای دانلود فایل‌های APK خاص دستگاه استفاده کنید.

برای کاهش حجم فایل های بسته بندی شده مستقیماً در APK، مراحل زیر را انجام دهید:

  1. از Android Studio APK Analyzer استفاده کنید. در Android Studio، File > Profile یا Debug APK را انتخاب کنید و APK خود را انتخاب کنید.
  2. پوشه Assets را انتخاب کنید. برای هر فایل، حجم فایل خام و درصد حجم کل دانلود ذکر شده است.
  3. پوشه Assets را بررسی کنید و مشخص کنید که قسمت عمده ای از داده های بازی در کجا قرار دارد. تعیین کنید که آیا دارایی هایی وجود دارد که فضای زیادی را اشغال می کند (یعنی بیش از 1٪ از کل). به طور خاص به دنبال موارد زیر باشید:

    • فایل‌های تصویری و ویدیویی بزرگ (به عنوان مثال، فایل‌های PNG، JPEG و mp4): این فایل‌ها معمولاً در صفحه‌نمایش‌ها، پس‌زمینه‌ها و لوگوها استفاده می‌شوند. این فایل‌ها به ندرت در بیشتر بازی‌ها استفاده می‌شوند و می‌توان آن‌ها را بدون تأثیر بر تجربه کاربر، بیشتر فشرده کرد. فایل های PNG بدون از دست دادن به ویژه بزرگ هستند و کاندیدای عالی برای فشرده سازی هستند.
    • فایل‌های فونت بزرگ (به عنوان مثال، فایل‌های TTF): اگر پشتیبانی از شکلک اضافه کنید، می‌تواند اندازه فایل فونت را به میزان قابل توجهی افزایش دهد. اگر یک فایل فونت بزرگتر از چند صد کیلوبایت است، راه هایی برای کاهش اندازه آن در نظر بگیرید.
    • فرمت های فایل صوتی یا نسخه های تکراری که می توانید ترکیب کنید.
  4. اگر چندین رابط باینری برنامه (ABI) در APK گنجانده شده است، به App Bundles بروید یا چندین APK بسازید.

  5. اندازه فایل های باینری اشتراک گذاری شده (.so) را تعیین کنید. برای بررسی فایل‌های باینری و مشاهده مواردی که ممکن است نیازی به گنجاندن آنها نباشد، مانند فایل‌های گزارش، می‌توانید از ابزار Bloaty McBloatface استفاده کنید. برای اطلاعات بیشتر در مورد نحوه بهینه سازی فایل های باینری، به کامپایل پرچم ها و گزینه ها مراجعه کنید.

  6. فایل مانیفست اندروید را برای فرمت های گرافیکی پشتیبانی شده مرور کنید. تعیین کنید که آیا چندین تگ <supports-gl-texture> در APK وجود دارد یا خیر. اگر بازی از فرمت‌های چند پردازنده گرافیکی در یک APK پشتیبانی می‌کند، از Binomial's Basis Universal استفاده کنید. این سیستم فشرده‌سازی بافت GPU فایل‌های بافت را در قالبی متوسط ​​ایجاد می‌کند که می‌تواند به سرعت به GPU تبدیل شود.

بافت های گرافیکی را بررسی کنید و فرصت های بهینه سازی را شناسایی کنید

این بخش ابزارها و روش‌های مورد نیاز برای تعیین اینکه آیا بافت‌های گرافیکی مورد استفاده در بازی را می‌توان بهینه کرد، توضیح می‌دهد.

برای بررسی بافت‌های موجود در بازی، از Android GPU Inspector (AGI)، RenderDoc یا فقط برای پردازنده‌های گرافیکی Qualcomm Snapdragon از Snapdragon Profiler استفاده کنید.

به دنبال موارد زیر باشید:

  • بافت هایی که می توان آنها را به وضوح کوچکتر تغییر اندازه داد، مانند یک بافت بزرگ برای چیزی که فقط در اندازه کوچک در بازی رندر می شود. نمونه برداری از بافت ها از نظر محاسباتی گران است.
  • استفاده از چندین بافت کوچک که می توانند در یک نقشه بافت واحد ترکیب شوند.
  • بافت هایی که می توانند از بیت های کمتری در کانال های رنگی استفاده کنند. کاندیداهای خوب بافت هایی با بافت های کم و جامد هستند. گرادیان‌ها و سایه‌های رنگی نیاز به وضوح بیشتری دارند و بنابراین کاندیدای خوبی نیستند.
  • الگوریتم‌های فشرده‌سازی بافت بهتر، از ETC1 تا ETC2 و ASTC را کاوش کنید.
  • هنگام بارگیری بافت‌ها در دستگاه‌های پایین‌تر برای صرفه‌جویی در حافظه، سطح بالای mipmap را کنار بگذارید. سیستم Texture Streaming Unity می تواند این کار را انجام دهد.

  • اگر قبلاً این کار را نکرده‌اید، فایل مانیفست اندروید را برای قالب‌های گرافیکی پشتیبانی شده بررسی کنید. تعیین کنید که آیا چندین تگ <supports-gl-texture> در APK وجود دارد یا خیر. اگر بازی از فرمت‌های چند پردازنده گرافیکی در یک APK پشتیبانی می‌کند، از Binomial's Basis Universal استفاده کنید. این سیستم فشرده‌سازی بافت GPU فایل‌های بافت را در قالبی متوسط ​​ایجاد می‌کند که می‌تواند به سرعت به GPU تبدیل شود.

توصیه های کلی برای دارایی ها

این توصیه‌ها را برای دارایی‌های APK دنبال کنید:

  • دارایی‌های تصویر، صدا و ویدیو (نه بافت‌های GPU): تعیین کنید که آیا می‌توان اندازه دارایی‌ها را تغییر داد یا حتی بیشتر فشرده کرد. نسبت فشرده سازی بالاتر معمولاً برای بازی ها قابل قبول است. فایل های PNG بدون از دست دادن به ویژه بزرگ هستند و بنابراین کاندیدای عالی برای فشرده سازی هستند.
  • دارایی‌های تصویر (نه بافت‌های GPU): استفاده از WEBP را در نظر بگیرید، یک فرمت فشرده‌سازی تصویر هم برای فشرده‌سازی با اتلاف و هم برای فشرده‌سازی بدون تلفات. Lossy WEBP تصاویر را 25% تا 34% بیشتر از JPG فشرده می کند.
  • کاهش وضوح بافت: بافت بسیار بزرگتر از تعداد پیکسل هایی که در نهایت روی صفحه نمایش داده می شود، استفاده ناکارآمد از فضا و منابع GPU است. برای تغییر بافت و دیدن ظاهر آن در یک قاب بدون نیاز به بازسازی بازی، از AGI استفاده کنید.
  • تغییر فرمت‌های بافت گرافیکی: از قالب‌های بافتی استفاده کنید که بیت‌های کمتری در هر کانال استفاده می‌کنند. به عنوان مثال، به جای فرمت بافت 32 بیتی مانند ARGB از یک فرمت بافت 16 بیتی مانند RGB565 استفاده کنید. برای اطلاعات بیشتر به ادامه مطلب مراجعه کنید:

منابع اضافی