[英]Dynamically Create Variables At Runtime
(是的,我實際上需要動態創建變量,而不僅僅是使用數組,列表或字典。)
我正在使用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次硬編碼。
為了簡單起見,a我需要這樣的東西:
int cacheAmount = 256;
for (int i = 0; i < cacheAmount; i++)
{
GameObject dynamicVariable>i< = (GameObject)Instantiate(projectile);
}
然后,我將不得不訪問dynamicVariable1,dynamicVariable2,dynamicVariable3,dynamicVariable4等。
如何在C#或JavaScript / UnityScript中進行此操作?
(再次使用數組,列表或字典,會產生太大的內存空間並影響性能)
您真的需要實例化256個gameObjects嗎? 您不能重用某些gameObjects嗎?
您不需要字典,也不需要動態變量(無論它們是什么),只需創建一個數組並使用RoundRobin訪問該數組中的下一個自由射彈即可。
在偽代碼上,您沒有將引用存儲在任何地方,而是在本地聲明它,然后忘記,因此無法訪問它們。
您想要做的更多是
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.