This media is not supported in your browser
VIEW IN TELEGRAM
«قهوه داغ ☕، کتاب خوب 📖 و یه پنجره رو به بارون 🌧
بعضی روزا همینا کافیه برای خوشحالی 🤍
تو امروزت چطور میگذره؟»
یلدا همه مبارک
بعضی روزا همینا کافیه برای خوشحالی 🤍
تو امروزت چطور میگذره؟»
یلدا همه مبارک
❤2
مطلب جدید
دوستان من یه موردی رو در مورد memory توی پروژه متوجه شدم! که مشخصا لازمه بگم! شاید یه سری هاتون این رو بدونید! وظیفه RAM یا همون memory تو یه بازی ذخیره تسکچر و مدل و Asset bundle هستش!
یه مشکلی در این زمینه وجود داره!
اونم اینه که وقتی دارید از یک scene به scene دیگه ای لود میشید این حافظه بصورت خودکار آزاد نمیشه و محتوای scene قبلی که دیگه داخلش نیستید رو نگه میداره و تبدیل به یه بار اضافی تو حافظه Memory میشه
دوستان من یه موردی رو در مورد memory توی پروژه متوجه شدم! که مشخصا لازمه بگم! شاید یه سری هاتون این رو بدونید! وظیفه RAM یا همون memory تو یه بازی ذخیره تسکچر و مدل و Asset bundle هستش!
یه مشکلی در این زمینه وجود داره!
اونم اینه که وقتی دارید از یک scene به scene دیگه ای لود میشید این حافظه بصورت خودکار آزاد نمیشه و محتوای scene قبلی که دیگه داخلش نیستید رو نگه میداره و تبدیل به یه بار اضافی تو حافظه Memory میشه
❤1
با تسک منیجر این رو باید چک کنید!
فرض کنید ما دو Scene با اسم های Menu و level 1 داریم!
حافظه ای که menu در Memory اشغال میکنه 350 مگابایت و حافظه level 1 قراره بگیره 600 مگابایت هستش!
بصورت اصولی و درست وقتی که شما از Menu به level 1 لود میشید! حافظه ای که menu اشغال کرده باید ازاد بشه! اما این اتفاق نمی افته و باعث میشه حجمی که بعد لود در Memory اشغال میشه 950 مگابایت (جمع هر دو scene) بشه!
فرض کنید ما دو Scene با اسم های Menu و level 1 داریم!
حافظه ای که menu در Memory اشغال میکنه 350 مگابایت و حافظه level 1 قراره بگیره 600 مگابایت هستش!
بصورت اصولی و درست وقتی که شما از Menu به level 1 لود میشید! حافظه ای که menu اشغال کرده باید ازاد بشه! اما این اتفاق نمی افته و باعث میشه حجمی که بعد لود در Memory اشغال میشه 950 مگابایت (جمع هر دو scene) بشه!
🔥1
و از همه بد تر وقتی دوباره از level 1 به menu برگردید این حجم باز هم افزایش پیدا میکنه!
با وجود اینکه یک بار دیتا های تکسچر ، مدل و Asset bundle در Memory ذخیره شدن , ولی ازشون استفاده نمیکنه و دوباره دیتا ها رو در RAM تولید میکنه! و اگر این حرکت چند دور تکرار بشه حافظه Memory RAM پر میشه و شاهد افت فریم خواهید بود!
با وجود اینکه یک بار دیتا های تکسچر ، مدل و Asset bundle در Memory ذخیره شدن , ولی ازشون استفاده نمیکنه و دوباره دیتا ها رو در RAM تولید میکنه! و اگر این حرکت چند دور تکرار بشه حافظه Memory RAM پر میشه و شاهد افت فریم خواهید بود!
❤1
پس در یک نتیجه کلی:
وقتی SceneManager.LoadScene() رو صدا میزنی، Unity به طور پیشفرض همه GameObjectها رو نابود میکنه، اما:
❌ تکسچرها و مدلها تو مموری میمونن
❌ Asset Bundleها آزاد نمیشن
❌ منابعی که بهشون reference دارن باقی میمونن
❌ Garbage Collection به طور خودکار کار نمیکنه
وقتی SceneManager.LoadScene() رو صدا میزنی، Unity به طور پیشفرض همه GameObjectها رو نابود میکنه، اما:
❌ تکسچرها و مدلها تو مموری میمونن
❌ Asset Bundleها آزاد نمیشن
❌ منابعی که بهشون reference دارن باقی میمونن
❌ Garbage Collection به طور خودکار کار نمیکنه
کد اصلی:
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;
public class SquirrelySceneManager : MonoBehaviour
{
// به جای LoadScene معمولی، از این استفاده کن
public void LoadSceneWithMemoryCleanup(string sceneName)
{
StartCoroutine(LoadSceneAndCleanup(sceneName));
}
IEnumerator LoadSceneAndCleanup(string sceneName)
{
// 1. Load Scene جدید
AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneName);
// 2. نگهداری Scene قبلی رو غیرفعال کن (برای جلوگیری از Drop فریم)
asyncLoad.allowSceneActivation = false;
// 3. منتظر بمون تا Loading تموم شه
while (!asyncLoad.isDone)
{
// فریم ریت رو نگه دار - اینجا میتونی Loading Screen نشون بدی
yield return null;
}
// 4. حالا Scene جدید رو فعال کن
asyncLoad.allowSceneActivation = true;
// 5. بعد از Load، Cleanup رو شروع کن
yield return new WaitForSeconds(0.1f); // کمی صبر کن
// 6. مهمترین قسمت - آزاد کردن منابع استفادهنشده
Resources.UnloadUnusedAssets();
// 7. فراخوانی اجباری Garbage Collection
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.GC.Collect();
Debug.Log("✅ Scene loaded & memory cleaned!");
}
// برای آنلود کردن دستی Assetهای بزرگ
public void UnloadBigAssets()
{
// مثال: آنلود تکسچرهای بزرگ که دیگه نیاز نداری
var bigTextures = Resources.FindObjectsOfTypeAll<Texture2D>();
foreach (var tex in bigTextures)
{
if (tex.name.Contains("Squirrely_Large"))
{
Resources.UnloadAsset(tex);
}
}
}
}
نگه داری فریم ریت:
public class SquirrelyLoadingScreen : MonoBehaviour
{
public Image loadingBar;
public Text loadingText;
public string[] squirrelFacts = {
"سنجابها میتونن 15 ساعت بخوابن...",
"دندونای سنجاب همیشه در حال رشدن..."
};
void Update()
{
// نمایش فکتهای ترسناک سنجابی
loadingText.text = squirrelFacts[Random.Range(0, squirrelFacts.Length)];
}
}
دیباگ مموری:
void Update()
{
if (Input.GetKeyDown(KeyCode.M))
{
// نمایش مموری فعلی
long memory = System.GC.GetTotalMemory(false) / 1024 / 1024;
Debug.Log($"Memory Usage: {memory} MB");
// نمایش تعداد Textureهای لود شده
var textures = Resources.FindObjectsOfTypeAll<Texture2D>();
Debug.Log($"Loaded Textures: {textures.Length}");
}
}
این سه کد تو تست اولیه هست تا بتونم این مشکل رو تو بحث Memory RAM حل کنم!
❤1🔥1
🚨اینترنت ها هم داره ضعیف میشه ناجور 🚨
🛜 حالا باید دوباره بگردیم دنبال فیلترشکن جوابگو📉
🛜 حالا باید دوباره بگردیم دنبال فیلترشکن جوابگو📉
امروز اومدم کارکتر جدید بازی رو از روی مدل پروتوتایپش که خیلی زیادی سنگینه تکمیل کنم! 50 درصد کار رفته! بنظرتون تا امشب تکمیل میشه؟