Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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_Unityscript - Fatal编程技术网

C# 在运行时动态创建变量

C# 在运行时动态创建变量,c#,unity3d,unityscript,C#,Unity3d,Unityscript,(是的,我实际上需要动态创建变量,而不仅仅是使用数组、列表或字典。) 我正在开发一款使用Unity的视频游戏。 我看到炮弹从大炮中射出。起初,我使用Unity的“Object.Instantiate”方法动态创建投射物(很好,所以我知道这是可以做到的)。这会导致我的游戏在弹丸被载入内存时中断 我的解决方案是创建一个对象缓存/对象池。 对象缓存使用Unity的“Object.Instantiate”方法在开始游戏之前将游戏对象的“cacheAmount”放入字典中 当“cacheAmount”小于

(是的,我实际上需要动态创建变量,而不仅仅是使用数组、列表或字典。)

我正在开发一款使用Unity的视频游戏。 我看到炮弹从大炮中射出。起初,我使用Unity的“Object.Instantiate”方法动态创建投射物(很好,所以我知道这是可以做到的)。这会导致我的游戏在弹丸被载入内存时中断

我的解决方案是创建一个对象缓存/对象池。 对象缓存使用Unity的“Object.Instantiate”方法在开始游戏之前将游戏对象的“cacheAmount”放入字典中

当“cacheAmount”小于64时,这对性能产生了奇迹般的影响。如果“cacheAmount”增加到64以上,则ObjectCache的性能比使用Unity的“Object.Instantiate”方法差

我猜了一下,发现字典的内存空间太大了,访问整个区块所花的时间是导致游戏速度减慢的原因

我决定将字典分成8卷,每个卷有8个对象,第1-8卷共有64个对象。这些较小的卷再次提高了我的性能

我拨弄了一下,用8个对象硬编码了32卷。这允许发射256枚射弹,而不会影响性能

最理想的情况是,我根本不使用字典,只需创建变量的“cacheAmount”,然后循环遍历所有变量。通过这种方式,我可以更改cacheAmount,缓存256个或更多的单个对象,而无需事先对它们进行256次硬编码

为了简单起见,我需要这样的东西:

int cacheAmount = 256;
    for (int i = 0; i < cacheAmount; i++)
    {
        GameObject dynamicVariable>i< = (GameObject)Instantiate(projectile);
    }
int cacheAmount=256;
对于(int i=0;ii<=(GameObject)实例化(投射物);
}
然后我必须访问dynamicVariable1、dynamicVariable2、dynamicVariable3、dynamicVariable4等等

我如何在C#或JavaScript/UnityScript中实现这一点


(再次使用数组、列表或字典会产生过大的内存空间并影响性能)

您真的需要实例化256个游戏对象吗?你不能重复使用一些游戏对象吗?

你不需要字典,也不需要动态变量(不管它们是什么),只需创建一个数组并使用循环访问数组中的下一个自由投射物即可

在伪代码上,您没有将引用存储在任何地方,您在本地声明它,然后忘记它,因此无法访问它们

你想做的更多的是沿着

int cacheAmount = 256;
GameObject[] cache=new GameObject[cacheAmount];
int nextObjectIndex=0;
void CreateCache()
{
    for (int i = 0; i < cacheAmount; i++)
    {
        cache[i] = (GameObject)Instantiate(projectile);
    }
}

GameObject GetFromCache()
{
   GameObject nextObject=cache[nextObjectIndex];
   nextObjectIndedx++;
   if (nextObjectIndex>=cacheAmount) nextObjectIndex=0;
   return nextObject;
}
int cacheAmount=256;
GameObject[]缓存=新的GameObject[cacheAmount];
int nextObjectIndex=0;
void CreateCache()
{
对于(int i=0;i=cacheAmount)nextObjectIndex=0;
返回下一个对象;
}

你能详细解释一下“内存空间太大”是什么意思吗?那句话毫无意义。如果你的字典性能很差,那么你还有其他问题——字典没有错。也许您的
GetHashCode
方法实现得不好?很难知道-但它肯定不是字典本身。我必须同意西蒙的观点,也许会发布一些代码。您发布的简化示例完全可以与数组配合使用。唯一的问题是,一次实例化256个游戏对象可能会导致打嗝,但仅此而已,由于不从arrayNo检索或存储内容,您不需要动态创建变量。数组和字典都很好。在测试数组、列表、字典等等之后,你能给我们看看你的基准测试结果吗?