移动数组中的元素

Move element in array

我有一个二维向量数组,指向游戏中的实体。该数组表示游戏世界的网格,以提高检测碰撞时的性能。当一个实体移动时,我检查它是否移动到另一个网格瓦片(当然),但这是一切都变得糟糕的地方。如果我在阵列更改时移动阵列中的对象 CPU 变为 100% 而不是 8% 并且游戏物理不再适用。

这是停止工作的更新功能:

    for (int i = 0; i < xGridCount; i++)
    {
        for (int j = 0; j < yGridCount; j++)
        {
            for (auto it : grid[i][j])
            {

                it->update(); 


                //update gridpos
                if ((int) it->x/gridSize != i || (int) it->y/gridSize != j)
                {
                    grid[it->x/gridSize][it->y/gridSize].emplace_back(std::move(it));
                }
            }
        }
    }

网格数组声明:

std::array<std::array<std::vector<std::shared_ptr<Entity>>, yGridCount>, xGridCount> grid;

"update gridpos" 是崩溃的地方。如果我将其注释掉,一切正常。

当然,我想出了我可以做些什么来修复它,我想过在碰撞检测中使用数组 only。但问题是我必须为每个对象保留 2 个指针,一个用于命中检测,一个用于 updating/rendering,这听起来不是一个好的解决方案。

为什么CPU这么重? 我还能怎么做?

for (auto it : grid[i][j])

it 是一个 shared_ptr,这会生成一个副本。无偿复制 shared_ptr 是一种性能损失。 (通常 it 代表 "iterator",所以我不确定你为什么称它为 it。)

grid[it->x/gridSize][it->y/gridSize].emplace_back(std::move(it));

这会将 shared_ptr it 移动到新图块的向量中,但是由于 it 是一个副本,它不会对 shared_ptr 中的 shared_ptr 做任何事情旧的。结果,它现在同时位于两个网格块中。


似乎有些混乱:std::move(单参数版本)没有移动任何东西;它只是将参数转换为右值以发出信号 "the contents of this object can be moved"。 shared_ptr/unique_ptr 移动构造函数本质上是移动指针对象的所有权,而不是智能指针对象本身。移出的智能指针(将处于空状态)将保留在它所在的容器中,直到您实际将其从容器中删除。