C++ Vector.reserve()和分配效率(C+;+;)
我试图在游戏中优化投射物的组织C++ Vector.reserve()和分配效率(C+;+;),c++,performance,vector,C++,Performance,Vector,我试图在游戏中优化投射物的组织 我读到我应该避免在游戏运行时分配,以避免性能问题。因此,如果我在游戏状态开始时用reserve(1000)初始化一个向量,并在运行时通过push_back(sparlove())添加投射对象;这会导致“分配”吗?还是只是用东西填满已经分配的空间,而且是超快的;D根据射弹的可移动性,将射弹放置在向量中的不同方法具有不同的成本。从复制射弹到移动射弹,再到在原地建造射弹 但是还有一种更快的方法,即重用 在游戏开始前建造所有射弹,然后一直重复使用射弹 这将是非常快的,因为
我读到我应该避免在游戏运行时分配,以避免性能问题。因此,如果我在游戏状态开始时用reserve(1000)初始化一个向量,并在运行时通过push_back(sparlove())添加投射对象;这会导致“分配”吗?还是只是用东西填满已经分配的空间,而且是超快的;D根据射弹的可移动性,将射弹放置在向量中的不同方法具有不同的成本。从复制射弹到移动射弹,再到在原地建造射弹 但是还有一种更快的方法,即重用
在游戏开始前建造所有射弹,然后一直重复使用射弹 这将是非常快的,因为您不需要超过1000个元素。当您使用emplace\u back时,速度会更快,因为您可以避免可能的副本。@Surt push\u back支持移动语义什么是
投射物
?它可以移动吗?向量中有多少元素vector
毕竟提供了摊销常数push_back()
@AntoineMorrier,没错,但比move更快的是根本不移动或复制,构建到位。我尝试了重用方法,但它让我头疼:因为我在每场比赛中循环所有“活动”投射物,我想避免检查(投射物[I].active==true),但要使第一个“索引x”元素处于活动状态并调整x。如果我重复使用,一个投射物从活动变为非活动,我首先必须找到它在向量中的位置(通过所有活动元素循环),将它放在向量的末尾,并将每个具有较高索引的对象的位置调整为-1。这真的有效吗?如果你有两个变量,第一个是第一个活动的投射物,第二个是最后一个活动的投射物。这将减少您必须检查的条目数。但是,射弹的大小和组成也决定了它移动/复制的速度。另一种方法是,如果活动射弹较大,则有一个向量,其中只包含其入口编号。