Çözüldü Unity çok RAM harcıyor

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

TurtleCanUsePC

Hectopat
Katılım
3 Haziran 2021
Mesajlar
1.116
Çözümler
8
Daha fazla  
Cinsiyet
Erkek
Subway surfers tarzı bir oyun yapmak istedim. Neredeyse hiçbir şey kullanmadım ona rağmen 10GB'a yakın RAM harcıyor(8-10 arası). Test etmek için oynatma tuşuna basınca birden 10GB RAM kullanımı oluyor. Normalde iken 500 MB filan.

1657634440254.png


Kullandığım şeyler Blender'dan yaptığım 1 adet tren, ray ve engeller(altından geçmeli ve zıplamalı)
5 tanede script yazdım. Toplam 230 küsur satırdan fazla kod yok.
 
Çözüm
Atayim hemen.

Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EndlessSection : MonoBehaviour.
{
 [SerializeField] private float xpos = 0f;
 [SerializeField] private float xposForCoin = 0f;
 [SerializeField] private float zposForCoin = 0f;
 [SerializeField] private GameObject section;
 [SerializeField] private GameObject Player;
 [SerializeField] private GameObject Coin;
 private bool Create = false;

 void Update()
 {
 if(Create == false)
 {
 Create = true;
 StartCoroutine(CreateSection());
 }

 StartCoroutine(CreateCoin());
 }

 private void Start()
 {
 Instantiate(Player);
 }

 IEnumerator CreateSection()
 {

 GameObject hello = Instantiate(section,new Vector3(xpos,0,0),Quaternion.identity);
 xpos += -39f;
 yield return new WaitForSeconds(1);
 Create = false;
 Destroy(hello,5);
 }

 IEnumerator CreateCoin()
 {
 Instantiate(Coin, new Vector3(xpos, 0, zposForCoin), Quaternion.identity);
 yield return new WaitForSeconds(0.2f);

 }

}

2 tane daha var onları da atıyorum+

Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EndlessEnemy : MonoBehaviour.
{

 [SerializeField] private GameObject[] enemies;
 [SerializeField] public static float zpos;
 [SerializeField] private float xpos;
 [SerializeField] private int selectedEnemies;
 [SerializeField] private float selectedRoad;
 private bool Create = false;

 void Update()
 {
 if(Create == false)
 {
 Create = true;
 StartCoroutine(Hello());
 }
 }

 IEnumerator Hello()
 {

 xpos += -39;
 selectedEnemies = Random.Range(0, 3);
 selectedRoad = Random.Range(0, 3);
 if(selectedRoad == 0)
 {
 zpos = -10;
 }else if(selectedRoad == 1)
 {
 zpos = -2;
 }else if(selectedRoad == 2)
 {
 zpos = 6;
 }
 GameObject Hello = Instantiate(enemies[selectedEnemies], new Vector3(xpos, 0, zpos), Quaternion.identity);
 if (selectedEnemies == 0)
 {
 Hello.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f);
 Hello.transform.eulerAngles = new Vector3(0, 270, 0);
 }else if(selectedEnemies == 1)
 {
 Hello.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f);
 Hello.transform.eulerAngles = new Vector3(0, 270, 0);
 }else if(selectedEnemies == 2)
 {
 Hello.transform.eulerAngles = new Vector3(0, 90, 0);
 }
 yield return new WaitForSeconds(1);
 Create = false;
 Destroy(Hello, 5);
 }
}

Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Controller : MonoBehaviour.
{
 bool İsdead;
 private float speed = -30f;
 private float jumpSpeed = 10f;
 Rigidbody rb;
 [SerializeField] private bool İsGrounded;
 [SerializeField] public static int Score;

 void Start()
 {
 rb = GetComponent<Rigidbody>();
 }

 void Update()
 {

 while (true)
 {
 StartCoroutine(Hello());
 }

 if (Input.GetKeyDown(KeyCode.D))
 {
 rb.transform.Translate(0, 0, 12);
 }

 if (Input.GetKeyDown(KeyCode.A))
 {
 rb.transform.Translate(0, 0,-12);
 }

 if (Input.GetKeyDown(KeyCode.Space))
 {
 rb.AddForce(Vector2.up * jumpSpeed, ForceMode.Impulse);
 }

 if (İsdead == true)
 {
 //SceneManager ile menüye gönder;
 }
 }
 private void OnCollisionEnter(Collision collision)
 {
 if(collision.gameObject.tag == "zemin")
 {
 İsGrounded = true;
 }
 else.
 {
 İsGrounded = false;
 }

 if (collision.gameObject.tag == "Enemy")
 {
 İsdead = true;
 }

 if(collision.gameObject.tag == "Money")
 {
 Score++;
 Destroy(collision.gameObject);
 }

 }

 IEnumerator Hello()
 {
 transform.Translate(-2, 0, 0);
 yield return new WaitForSeconds(0.2f);
 }

}

5 tane script var ama diğer 2'si boş. Yani kodlar bunlar.

Update içerisinde coroutine başlatmışsın sürekli, ilk olarak onları oradan kaldır start kısmına falan al.
3. kodda da aynısı var hatta while(true) var Update içerisinde ve onun içinde coroutine başlatmışsın. 10GB RAM kullanması normal.
Coroutineleri Start metodunda çalıştırıp, corotuine içerisinde while çalıştırabilirsin.

Mesela

C#:
IEnumerator Hello()

{

while(true)
{

 transform.Translate(-2, 0, 0);
 yield return new WaitForSeconds(0.2f);

}

yield return null;

}

}

Bu yöntemi diğerlerine de uygula ve Update içerisinde startcoroutine yazma, starta yaz.
Kodları atar mısın? Muhtemelen bellek taşmasına sebep olacak bir kod yazdın.
 
Kodları atar mısın? Muhtemelen bellek taşmasına sebep olacak bir kod yazdın.

Atayim hemen.

Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EndlessSection : MonoBehaviour.
{
 [SerializeField] private float xpos = 0f;
 [SerializeField] private float xposForCoin = 0f;
 [SerializeField] private float zposForCoin = 0f;
 [SerializeField] private GameObject section;
 [SerializeField] private GameObject Player;
 [SerializeField] private GameObject Coin;
 private bool Create = false;

 void Update()
 {
 if(Create == false)
 {
 Create = true;
 StartCoroutine(CreateSection());
 }

 StartCoroutine(CreateCoin());
 }

 private void Start()
 {
 Instantiate(Player);
 }

 IEnumerator CreateSection()
 {

 GameObject hello = Instantiate(section,new Vector3(xpos,0,0),Quaternion.identity);
 xpos += -39f;
 yield return new WaitForSeconds(1);
 Create = false;
 Destroy(hello,5);
 }

 IEnumerator CreateCoin()
 {
 Instantiate(Coin, new Vector3(xpos, 0, zposForCoin), Quaternion.identity);
 yield return new WaitForSeconds(0.2f);

 }

}

2 tane daha var onları da atıyorum+

Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EndlessEnemy : MonoBehaviour.
{

 [SerializeField] private GameObject[] enemies;
 [SerializeField] public static float zpos;
 [SerializeField] private float xpos;
 [SerializeField] private int selectedEnemies;
 [SerializeField] private float selectedRoad;
 private bool Create = false;

 void Update()
 {
 if(Create == false)
 {
 Create = true;
 StartCoroutine(Hello());
 }
 }

 IEnumerator Hello()
 {

 xpos += -39;
 selectedEnemies = Random.Range(0, 3);
 selectedRoad = Random.Range(0, 3);
 if(selectedRoad == 0)
 {
 zpos = -10;
 }else if(selectedRoad == 1)
 {
 zpos = -2;
 }else if(selectedRoad == 2)
 {
 zpos = 6;
 }
 GameObject Hello = Instantiate(enemies[selectedEnemies], new Vector3(xpos, 0, zpos), Quaternion.identity);
 if (selectedEnemies == 0)
 {
 Hello.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f);
 Hello.transform.eulerAngles = new Vector3(0, 270, 0);
 }else if(selectedEnemies == 1)
 {
 Hello.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f);
 Hello.transform.eulerAngles = new Vector3(0, 270, 0);
 }else if(selectedEnemies == 2)
 {
 Hello.transform.eulerAngles = new Vector3(0, 90, 0);
 }
 yield return new WaitForSeconds(1);
 Create = false;
 Destroy(Hello, 5);
 }
}

Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Controller : MonoBehaviour.
{
 bool İsdead;
 private float speed = -30f;
 private float jumpSpeed = 10f;
 Rigidbody rb;
 [SerializeField] private bool İsGrounded;
 [SerializeField] public static int Score;

 void Start()
 {
 rb = GetComponent<Rigidbody>();
 }

 void Update()
 {

 while (true)
 {
 StartCoroutine(Hello());
 }

 if (Input.GetKeyDown(KeyCode.D))
 {
 rb.transform.Translate(0, 0, 12);
 }

 if (Input.GetKeyDown(KeyCode.A))
 {
 rb.transform.Translate(0, 0,-12);
 }

 if (Input.GetKeyDown(KeyCode.Space))
 {
 rb.AddForce(Vector2.up * jumpSpeed, ForceMode.Impulse);
 }

 if (İsdead == true)
 {
 //SceneManager ile menüye gönder;
 }
 }
 private void OnCollisionEnter(Collision collision)
 {
 if(collision.gameObject.tag == "zemin")
 {
 İsGrounded = true;
 }
 else.
 {
 İsGrounded = false;
 }

 if (collision.gameObject.tag == "Enemy")
 {
 İsdead = true;
 }

 if(collision.gameObject.tag == "Money")
 {
 Score++;
 Destroy(collision.gameObject);
 }

 }

 IEnumerator Hello()
 {
 transform.Translate(-2, 0, 0);
 yield return new WaitForSeconds(0.2f);
 }

}

5 tane script var ama diğer 2'si boş. Yani kodlar bunlar.
 
Son düzenleme:
Atayim hemen.

Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EndlessSection : MonoBehaviour.
{
 [SerializeField] private float xpos = 0f;
 [SerializeField] private float xposForCoin = 0f;
 [SerializeField] private float zposForCoin = 0f;
 [SerializeField] private GameObject section;
 [SerializeField] private GameObject Player;
 [SerializeField] private GameObject Coin;
 private bool Create = false;

 void Update()
 {
 if(Create == false)
 {
 Create = true;
 StartCoroutine(CreateSection());
 }

 StartCoroutine(CreateCoin());
 }

 private void Start()
 {
 Instantiate(Player);
 }

 IEnumerator CreateSection()
 {

 GameObject hello = Instantiate(section,new Vector3(xpos,0,0),Quaternion.identity);
 xpos += -39f;
 yield return new WaitForSeconds(1);
 Create = false;
 Destroy(hello,5);
 }

 IEnumerator CreateCoin()
 {
 Instantiate(Coin, new Vector3(xpos, 0, zposForCoin), Quaternion.identity);
 yield return new WaitForSeconds(0.2f);

 }

}

2 tane daha var onları da atıyorum+

Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EndlessEnemy : MonoBehaviour.
{

 [SerializeField] private GameObject[] enemies;
 [SerializeField] public static float zpos;
 [SerializeField] private float xpos;
 [SerializeField] private int selectedEnemies;
 [SerializeField] private float selectedRoad;
 private bool Create = false;

 void Update()
 {
 if(Create == false)
 {
 Create = true;
 StartCoroutine(Hello());
 }
 }

 IEnumerator Hello()
 {

 xpos += -39;
 selectedEnemies = Random.Range(0, 3);
 selectedRoad = Random.Range(0, 3);
 if(selectedRoad == 0)
 {
 zpos = -10;
 }else if(selectedRoad == 1)
 {
 zpos = -2;
 }else if(selectedRoad == 2)
 {
 zpos = 6;
 }
 GameObject Hello = Instantiate(enemies[selectedEnemies], new Vector3(xpos, 0, zpos), Quaternion.identity);
 if (selectedEnemies == 0)
 {
 Hello.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f);
 Hello.transform.eulerAngles = new Vector3(0, 270, 0);
 }else if(selectedEnemies == 1)
 {
 Hello.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f);
 Hello.transform.eulerAngles = new Vector3(0, 270, 0);
 }else if(selectedEnemies == 2)
 {
 Hello.transform.eulerAngles = new Vector3(0, 90, 0);
 }
 yield return new WaitForSeconds(1);
 Create = false;
 Destroy(Hello, 5);
 }
}

Kod:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Controller : MonoBehaviour.
{
 bool İsdead;
 private float speed = -30f;
 private float jumpSpeed = 10f;
 Rigidbody rb;
 [SerializeField] private bool İsGrounded;
 [SerializeField] public static int Score;

 void Start()
 {
 rb = GetComponent<Rigidbody>();
 }

 void Update()
 {

 while (true)
 {
 StartCoroutine(Hello());
 }

 if (Input.GetKeyDown(KeyCode.D))
 {
 rb.transform.Translate(0, 0, 12);
 }

 if (Input.GetKeyDown(KeyCode.A))
 {
 rb.transform.Translate(0, 0,-12);
 }

 if (Input.GetKeyDown(KeyCode.Space))
 {
 rb.AddForce(Vector2.up * jumpSpeed, ForceMode.Impulse);
 }

 if (İsdead == true)
 {
 //SceneManager ile menüye gönder;
 }
 }
 private void OnCollisionEnter(Collision collision)
 {
 if(collision.gameObject.tag == "zemin")
 {
 İsGrounded = true;
 }
 else.
 {
 İsGrounded = false;
 }

 if (collision.gameObject.tag == "Enemy")
 {
 İsdead = true;
 }

 if(collision.gameObject.tag == "Money")
 {
 Score++;
 Destroy(collision.gameObject);
 }

 }

 IEnumerator Hello()
 {
 transform.Translate(-2, 0, 0);
 yield return new WaitForSeconds(0.2f);
 }

}

5 tane script var ama diğer 2'si boş. Yani kodlar bunlar.

Update içerisinde coroutine başlatmışsın sürekli, ilk olarak onları oradan kaldır start kısmına falan al.
3. kodda da aynısı var hatta while(true) var Update içerisinde ve onun içinde coroutine başlatmışsın. 10GB RAM kullanması normal.
Coroutineleri Start metodunda çalıştırıp, corotuine içerisinde while çalıştırabilirsin.

Mesela

C#:
IEnumerator Hello()

{

while(true)
{

 transform.Translate(-2, 0, 0);
 yield return new WaitForSeconds(0.2f);

}

yield return null;

}

}

Bu yöntemi diğerlerine de uygula ve Update içerisinde startcoroutine yazma, starta yaz.
 
Çözüm
De.

Update içerisinde coroutine başlatmışsın sürekli, ilk olarak onları oradan kaldır start kısmına falan al.
3. kodda da aynısı var hatta while(true) var Update içerisinde ve onun içinde coroutine başlatmışsın. 10GB RAM kullanması normal.
Coroutineleri start metodunda çalıştırıp, corotuine içerisinde while çalıştırabilirsin.

Mesela.

C#:
IEnumerator Hello()

{

while(true)
{

 transform.Translate(-2, 0, 0);
 yield return new WaitForSeconds(0.2f);

}

yield return null;

}

}

Bu yöntemi diğerlerine de uygula ve Update içerisinde startcoroutine yazma, starta yaz.

Deniyorum şimdi.

Son dediğiniz kısımı yapınca düzeldi teşekkür ederim. İlk 2 kodda Update içinde yazmamım sebebi zaten tekrarlanmasını istemem. Koşul eklediğimden waitforsecond bittikten sonra çalışıyorlar böylece karakterin koştuğu nesne sürekli uzamak yerine koşul sağlandıkça uzuyor.
 
Son düzenleme:
De.



Deniyorum şimdi.

Son dediğiniz kısımı yapınca düzeldi teşekkür ederim. İlk 2 kodda Update içinde yazmamım sebebi zaten tekrarlanmasını istemem. Koşul eklediğimden waitforsecond bittikten sonra çalışıyorlar böylece karakterin koştuğu nesne sürekli uzamak yerine koşul sağlandıkça uzuyor.
Tekrarlanacak Coroutineleri update içerisine değil, starta yaz ve yaptığım gibi while döngüsü içine al.
 
Update içerisinde coroutine başlatmışsın sürekli, ilk olarak onları oradan kaldır start kısmına falan al.
3. kodda da aynısı var hatta while(true) var Update içerisinde ve onun içinde coroutine başlatmışsın. 10GB RAM kullanması normal.
Coroutineleri start metodunda çalıştırıp, corotuine içerisinde while çalıştırabilirsin.

Mesela.

C#:
IEnumerator Hello()

{

while(true)
{

 transform.Translate(-2, 0, 0);
 yield return new WaitForSeconds(0.2f);

}

yield return null;

}

}

Bu yöntemi diğerlerine de uygula ve Update içerisinde startcoroutine yazma, starta yaz.

Bir sorum daha olacak karakterim yere çok yavaş düşüyor nedeni ne olabilir?
 

Bu konuyu görüntüleyen kullanıcılar

Technopat Haberler

Geri
Yukarı