چطوری یک برنامه‌نویس ساده بزرگترین مشکل GTA Online رو حل کرد

شاید باورتون نشه ولی خب یک برنامه‌نویس ساده تونست توی فقط یک آخر هفته معمولی بزرگترین مشکلی که GTA Online باهاش دست و پنجه نرم میکرد رو حل کنه.

شناسه خبر: ۳۸۹۶۷۵
چطوری یک برنامه‌نویس ساده بزرگترین مشکل GTA Online رو حل کرد

راهنماتو- GTA Online بعد از گذشت 10 سال از انتشارش تونسته تبدیل به یک پدیده‌ای بشه که فکر نکنم مثلشو قبلا دیده باشیم و همچنان بتونه بفروشه. البته این فروش بالای این بازی رو میتونیم مدیون به‌روزرسانی مداوم و اضافه شدن محتواهای جدید توسط راکستار گیمز باشیم. ولی خب بیشتر راکستار با این بازی دنبال این بود که بیشترین سود رو با کمترین زحمت بدست بیاره، قضیه‌ای که باعث شده بود این استودیو به جای بهتر کردن بازی بیشتر روی اضافه کردن محتوای جدید و جذب پلیرهای جدید تمرکز کنه.

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

how-a-humble-coder-fixed-gta-online

به همین مناسبت و کشف فوق‌العاده‌ای که t0st کرده، اون توی وبلاگی که در مورد همین قضیه نوشته اومده تمام مشکلات و راه‌حل‌هاش رو به طور کامل توضیح داده. اگر خودتون سر از برنامه‌نویسی و کد زدن در میارین با توضیحاتی که داده کاملا دستتون میاد که داستان از چه قراره، و حتی اگر زیاد تو این حوزه تخصصی ندارین، اون با تصاویر خوبی که با MSPaint کشیده خیلی ساده تونسته لپ کلام رو براتون شرح بده. با راهنماتو همراه باشین تا نگاهی به زبون ساده به این کشف ساده و اساسی داشته باشیم.

بعد از اینکه حدود 5-6 دقیقه معطل این شده بود که شاید بالاخره بتونه برای یکمم که شده GTA Online اون روز بتونه بازی کنه، t0st بالاخره از دست این بازی کلافه شدش و دفعه بعدی که بازی رو باز کرد در کنارش Task Manager سیستمش رو هم رو باز کرد و چیز عجیبی چشمشو گرفت: بعد از یک دقیقه، دیدش که استفاده از CPUی کامپیوترش به طور چشمگیری بالا رفته، ولی خب استفاده از هارد و شبکه اینترنتش تقریبا صفر بود. این نشون می‌داد که زمان لودینگ طولانی بازی به خاطر سرورهای راک‌استار یا خواندن اطلاعات از درایو خودش نبود. به جای اون، یک چیزی داشت روی CPU به طور قایمکی اجرا می‌شد. یه چیزی که نیاز به پردازش زیادی داشت و فقط از یک Thread سی‌پی‌یویی که داشت استفاده میکرد.

how-a-humble-coder-fixed-gta-online

همین قضیه خیلی ذهنش رو مشغول کرد و با خودش شروع کرد به فکر کردن. t0st از ابزارها و برنامه‌های Debugging استفاده کردش تا بتونه دوتا مشکل اصلی رو پیدا کنه.

اول، بازی داشت یک فایل متنی از تمام آیتم‌های قابل خرید در بازی رو می‌خوند و بعد از هر بار که از 63000 آیتمی که توی بازی میبود رو میخوند، تعداد کاراکترهای فایل متنی 10 مگابایتی رو باز دوباره محاسبه می‌کرد. درسته خب این کار پیچیده و سنگینی برای پردازش نیستش، ولی خب انجامش 63000 بار به مجموع کل زمان پردازش‌هایی که بازی داره اضافه میکنه.

دوم، برای آماده کردن داده‌های آیتم‌هایی که وارد شده، بازی هم داده‌های مرتبط با آیتم رو (مثل اسمش، قیمتش، دسته‌بندیش، و ویژگی‌هاش) همراه با هش اون آیتم ( چیزی هست که بازی به هر آیتم میده تا بتونه اونارو شناسایی کنه، مثل کد ملی که شما دارین ) رو ثبت می‌کنه. حالا هر بار که بازی یک آیتم از لیست ذخیره میکرد که البته یادتون باشه که تا اون لحظه 63000 بار اتفاق می‌افتاد؛ در کنارش هش اون آیتمی که در حال ذخیره بود هم با هش تمام آیتم‌های دیگه‌ای که قبلا ذخیره شده بودن مقایسه می‌شد.

اون اولا که بخش آنلاین بازی اضافه شده بود این قضیه‌ای نبود که بخواد کسی نگران اتفاق افتادنش باشه، ولی با افزایش تعداد آیتم‌هایی که به بازی وارد می‌شدن، این مقایسه به مرور زمان بیشتر و بیشتر طول می‌کشید. به طور کلی، t0st تونست که با استفاده از این اطلاعات تخمین بزنه که هر وقت بازی لود کردنش طول میکشید، در واقعا بازی داشته 1,984,531,500 (حالا ما میگیم 2 میلیارد) مقایسه رو در پیش‌زمینه انجام میداده، که خودش باعث میشده CPU سیستم بدون انجام کاری مفیدی برای اجرای بازی بی دلیل مشغول باشه. حالا درسته بازی این کار رو انجام می‌ده تا مطمئن بشه که توی بازی هیچ آیتم تکراری در لیست نهایی نیستش، اما این بررسی در واقعیت خیلی هم بی‌فایده هستش چون اول بازی اصلا اون لیستی که برای آیتم‌های جدید تعبیه شده کاملاً خالیه و فایل ورودی اون هیچ آیتم تکراری هم نداره.

how-a-humble-coder-fixed-gta-online

برای حل این مشکلات هم t0st کد خودش رو نوشت و برخی از توابع بازی رو هم تونست بازنویسی کنه. برای حل مشکل "خوندن آیتم‌ها"، اون یک کش ابتدایی ایجاد کردش که طول لیست آیتم‌ها رو یک‌بار محاسبه می‌کند و هر زمان که کد بازی و همونی که راکستار نوشته نیاز به دونستن مقدار آیتمی رو داره، کد t0st وارد عمل میشه و همون مقداری که قبلا حساب کرده رو بدون انجام محاسبه دوباره برمی‌گردونه. این باعث می‌شود تعداد بررسی‌های انجام شده از 63000 به یک بار کم بشه و از انجام کلی کار بی‌مورد و الکی جلوگیری کنه.

راه‌حل دومی که برای این قضیه پیدا کردش تازه خیلی ساده‌تر از روش اولشه. چون t0st فکر می‌کرد که نیازی به بررسی آیتم‌های تکراری نیستش، کد او آیتم جدید رو بدون هیچ بررسی هشی اضافه می‌کنه. این به این معنیه که دیگه قرار نیست CPUتون حدود 2 میلیارد مقایسه کاملا عبث و بی‌مورد رو انجام بده و همین میتونه بازیتونو خیلی جلو بندازه.

how-a-humble-coder-fixed-gta-online

با انجام هر دو راه‌حل توی بازی، GTA Online میتونه خیلی سریعتر از زمانی که قبلا انتظارش رو داشتین اجرا بشه. در کامپیوتر خود t0st، با اجتناب از بررسی آیتم‌های تکراری، زمان بارگذاری بازی از شش دقیقه به چهار دقیقه و نیم کاهش پیدا کردش، و با اضافه کردن رفع مشکل خوندن آیتم‌ها، این زمان به یک دقیقه و 50 ثانیه هم حتی کاهش پیدا کرد. این یک کاهش 69.4 درصدی در زمان بارگذاریه که به نظر خیلی هم شگفت‌انگیز است.

اگر الان منتظر این هستین که بدونین چطوری میتونین این راه‌حل روی سیستم هاتون اجرا کنین، باید بگم که چند وقت بعد از کشف بزرگ t0st، خود راکستارگیمز با استفاده از راه حلی که اون معرفی کرده بود بالاخره تصمیم به درست کردن این مشکل در بازی کردش و به عنوان جایزه به t0st یک جایزه 10,000 دلاری هم تقدیم کرد.

نظرات
پربازدیدترین خبرها