gpt4 book ai didi

c++ - 移动数组中的元素

转载 作者:行者123 更新时间:2023-11-30 03:56:01 27 4
gpt4 key购买 nike

我有一个指向游戏中实体的二维 vector 数组。该数组表示游戏世界的网格,以提高检测碰撞时的性能。当一个实体移动时,我检查它是否移动到另一个网格瓦片(当然),但这是一切都变得糟糕的地方。如果我在阵列更改时移动阵列中的对象,则图 block 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;

“更新网格位置”是它崩溃的地方。如果我将其注释掉,一切正常。

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

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

最佳答案

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

是一个shared_ptr,这会产生一个拷贝。无偿复制 shared_ptr 是一种性能损失。 (通常 it 代表“迭代器”,所以我不确定你为什么称它为 it。)

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

这会将 shared_ptr it 移动到新图 block 的 vector 中,但是因为 it 是一个拷贝,所以它不会做任何事情旧版本中的 shared_ptr。因此,它现在同时位于两个网格 block 中。


似乎有些困惑:std::move(单参数版本)不移动任何东西;它只是将参数转换为右值以表示“可以移动该对象的内容”。 shared_ptr/unique_ptr 移动构造函数实质上移动了指针对象的所有权,而不是智能指针对象本身。移出的智能指针(将处于空状态)将保留在它所在的容器中,直到您实际将其从容器中删除。

关于c++ - 移动数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28717453/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com