251f6f7a-33fe-493d-affd-711c8298138c.js.map 7.38 KB
{"version":3,"sources":["assets/script/common/utils/NodePoolFactory.ts"],"names":[],"mappings":"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","file":"","sourceRoot":"/","sourcesContent":["import { ResUtils } from \"simba-cc-resutils\";\nimport { delay } from \"simba-utils\";\n\nexport namespace NodePoolFactory {\n    let arrPool: { [key: string]: cc.NodePool } = {};\n    let arrPrefab: { [key: string]: cc.Prefab } = {};\n    let creationTasks: { path: string, count: number, callback: () => void, poolHanderComp?: { prototype: cc.Component } | string }[] = [];\n\n    let processingTasks = false;\n    async function handleTasks() {\n        processingTasks = true;\n        while (creationTasks.length) {\n            let task = creationTasks.shift()!;\n            let prefab = await ResUtils.loadRes<cc.Prefab>(task.path, cc.Prefab);\n            if (prefab) {\n                let pool = new cc.NodePool(task.poolHanderComp);\n                for (let i = 0; i < task.count; i++) {\n                    let node = cc.instantiate(prefab);\n                    (node as any)._path = task.path;\n                    pool.put(node);\n                    if ((i + 1) % 5 == 0) await delay(0.01);\n                }\n                arrPrefab[task.path] = prefab;\n                arrPool[task.path] = pool;\n            } else {\n                cc.error(\"prefab path not find: \", task.path);\n            }\n            task.callback();\n            await delay(0.01);\n        }\n        processingTasks = false;\n    }\n\n    export async function createPool(path: string, count: number = 1, poolHandlerComp?: { prototype: cc.Component } | string) {\n        return new Promise((resolve) => {\n            if (arrPool[path]) {\n                resolve();\n                return;\n            }\n            creationTasks.push({\n                path,\n                count,\n                poolHanderComp: poolHandlerComp,\n                callback: () => resolve()\n            });\n            if (!processingTasks) {\n                handleTasks();\n            }\n        });\n    }\n\n    /**\n     * 获取对象池\n     * @param path 对象池名称\n     */\n    export function getPool(path: string): cc.NodePool {\n        return arrPool[path];\n    }\n\n    /**\n     * 清空对象池\n     * @param path 对象池名称\n     */\n    export function clearPool(...path: string[]) {\n        if (path == null || path.length <= 0) return\n        for (let i = 0; i < path.length; i++) {\n            let one = path[i];\n            if (arrPool[one]) {\n                arrPool[one].clear()\n                delete arrPool[one];\n            }\n\n        }\n        ResUtils.releaseResArray(path);\n        cc.sys.garbageCollect();\n    }\n\n    /**\n     * 从对象池中取出一个node对象\n     * @param path \n     */\n    export function getNode(path: string) {\n        // cc.log(\"getNode:\",path)\n        if (arrPool[path]) {\n            if (arrPool[path].size() > 0) {\n                return arrPool[path].get()\n            } else {\n                let node = cc.instantiate(arrPrefab[path]);\n                (node as any)._path = path;\n                return node;\n            }\n        } else {\n            console.error(\"pool not find:\", path)\n            return null\n        }\n    }\n\n    /**\n     * 把对象放回对象池\n     * @param path \n     * @param obj \n     */\n    export function putNode(obj: cc.Node) {\n        let path = (obj as any)._path;\n        if (arrPool[path]) {\n            arrPool[path].put(obj)\n        } else {\n            obj.removeFromParent(true);\n            console.error(\"pool not find:\", path)\n        }\n    }\n\n    /**\n    * 清空所有对象池\n    */\n    export function clearAll() {\n        let pathArr: string[] = []\n        for (const key in arrPool) {\n            if (arrPool.hasOwnProperty(key)) {\n                pathArr[pathArr.length] = key\n                const pool = arrPool[key];\n                pool.clear()\n            }\n        }\n        ResUtils.releaseResArray(pathArr)\n        arrPool = {}\n        arrPrefab = {}\n        cc.sys.garbageCollect();\n    }\n}"]}