我正在开展多项游戏(此处为https://arcade.ly/games/asteroids/),为了在某些浏览器/设备上保持帧速率更加可靠,我将会这样做。 m使用对象池来处理频繁创建的对象,例如粒子。我每秒创建数百个,有时甚至数千个粒子,因此重新使用它们理论上应该稳定内存使用并导致由于GC暂停而导致的问题减少。这实际上只是移动设备上的一个问题,但无论如何。
我编写了一个相当基本的对象池实现,它使用单个链接的对象列表来管理池(我想避免由于数组大小调整而分配):
(function () {
'use strict';
pinjector
.module('starCastle')
.factory(
'objectPool',
[
objectPool
]);
function objectPool() {
var service = {
createPool: createPool
};
return service;
function createPool(objectConstructor) {
var nextObjectToUse = null,
firstLiveObject = null,
liveObjectCount = 0;
var pool = {
create: create,
release: release,
getLiveObjectCount: getLiveObjectCount
};
return pool;
function create() {
var returnValue;
if (nextObjectToUse) {
returnValue = nextObjectToUse;
nextObjectToUse = nextObjectToUse.__next;
returnValue.isNew = true;
} else {
returnValue = objectConstructor();
returnValue.isNew = true;
}
returnValue.__next = undefined;
++liveObjectCount;
return returnValue;
}
function release(object) {
if (!object) {
return;
}
object.__next = nextObjectToUse;
nextObjectToUse = object;
--liveObjectCount;
}
function getLiveObjectCount() {
return liveObjectCount;
}
}
}
}());
(旁白:这看起来有点像Angular 1.x服务/工厂的原因是因为它曾经是以前的。长期,无聊的故事背后。)
在这里,它变得奇怪。当我使用Chrome开发工具收集分配配置文件时,它告诉我大部分内存分配都发生在上面的release(object)
函数中。如果我在收集个人资料的同时玩游戏一两分钟,我会看到在此功能中分配了几个MB,但我不明白为什么。
但是,如果我注释掉以下代码行,内存分配就会消失,并且不会再出现在配置文件中的任何其他位置:
// Commenting out these two lines of code causes allocation to disappear
// object.__next = nextObjectToUse;
// nextObjectToUse = object;
问题是,为什么?
基本上"所有"这些行正在做的是一些指针杂乱,将一个对象添加到列表的头部。我盯着这个并假设我做了一些愚蠢的事情:例如,我想知道我是否以某种方式弄错了(或者如果我已经得到了杂耍) create()
函数中的错误,但我不太清楚如何。
那么有人可以看到为什么会导致如此多的内存分配?
(这是OSX上的Chrome 58,顺便说一句。)
谢谢,
巴特