2014-09-01 106 views
0

(是的,我确实需要动态地创建变量,而不是仅仅使用数组,列表或字典)。动态创建变量在运行时

我开发使用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); 
    } 

然后我会在访问dynamicVariable1,dynamicVariable2,dynamicVariable3,dynamicVariable4等

我如何去这在C#或的JavaScript/UnityScript?

(再次使用数组,列表或字典,国债收益率的存储空间过大并影响性能)

+0

你能详细说明你的意思是“内存空间太大”吗?这种说法根本没有意义。如果你的字典表现不佳,你还有其他问题 - 字典没有错。也许你有一个糟糕的'GetHashCode'方法?很难知道 - 但它绝对不是字典本身。 – 2014-09-01 10:41:28

+0

我必须同意西蒙,也许发布一些代码。你发布的简化示例对数组完全可以工作。唯一的问题是,一次实例化256个GameObjects可能会导致打嗝,但仅限于此,而不是从数组中检索或存储事物 – Tom 2014-09-01 10:45:41

+0

不,您不需要动态创建变量。数组和字典都很好。 – LearnCocos2D 2014-09-01 12:52:41

回答

0

你真的需要实例256个gameObjects?你不能重用一些gameObjects吗?