C++中的复杂内存管理问题
Complex memory management issue in C++
我需要在C++中构思一个有效的粒子系统,它可以处理大量施加力的粒子
以下是要求:
-
动态高效地创建和消除大量粒子和力。
-
粒子存储x/y/z的位置和速度、质量、空气摩擦,也许还有其他一些特性。
-
粒子不需要扩展(没有继承图)。
-
力是多态对象,主要具有getAcceleration()虚拟方法。
-
可以对一个粒子施加几个力或不施加任何力。
-
一个力只适用于一个粒子,当这个粒子死亡时,该力就没有意义了,应该删除。
-
一个力可以包含多个粒子(包括应用该力的粒子)。
-
当一个粒子死亡(被移除)时,根据力的类型,涉及它的力可能也会死亡,也可能不会死亡。
-
引擎必须能够迭代每个帧的所有粒子和所有力,以便执行计算
我希望有一个漂亮而清晰的对象模型,这样它就可以很好地维护和扩展。
其他信息:
可以显示力(在屏幕上画小箭头),所以将它们建模为真实对象可能会很好
粒子通常由"物理对象"创建,该对象创建一个或多个粒子(对它们施加力),并可以随时移除它们(如果物理对象变得不动,如果它离开屏幕,或任何原因)
(注意,力不仅会由"物理物体"产生。)
到目前为止,我已经起草了一份草案,试图最大限度地减少动态分配,因为它们很慢,粒子很可能每秒都会大量出现和死亡。
#include <vector>
typedef double nb_t;
struct Particle {
nb_t x, y;
nb_t sx, sy;
nb_t mass;
nb_t air_friction;
};
class Force {
public:
virtual nb_t get_x_component() = 0;
virtual nb_t get_y_component() = 0;
virtual ~Force() = 0;
};
class Engine {
protected:
std::vector<Particle> particles;
std::vector<Force*> forces;
public:
void refresh();
void addParticle(Particle& p);
void removeParticle(int index);
// ...
};
但是,粒子的所有者(或者更确切地说,它的创造者,物理对象)应该如何跟踪其粒子,并能够命令将其移除
我认为智能指针可能很有用,但我不确定引用计数是否合适,因为死亡的粒子应该立即从内存中删除,让其他粒子被分配。
此外,是否有一个STL容器可以将我的对象存储在一个数组中(就像向量一样),而不考虑顺序(unordered_vvector?),但它会放置最后一个元素,而不是我们试图删除的元素,这样删除元素就不需要平移以下所有元素?
你认为什么是最好的?为了保持效率、清晰度和可扩展性,什么是一个好的折衷方案
关于对象的创建和删除,您永远不想调用new或delete,或者尽量减少这种情况。这种最小化可以通过创建内存池并将其用于对象分配来实现。
看起来你想要一个对象池——一个用于粒子,一个用于力。
http://pastie.org/private/ivmu9ogvrf5vurjrwuqmka
该代码是一个非常简单且不太健壮的内存池,但可以为您提供一些更好的实现方法
以下是关于体系结构的一些小观察,我将让其他人来解决内存管理本身的问题
虚拟调用需要同时处理尽可能多的粒子,因此您可能需要通过更密集的computeAccelerationsForParticles( std::vector<int>& particleIndices)
或computeAccelerationsForParticles( ParticleGroup& particleGroup)
来重新考虑单个getAcceleration()
接口。通过这种方式,虚拟调用的开销从每个粒子一次扩展到每个力组一次
这种体系结构意味着您需要通过力组来跟踪粒子。如果你想显示粒子特定的数据(比如力),你可以添加一个粒子调试结构,它只在不为空时更新,这样在进行"无窗口"模拟时就不会有那么大的开销
- 字符 * 未从重载运算符或内存管理问题正确返回
- Waveshare 电子纸 ESP32 板上的 HTTP 客户端管理问题
- c++中的内存管理问题
- C++堆栈内存管理问题
- C 内存管理问题,std :: vector nevere rase内存超出范围
- MPI 新手 - 关于'mpirun'如何工作和流程管理的一些问题
- 内存管理策略的问题
- C++中的复杂内存管理问题
- 有关资源管理器类的 RAII 问题
- CUDA 内存管理/类问题中的指针
- 执行命令行管理程序命令时出现性能问题
- 在 Qt5.3(mingw32) 中删除 QQuickView 的内存管理问题
- C++内存管理问题(分配大量内存,但从不释放内存)
- 内存管理容器设计问题 - 项目需要继承
- C++中管理内存泄漏的问题
- 在头文件中存储代码会导致c++中的内存管理问题吗?
- 内存管理问题
- 涉及类析构函数和删除运算符的一些内存管理问题
- CPP中字符串的内存管理问题
- c++纯虚拟方法内存管理问题