这是一个非常简单的问题。
假设我的渲染循环运行在60Hz,每次调用render()时,我绘制了所有游戏的建筑物,角色和风景,以使当前帧准备就绪。 每个实体都使用自己的RectangleShape实例进行绘制,RectangleShape是一个能够将纹理渲染到屏幕的类。 (我正在使用OpenGL,但它不应该是相关的)
RectangleShape是一个曾经分配过的类,为要绘制的“sprite”生成几何,有一些属性可以configuration,然后使用OpenGL渲染自己。
问题是,对于每个实体,我都分配了RectangleShape对象,在render()中进行configuration和渲染。 所以,在实践中,在render()里面有几十个如果不是这样的块:
// pseudocode RectangleShape entitySprite; entitySprite.setSize(); entitySprite.setTexture(); entitySprite.render();
我知道我没有使用预先分配的RectangleShape,已经configuration,我只调用render()的性能下降。 我知道这是最佳path,但我的问题是:
RectangleShape(数百次,每秒60次)的分配/释放是否会随着时间的推移而碎片化,从而降低整个程序的性能? 还是我可以安然无恙,尽管按需分配的性能是不变的,随着时间的推移不会退化?
我没有使用任何types的自定义分配器。 此外,请记住,RectangleShape构造函数在内部调整一个std :: vector,我认为这意味着一个堆分配。
谢谢
假设你使用的是C ++(这就是你的代码的样子),在函数内部创建RectangleShape
本地实例不会导致内存碎片。 这些variables是在堆栈上创建的,所以当函数返回时清除堆栈帧时,内存将干净地消失。
但是请注意,如果RectangleShape
本身使用new
或malloc()
(或者某些其他类似malloc()
的调用)在堆上分配内存,那么这些分配可能会导致内存碎片化,具体取决于其他堆分配发生和其他分配可能会持续多久。