lua 游戏架构 之 TablePool`对象池

定义一个名 `TablePool` class,用于管理一个对象池。对象池是一种用于优化内存使用的技术,通过重用对象而不是频繁地创建和销毁对象,从而减少内存分配和垃圾回收的开销。

设计思路

  1. **初始化**:
  • `initialize` 方法初始化对象池,接受三个参数:`capacity`(池子的容量,即最多可以缓存多少个对象)、`newFunc`(创建新对象的函数)和 `rlsFunc`(释放对象的函数)。

  • 根据提供的 `capacity`,预先创建一定数量的对象并存储在队列 `_ts` 中。

  1. **获取对象**:
  • `getObj` 方法从对象池中获取一个对象。如果池子中有对象,则从队列的头部取出一个对象;如果池子为空且提供了 `newFunc`,则调用 `newFunc` 创建一个新的对象;否则返回一个空表。
  1. **释放对象**:
  • `releaseObj` 方法将一个对象放回池子中。如果提供了 `rlsFunc`,则在放回之前调用 `rlsFunc` 释放对象。如果对象已经在队列的尾部,则记录错误信息,因为这意味着对象被重复释放。
  1. **销毁对象池**:
  • `release` 方法用于销毁对象池,将所有成员变量置为 `nil`。

用途

对象池通常用于需要频繁创建和销毁对象的场景,例如游戏开发中的游戏对象、数据库连接池等。通过使用对象池,可以显著减少内存分配和垃圾回收的开销,提高程序的性能。

注意事项

  1. **对象重用**:对象池中的对象在被取出后,应确保在释放之前不会被修改,以避免数据不一致的问题。

  2. **错误处理**:在 `releaseObj` 方法中,如果尝试释放的对象已经在队列的尾部,会记录错误信息。这通常意味着对象被重复释放,需要检查代码逻辑。

  3. **线程安全**:如果对象池在多线程环境中使用,需要确保线程安全,避免多个线程同时访问和修改对象池。

Lua 复制代码
---@class TablePool
local TablePool = SimpleClassUtil:class()

---@param capacity number
---@param newFunc fun() : table
---@param rlsFunc fun(t : table)  void
function TablePool:initialize(capacity, newFunc, rlsFunc)
    local cap = capacity or 4
    ---@type Queue
    self._ts = Queue:new()
    self._newFunc = newFunc -- or _defaultNew
    self._rlsFunc = rlsFunc
    if newFunc then
        for i = 1, cap do
            self._ts:pushBack(newFunc())
        end
    else
        for i = 1, cap do
            self._ts:pushBack({})
        end
    end
end

---@return table @从池子里获取的table
function TablePool:getObj()
    if self._ts then
        local cnt = self._ts:size()
        if cnt <= 0 then
            if self._newFunc then
                return self._newFunc()
            else
                return {}
            end
        else
            return self._ts:popFront()
        end
    end
end

---@param item table @一定是Get返回的table
function TablePool:releaseObj(item)
    if self._ts then
        if self._rlsFunc then
            self._rlsFunc(item)
        end

        if self._ts:peekBack() == item then
            Logger.error("Try Release item to TablePool Failed! You try Release same item twice.", item)
        else
            self._ts:pushBack(item)
        end
    end
end

---@overload fun()
function TablePool:release(obsolete)
    if obsolete then
        Logger.error("TablePool:release has Changed Name to TablePool:releaseObj!")
        self:releaseObj(obsolete)
        return
    end

    self._newFunc = nil
    self._rlsFunc = nil
    self._ts = nil
end

return TablePool
相关推荐
一起养小猫2 小时前
Flutter for OpenHarmony 实战:别踩白方块游戏完整开发指南
flutter·游戏
星空露珠3 小时前
速算24点所有题库公式
开发语言·数据库·算法·游戏·lua
Jing_jing_X3 小时前
CPU 架构:x86、x64、ARM 到底是什么?为什么程序不能通用?
arm开发·架构·cpu
qq_177767375 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
小程故事多_806 小时前
深度搜索Agent架构全解析:从入门到进阶,解锁复杂问题求解密码
人工智能·架构·aigc
晚霞的不甘6 小时前
Flutter for OpenHarmony从零到一:构建《冰火人》双人合作闯关游戏
android·flutter·游戏·前端框架·全文检索·交互
●VON7 小时前
React Native for OpenHarmony:项目目录结构与跨平台构建流程详解
javascript·学习·react native·react.js·架构·跨平台·von
Gary董7 小时前
高并发的微服务架构如何设计
微服务·云原生·架构
ujainu7 小时前
Flutter + OpenHarmony 实战:《圆环跳跃》——完整游戏架构与视觉优化
flutter·游戏·架构·openharmony
ujainu7 小时前
Flutter + OpenHarmony 实战:从零开发小游戏(一)——主菜单与最高分存储
flutter·游戏·app