簡體   English   中英

STL容器,創建/銷毀速度

[英]STL Container, Speed of Creation/Destruction

背景:我正在為我的游戲引擎創建一個高效的(希望)碰撞檢測系統-當我在屏幕上放置大量對象時,它引入了一個小問題。 我的問題是這樣的:

我將定期添加和刪除對象,並且有幾個管理器類可以隨時跟蹤對象,這意味着需要從容器中添加和刪除這些對象。 我大部分時候都使用矢量和雙端隊列,這很好,但是我非常想提高系統的核心速度。

這樣的問題是:哪個容器((是否有STL)[最好是前者])為我提供了最快的元素添加,刪除和隨機訪問(順序無關緊要)?

我一直在考慮使用一個集合,我將遍歷元素,盡管不如我將要利用其他三個函數那樣頻繁。

附加信息:本質上,我將屏幕分成不確定大小的網格,當對象移動時,我將找到當前左上角所在的正方形,然后找到右下角(假定對象是正方形的)。當然),因此我將知道對象當前占據的所有網格位置。 當我進行碰撞檢測時,我只會對一個以上對象的網格位置進行檢查,當我檢查碰撞時,希望它會比我以前的系統快得多。

std::set不太可能提供更好的性能:它是基於節點的容器,因此每個元素都需要動態分配,這可能會很昂貴。

考慮使用std::vector :它提供對序列中所有元素的恆定時間隨機訪問,並在序列末尾進行恆定時間的插入和移除。

因為您說順序無關緊要,所以您還可以通過從序列的末尾移動元素以使其替換要刪除的元素,來從序列中間恆定地刪除任何元素。 像這樣的東西:

void remove_element(std::vector<Entity>& v, std::vector<Entity>::iterator it)
{
    std::vector<Entity>::iterator last_element_it = v.end() - 1;
    if (it != last_element_it) {
        using std::swap;
        swap(*it, *last_element_it);
    }
    v.erase(last_element_it);
}

哪個容器((是否有STL)[最好是前者])為我提供最快的元素添加,刪除和隨機訪問(順序無關緊要)?

沒有一個。 您必須選擇想要的東西。

在末尾添加std :: vector很快,從末尾刪除也是如此。 但是在其他任何地方插入/移除至少會造成一定程度的傷害。

無論在何處,從std :: list插入和刪除都將非常快,但是沒有隨機訪問權限。

一個std :: deque從頭到尾都有類似std :: vector的插入和刪除操作,並且確實具有隨機訪問權限。

我的問題是:您需要多長時間對碰撞對象列表進行一次隨機訪問? 您的大多數操作都不會遍歷列表嗎(對於每個對象,X都會這樣做)? 如果是這樣,我會去一個std :: list。

另外,您可以使用std :: map,其中地圖的鍵是某種唯一的實體ID。 這將使您的插入/刪除操作比std :: list慢(由於需要平衡的二叉樹),但是您可以通過標識符快速訪問實體。 這可能很重要。

在這方面,std :: map可能介於std :: vector / deque和std :: list之間。 插入/刪除的速度比列表慢,隨機訪問的速度比向量/雙端隊列慢,但是您同時獲得了兩者。

話雖這么說,我非常懷疑這種優化對您是否非常有用。 您將要擁有多少這些對象,也許幾千? 您多久接觸一次? 您是否真的認為您使用的容器類型將成為碰撞系統性能的重要因素?

在為容器而煩惱之前,請先優化您的碰撞算法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM