Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环的内存过载_C#_Unity3d_Memory_Ram - Fatal编程技术网

C# 循环的内存过载

C# 循环的内存过载,c#,unity3d,memory,ram,C#,Unity3d,Memory,Ram,我正在制作一个对象生成脚本,在脚本开始时调用生成函数,其中有一个for循环,每次迭代都会创建一个对象。它首先为它选择一个随机的X位置,然后检查它是否在另一个预置坐标范围内,这样它们就不会产生太近或更糟的结果,一个在另一个预置坐标范围内。如果它与另一个预制件处于相同的坐标中,它将返回0,并且Z轴也将返回相同的值。它还拾取一个随机Y轴旋转,这样它就不会全部面向同一方向。在此之后,它生成预置并设置其坐标和旋转,然后检查X轴或Z轴上的坐标是否为0,如果这两个坐标中的任何一个为0,则返回一次迭代,最后生成

我正在制作一个对象生成脚本,在脚本开始时调用生成函数,其中有一个for循环,每次迭代都会创建一个对象。它首先为它选择一个随机的X位置,然后检查它是否在另一个预置坐标范围内,这样它们就不会产生太近或更糟的结果,一个在另一个预置坐标范围内。如果它与另一个预制件处于相同的坐标中,它将返回0,并且Z轴也将返回相同的值。它还拾取一个随机Y轴旋转,这样它就不会全部面向同一方向。在此之后,它生成预置并设置其坐标和旋转,然后检查X轴或Z轴上的坐标是否为0,如果这两个坐标中的任何一个为0,则返回一次迭代,最后生成的对象将被销毁,因此不会泛滥。这非常有效,但是当您想将其设置为生成太多对象时,它会淹没RAM,因为没有地方生成更多对象。我试着找到最高的X位置和最高的Z位置并将它们相乘,将它们都设置为正值,然后将它们除以预制件之间的空间,但这不起作用,因为它将其设置为一个非常高的数字。你将如何解决这个问题? 脚本:

使用UnityEngine;
使用系统集合;
公共类产卵器:单行为{
公共国际货币基金组织;
公共int-maxamontofprefabs;
私有int-currentprownedprefab;
公共浮动空格在前缀之间;
私有浮动位置X;
私人浮动定位;
私有浮动maxPositionX;
私有浮动maxz;
私有浮点乘法OSXZ;
私人布尔值为零;
公共游戏对象预制;
私有游戏对象点1;
私有游戏对象点2;
私有游戏对象当前繁殖;
私有向量2[]个位置;
无效开始(){
CurrentSpownedPrefact=0;
previousSpawnHadZero=假;
point1=gameObject.transform.GetChild(0).gameObject;
point2=gameObject.transform.GetChild(1).gameObject;
if(point1.transform.position.x>point2.transform.position.x)
maxPositionX=point1.transform.position.x;
其他的
maxPositionX=point2.transform.position.x;
if(point1.transform.position.z>point2.transform.position.z)
maxPositionZ=point1.transform.position.z;
其他的
maxPositionZ=point2.transform.position.z;
MultipledPosXz=maxPositionX*maxPositionZ;
if(乘以osxz<0)
multipledposxz+=multipledposxz+multipledposxz;
maxAmountOfPrefabs=Mathf.FloorPoint(MultipleedPosXz/前缀之间的空格);
if(AMONTOFPREFABS>maxAmountOfPrefabs)
amountOfPrefabs=最大amountOfPrefabs;
point1.GetComponent().enabled=false;
point2.GetComponent().enabled=false;
gameObject.GetComponent().enabled=false;
位置=新矢量2[amountOfPrefabs];
产卵预制(amountOfPrefabs);
}
空产卵预制件(整数金额){
对于(int i=0;i
代码需要调试的时间很长,但问题是显而易见的,它来自于
spawnpreabes
函数。当前,当您实例化一个预置时,您会检查生成的位置是否为
0
。如果
0
,则从
for
循环中的
i
中减去
1
,然后销毁实例化对象,然后从当前循环-1再次启动for循环

因此,
实例化
销毁
并在
for
循环中重复它的组合导致了内存问题

怎么办:

您必须重新编写整个函数,这也需要对整个代码进行修改。除非需要,否则不要实例化并销毁该循环中的对象

1。在
Start()
函数中,创建one预置

2。通过禁用其网格/精灵渲染器,使其在场景中不可见

3。在
for
循环中使用该预置来检查生成的位置是否有效。如果有效,现在可以在循环中创建/实例化对象


当您仅在
if(positionX!=0&&positionZ!=0)
时创建对象时,这可以防止实例化和销毁循环中的对象代码需要调试的时间很长,但问题是显而易见的,并且来自
spawnpreabes
函数。当前,当您实例化一个预置时,您会检查生成的位置是否为
0
。如果
0using UnityEngine;
using System.Collections;

public class PrefabSpawner : MonoBehaviour {

    public int amountOfPrefabs;
    public int maxAmountOfPrefabs;

    private int currentSpawnedPrefab;

    public float spaceBetweenPrefabs;

    private float positionX;
    private float positionZ;
    private float maxPositionX;
    private float maxPositionZ;
    private float multipliedPosXZ;

    private bool previousSpawnHadZero;

    public GameObject prefab;

    private GameObject point1;
    private GameObject point2;
    private GameObject currentSpawn;

    private Vector2[] positions;

    void Start () {

        currentSpawnedPrefab = 0;
        previousSpawnHadZero = false;

        point1 = gameObject.transform.GetChild (0).gameObject;
        point2 = gameObject.transform.GetChild (1).gameObject;

        if (point1.transform.position.x > point2.transform.position.x)
            maxPositionX = point1.transform.position.x;
        else
            maxPositionX = point2.transform.position.x;
        if (point1.transform.position.z > point2.transform.position.z)
            maxPositionZ = point1.transform.position.z;
        else
            maxPositionZ = point2.transform.position.z;

        multipliedPosXZ = maxPositionX * maxPositionZ;
        if (multipliedPosXZ < 0)
            multipliedPosXZ += multipliedPosXZ + multipliedPosXZ;
        maxAmountOfPrefabs = Mathf.FloorToInt (multipliedPosXZ / spaceBetweenPrefabs);

        if (amountOfPrefabs > maxAmountOfPrefabs)
            amountOfPrefabs = maxAmountOfPrefabs;

        point1.GetComponent<MeshRenderer> ().enabled = false;
        point2.GetComponent<MeshRenderer> ().enabled = false;
        gameObject.GetComponent<MeshRenderer> ().enabled = false;

        positions = new Vector2[amountOfPrefabs];
        SpawnPrefabs (amountOfPrefabs);
    }

    void SpawnPrefabs (int amount) {

        for (int i = 0; i < amount; i++) {

            if(previousSpawnHadZero)
                i -= 1;

            currentSpawn = (GameObject)Instantiate (prefab);

            positionX = GetRandomPositionX ();
            positionZ = GetRandomPositionZ ();

            currentSpawn.transform.position = new Vector3 (positionX, this.transform.position.y + currentSpawn.transform.localScale.y, positionZ);

            currentSpawnedPrefab += 1;

            if (positionX == 0 || positionZ == 0) {
                previousSpawnHadZero = true;
                currentSpawnedPrefab -= 1;
                Destroy (currentSpawn);
            }
            if (positionX != 0 && positionZ != 0) {
                previousSpawnHadZero = false;
                positionX = 0;
                positionZ = 0;
            }
        }
    }

    IEnumerator Pause () {

        yield return null;
    }

    float GetRandomPositionX () {

        //Finds a random position for the X axis and then checks it and returns either 0 if the position is taken or the position if not
    }

    float GetRandomPositionZ () {

        //Finds a random position for the Z axis and then checks it and returns either 0 if the position is taken or the position if not
    }

    bool CheckPositionAvailable (float pos, int axis) {

        //Checks if the position is available.
    }
}