为什么这个JavaScript对象池实现中的release()函数分配了这么多内存,或者实际上是什么?

时间:2017-05-10 15:35:55

标签: javascript memory memory-management google-chrome-devtools object-pooling

我正在开展多项游戏(此处为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,顺便说一句。)

谢谢,

巴特

0 个答案:

没有答案