2013-12-15 20 views
3

我正在研究一個基於OpenGL的遊戲,並且在我尋找將實體信息傳遞給渲染和網絡功能的強大方法時出現此問題。爲了多態性而使用矢量指針 - C++

事情是這樣的:

vector <DynamicEntity> DynamicEntities; 
vector <StaticEntity> StaticEntities; 

vector <Entity> *Entities; 

Entities.push_back(&DynamicEntities); 
Entities.push_back(&StaticEnt); 

Graphics.draw(Entities); 
Server.bufferData(Entities); 

的唯一信息Graphics.draw和Server.bufferData需要由實體,這既DynamicEntity和StaticEntity繼承遏制。

我知道這會工作:

vector <Entity*> Entities; 
for(uint32_t iEntity=0;iEntity<iNumEntities;iEntity++) 
{ 
    Entities.push_back(&DynamicEntities[iEntity]) 
} 
//(ad nauseam for other entity types) 

,但似乎非常低效的,並且必須考慮到不斷變化的實體的數量隨着比賽的進行。我對數據結構的基礎知識相對較少;所以這可能是一個愚蠢的問題,但我會感謝一些見解。

回答

3

您在顯示的for循環中執行的複製操作可能會非常快,以至於與繪製圖形的成本相比無法測量。您可以通過在循環前執行Entities.resize(...)並在循環中使用數組索引來加快速度。

您在問題的第一部分提出的解決方案將不起作用,因爲vector<StaticEntity>的數據佈局可能與vector<DynamicEntity>的佈局不同。對象數組不是多態的,由vector<>管理的存儲本質上是一個數組,其周圍有一些動態管理。

事實上,由於矢量存儲是陣列狀,如果你用數組索引替代push_backfor循環體將編譯爲類似的東西:

*p1++ = p2++; 

,編譯器甚至可以自動向量化!