تبلیغات
تبلیغات
تبلیغات
تبلیغات

مشکل لگ در یه بازی ساده 2 بعدی
(1 مشاهده) (1) مهمان
  • صفحه:
  • 1
  • 2

موضوع: مشکل لگ در یه بازی ساده 2 بعدی

مشکل لگ در یه بازی ساده 2 بعدی 5 ماه, 3 هفته پیش #140825

  • Night Sky
  • آفلاین
  • کاربر همیشگی سایت
  • ارسال: 114
  • دریافت تشكر: 71
  • 
سلام دوستان من خواستم یه بازی خیلی ساده به سبک flappy bird بسازم در اندروید فقط با این تفاوت که بجای پرنده از هواپیما استفاده کردم.
همه چی عالیه در خود یونیتی و حتی شبیه ساز اندرویدم اما توی تبلت واقعی که با پردازنده 1 هسته و رم 1 و خلاصه تمام بازیها به این سبک کاملا روون اجرا میشه روش اما این بازی واقعا با تاخیر میره بالا هواپیما و هنگام تاچ و همچنین موانعی که ساختم از سمت راست صفحه ایجاد میشه و به سمت چپ حرکت میکنه و بعد نابود میشه اما توی حرکت اونا هم میشه لگ رو دید و خلاصخ روون حرکت نمیکنه
تنها در تابع استارت هم velocity دادم به موانع که به سمت چپ حرکت کنن و بعد رسیدن به سمت چپ صحه نابود میشن.

جالبتر اینکه با اینکه یه بار کد ایجاد موانع ، یه بار کد بک گروند و و در اخر کد خود هواپیما رو غیر فعال کردم اما بعد خروجی بازم همون لگ هست هنگام حرکت موانع و مخصوصا هنگام بالا رفتن هواپیما هنگام لمس صفحه.
اصلا موندم چطور یه بازی کاملا روون از یونیتی بگیرم!
تمام چیزهایی که در مورد بهینه سازی رو میدونستم رو انجام دادم از اسپرایت های سایز کوچیک و فشرده شدن تا سایز 64 بگیر تا کیفیت 0 بازی و روشن خاموش کردن v-sync فعال و غیر فعال کردن توابع ایجاد موانع تغییر کولایدرها صداها و....
بدون فعال کردن v sync هم فریم دوربر 1000 هست که تو اندروید انگار 20 هست!
پروفایلر هم میگه همه چی خوبه! چند ظلعی ها هم هنگام اجرا دوروبر 300 و ورتکس دوروبر 500

دیگه نمیدونم چطور روونش کنم تو اندروید البته این شاید تو دستگاه های قوی مشکلی نداشته باشه اما این تبلت که در دسترس دارم دیگه اونقدر ظعیف نیست که بخواد این بازی رو روون اجرا نکنه!
دیگه شک کردم مشکل از خود یونیتی نباشه! اخه چرا لگ واقعا! مشکل کجای کارم میتونه باشه از خروجی اینترنال و گریدل هم تست کردم فقط دو مگ حجمش تغییر کرد! تیک های گرافیک استاتیک و... هر چی بود در تنظیمات پلیر هم تغییر دادم فرقی نکرد
فقط تنها چیزی که دیگه ای که میدونستم اما تست نکردم خروجی مونو و il2cpp هست که نیاز به NDK داره که اصلا نمیدونم حل میشه اگه ان دی کی با اون حجم بالا نصب کنم یا نه....اگه اشتباه نکنم هم کمتر کسی از خروجی غیر مونو استفاده میکنه..

نمونه بازی مشابه هست پایین که نسخه اندرویدش توی همین تبلت هم تست کردم و کاملا روون اجرا میشه و از روونیش حال میکنم واقعا از بس بازیه من لگ داشته :(
www.helicopter-game.org/
تو این بازی بعد لمس صفحه بلافاصه پلیر میره بالا اما در بازی من بعد لمس کند تر عمل میکنه در حالی که تو خود یونیتیو شبیه سازم کاملا روونه

دیگه نمیدونم مشکل کجای کاره و درخواست راهنمایی دارم ممنون

پاسخ: مشکل لگ در یه بازی ساده 2 بعدی 5 ماه, 3 هفته پیش #140829

  • Jinjer
  • آفلاین
  • کاربر تازه وارد
  • ارسال: 32
  • دریافت تشكر: 45
خروجی IL2CPP که حتما کمک می کنه ولی نه توی سریع تر شدن بازی. لود شدن اول بازی خیلی سریع میشه و حجم apk نهایی هم نقریبا نصف میشه چون انجین رو strip می کنه، یعنی اگر سیستمی از انجین استفاده نشده از بیلد نهایی حذف می کنه. مثلا اگر از فیزیک استفاده نکردی همه کد فیزیک رو از بیلد پاک می کنه.

ولی اگر بازی داره کند اجرا میشه و مطمئن هستی که fps پایینه تنها راه تشخیص مشکل profiler گرفتن روی همون دستگاهیه که لگ میزنه. اگر تبلت مشکل داره وصل کن به کامپیوتر با usb debugging روشن، بیلد developement و auto connect profiler تیک خورده، روی یه فریم که از 16 میلی ثانیه بیشتر طول کشیده کلیک کن ببین cpu درگیر چیه. عکس بذار از profiler اینجا شاید بتونم کمک کنم.
آخرین ویرایش: 5 ماه, 3 هفته پیش ارسال توسط Jinjer.

پاسخ: مشکل لگ در یه بازی ساده 2 بعدی 5 ماه, 3 هفته پیش #140830

  • Night Sky
  • آفلاین
  • کاربر همیشگی سایت
  • ارسال: 114
  • دریافت تشكر: 71
خود تبلت که هیچ مشکلی نداره بازیهای دیگه کاملا سالم اجرا میشن
از خود ادیتور پروفایلر عکس گرفتم البته نمیدونستم دقیقا از کدوم نقطه عکس بگیرم و در میانه بازی در بخش سی پی یو گرافیک فیزیک و هر کدوم یه عکس گرفتم جداگانه بخش هایی که درگیری داشتن
s7.picofile.com/file/8384904192/1.PNG
s6.picofile.com/file/8384904200/2.PNG
s6.picofile.com/file/8384904234/3.PNG
s7.picofile.com/file/8384904242/4.PNG
s6.picofile.com/file/8384904250/5.PNG
s7.picofile.com/file/8384904318/6.PNG
تنظیماتی که گفتین برای نمایش پروفایلر هنگام اجرا در اندروید هم انجام دادم اما وصل نشد صفحه اندروید پرش میزد و رنگی میشد! اما تو پروفایلر هیچی نمایش نمیداد

کل بازی:
یه دوربین ثابت هست و پلیر هم هنگام کلیک موس بالا پایین میره به دستور
    void FixedUpdate() {
        if (isMove) {
            rb.velocity = Vector2.up * Time.fixedDeltaTime * speed;
        }
    }

البته جوری نوشتم که مجبور شدم دستور شرطی هم در فیکس اپدیت بدم که فک نکنم درست باشه!؟ اما ربطی نداره به کندی بازی
توی اپدیت هم دستور کنترل سرعت حرکت رو دادم که هنگام کلیک

speed += Time.deltaTime * speedForce;

که کم کم بالا بره اگه از مثلا سرعت از 500 کمتر بود و هنگام پایین امدن هم کلا سرعت 0 میکنم و جاذبه میدم.
یه بک گروند هم دادم به کواد که تکسچرش حرکت کنه که حتی دستور دادم اگه بیشتر بشه offset از مثلا 1 برگرده دوباره از 0 پوزیشن تکسچر تا بیشتر نره بالا! که نمیدون تاثیری داره یانه...
چند پوزیشن هم برای instantiate موانع که در گیم منیجر که با کوروتین شروع میشه و هر نیم ثانیه ایجاد میشه یه اسپرایت دایره شکل به سایز 64 پیکسل هست که همونارو گفتم در تابع استارت با ریجیدبادی kinematic برن به سمت چپ و کولایدر خالی هم در سمت چپ هست که بعد برخورد نابود میشن.
که همینا خودش لگ دارن هنگام حرکت در اندروید نسبتا ضعیف، اولش اینا رو هم توی فیکس اپدیت نوشته بودم حرکتش رو بعدش تنها تو استارت چون فرقی نداشت..
بالا هم گفتم این موانع رو کلا غیر فعال هم کردم اما توی تاخیر کنترل پلیر تفاوتی ایجاد نشد.

یه افکت حرکت هوا با پارتیکل و صدا لوپ هواپیما.

نمیدونم این بازی چطور درست کنم بهتره؟، پلیر رو حرکت بدم به جلو جدا از اینکه بالا پایین میره و دوربینو دنبالش بفرستم و بجاش موانع رو ثابت جلوتر از دوربین بسازم بدون حرکت موانع شاید اینطور روونتر بشه، تو بازی نسخه بالا ادرس دادم اگه اشتباه نکنم پلیر واقعا حرکت هم میکنه به جلو و دوربین دنبالش میره درسته ؟ نمیدونم شاید اینطور بسازم درست تر باشه.
خلاصه نمیدونم مشکل دقیقا چیه ممنون از راهنمایی
نسخه یونیتی هم 2017.4.16
آخرین ویرایش: 5 ماه, 3 هفته پیش ارسال توسط Night Sky.

پاسخ: مشکل لگ در یه بازی ساده 2 بعدی 5 ماه, 3 هفته پیش #140831

  • Jinjer
  • آفلاین
  • کاربر تازه وارد
  • ارسال: 32
  • دریافت تشكر: 45
اول از همه توی asset های standard یونیتی یه اسکریپت هست به اسم FPSCounter اونو بنداز روی یک Text که همیشه fps بازی رو روی هر دستگاهی داشته باشی.
using UnityEngine;
using UnityEngine.UI;

namespace UnityStandardAssets.Utility
{
    [RequireComponent(typeof(Text))]
    public class FPSCounter : MonoBehaviour
    {
        const float fpsMeasurePeriod = 0.5f;
        private int m_FpsAccumulator = 0;
        private float m_FpsNextPeriod = 0;
        private int m_CurrentFps;
        const string display = "{0} FPS";
        private Text m_Text;


        private void Start()
        {
            m_FpsNextPeriod = Time.realtimeSinceStartup + fpsMeasurePeriod;
            m_Text = GetComponent<TextMeshProUGUI>();
        }


        private void Update()
        {
            // measure average frames per second
            m_FpsAccumulator++;
            if (Time.realtimeSinceStartup > m_FpsNextPeriod)
            {
                m_CurrentFps = (int)(m_FpsAccumulator / fpsMeasurePeriod);
                m_FpsAccumulator = 0;
                m_FpsNextPeriod += fpsMeasurePeriod;
                m_Text.text = string.Format(display, m_CurrentFps);
            }
        }
    }
}

اگر fps داره 60 یا 30 ثابت نشون داده میشه و هیچوقت کمتر از 20 نمیشه اصلا بازیت مشکل performance نداره و کدت مشکل داره.
اگر fps میاد زیر 20 :

این Profiler که روی کامپیوتر گرفتی فایده نداره، روی تبلت لگ می زنه باید سعی کنی روی تبلت profiler بگیری. و روی مسئله لگ و تیک زدن بازی فقط cpu مهمه. همه اطلاعات لازم رو توی cpu usage نشون میده.
برای وصل شدن به اندروید یا باید usb debugging روی گوشی یا تبلت روشن باشه، به usb وصل کنی و adb هم داشته باشی. اگر وصل نمیشه میتونی از wifi هم استفاده کنی، دیتای گوشی رو خاموش کن با وای فای گوشیتو به همون اینترنتی که کامپیوتر وصله وصل کن، usb هم وصل کن به موبایل. توی یونیتی همون Developement Build و Autoconnect Profiler رو تیک بزن بعد Build And Run رو بزن، خودش باید صفحه profiler رو بیاره.

چند تا نکته همینجوری که خوندم به ذهنم رسید، یک اینکه از شیدر های Standard یونیتی برای موبایل استفاده نکن. اون quad که میگی روش background انداختی برای یه متریال از منوی mobile بساز. مثلا Mobile و Unlit چون کارت گرافیک موبایل توانایی رندر کردن یه سری شیدر های قوی رو نداره.
دو اینکه چرا روی همه دیوار ها rigidbody انداختی؟ نیازی نداره، حرکت دادن rigibody که kinematic هم هست خودش کلی روی perforamnce تاثیر داره. فقط کافیه روی هواپیما rigidbody بذاری و collider، بعد روی دیوار هات هم فقط collider داشته باشی.
سه، اگر توی کدت از Debug.Log زیاد استفاده کردی موقع بیلد گرفتن حداقل اونایی که زیاد Log میندازه رو کامنت کن، یا توی Start بزن
#if UNITY_EDITOR
  Debug.logger.logEnabled = true;
  #else
  Debug.logger.logEnabled = false;
  #endif

که فقط توی ادیتور لاگ بندازه. شاید باورت نشه که Debug.Log چقدر تاثیر داره توی performance بازی روی موبایل.
كاربران زیر تشكر كردند: Night Sky, +unity+

پاسخ: مشکل لگ در یه بازی ساده 2 بعدی 5 ماه, 3 هفته پیش #140834

  • Night Sky
  • آفلاین
  • کاربر همیشگی سایت
  • ارسال: 114
  • دریافت تشكر: 71
ممنون کد فریم هم تست کردم دیدم فریم هنگام بازی بین 12،14 تغییر میکنه یعنی دیگه مشخصه چقدر لگ داره...
در مورد اتصال پروفایلر به اندروید هم تونستم بیلد و ران بگیرم که مستقیم نصب شد رو دستگاه اما پروفایلر اصلا نمایش نمیداد که تنها راهی که هست همون اتصال وای فای هست که سر وقت تست میکنم بعدا.
در مورد شیدر هم من از unlit transparent استفاده میکردم که تغییر دادم به موبایل پارتیکل که نزدیکش شد به همون قبلی و همچنین هر چی متریال داشتم شیدرهاشو به قسمت موبایل تغییر دادم.
در مورد حرکت موانع گفتی ریجیدبادی ندم پس تابع اپدیت اضافه کنم و حرکت بدم؟
چون ریجیدبادی رو با کد
rb.velocity = Vector2.left * speed;
در استارت حرکت میدم و اگه ریجیدبادی رو حذف کنم چطور حرکت کنه...
لاگ ها هم که هیچی کلا بعد تست کامنت و یا حذف میکنم جدا از این هنگام بیلد کلا قسمت logging همه روی none گذاشتم.

پاسخ: مشکل لگ در یه بازی ساده 2 بعدی 5 ماه, 2 هفته پیش #140837

  • Jinjer
  • آفلاین
  • کاربر تازه وارد
  • ارسال: 32
  • دریافت تشكر: 45
Night Sky نوشته:

در مورد حرکت موانع گفتی ریجیدبادی ندم پس تابع اپدیت اضافه کنم و حرکت بدم؟
چون ریجیدبادی رو با کد
rb.velocity = Vector2.left * speed;
در استارت حرکت میدم و اگه ریجیدبادی رو حذف کنم چطور حرکت کنه...

باید profiler رو دید که چه چیزی باعث لگ میشه ولی حرکت دادن rigibody که kinematic باشه با فیزیک خودش کلی لگ میندازه، این یعنی هر فریم فیزیک کلا سیستم فیزیک روشن میشه kinematic رو حرکت میده دوباره خاموش میشه، فریم بعدی دوباره خاموش روشن.
وقتی از خاصیت فیزیکی نمیخوای استفاده کنی transform رو حرکت بده، اگر بازیت شبیه flappy bird هست پس دیوار ها دارن با سرعت ثابت حرکت می کنن. توی update مقدار transform.position رو به اندازه speed تغییر بده. مثلا :
private void Update() 
{
    transform.Translate(-1f * speed * Time.deltaTime, 0, 0);
}

ولی بازم مهمترین نکته اینه که هیچوقت بدون profile کردن optimize نکن. ممکنه مشکل لگ بازی هیچ ربطی به فیزیک و rigidbody نداشته باشه. اول profile بعد optimize
آخرین ویرایش: 5 ماه, 2 هفته پیش ارسال توسط Jinjer.
كاربران زیر تشكر كردند: Night Sky
  • صفحه:
  • 1
  • 2
زمان ایجاد صفحه: 0.23 ثانیه

جدیدترین آثار ارسالی در گالری

تبلیغات
تبلیغات

جدیدترین ارسالهای تالارگفتگو