精华内容
下载资源
问答
  • cocos2dx 对象池 Lua

    2020-12-30 10:32:57
    localNianGaoNode=requirePack("task.toyboxScripts.NianGaoNode") localNianGaoNodePool=class("NianGaoNodePool") ...print("202020对象池的构造") end functionNianGaoNodePool:getNianGao() ...

    local NianGaoNode = requirePack("task.toyboxScripts.NianGaoNode")

    local NianGaoNodePool = class("NianGaoNodePool")

    function NianGaoNodePool:ctor()

        self.nodePoll ={};

        print(" 20 20 20 对象池的 构造 ")

    end

    function NianGaoNodePool:getNianGao() 

        if( #self.nodePoll > 0 ) then 

            local item = table.remove (self.nodePoll,1) --返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起

            print("10 獲取到舊的 前 " ,#self.nodePoll, item:getReferenceCount() )

            --item:release();

           -- print("10 獲取到舊的 後 " , item:getReferenceCount() )

            return item ;

        else 

            local item = NianGaoNode.new();

            return item ; 

        end 

    end

     

    function NianGaoNodePool:huishou(newNode)

           print("22 remove 前 ", newNode:getReferenceCount())

     newNode:removeFromParent();

    print("22 remove 後 ", newNode:getReferenceCount())

           newNode:retain();

           print("22 retain 後 ", newNode:getReferenceCount())

           if(newNode:getReferenceCount() > 2 ) then 

               newNode:release();

               print("22 release 後 ", newNode:getReferenceCount())

           end

           table.insert(self.nodePoll,newNode) ; --table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.

           print("对象池的 回收之后",#self.nodePoll)

         end

     

    function NianGaoNodePool:clearAll()

        --     this.enemyPool.clear(); // 通过 put 接口放入对象池

        --     YBLog.log( "NodeBgPool","清理之后之后:",this.enemyPool.size() );

        for k,v in ipairs(self.nodePoll) do

           v:removeFromParent();

        end   

        self.nodePoll = {}   

    end

     

    return NianGaoNodePool

     

    展开全文
  • lua 对象池

    千次阅读 2018-12-02 23:13:47
    对象池主代码 require("Util/FunctionsEx") require("Util/Queue") require("Util/List") LuaPool = class("LuaPool") function LuaPool:ctor(prefab, count, po...

    是的我又在造轮子了  为什么要造轮子 因为我找不到现成的 那没办法了 只能硬着头皮造了 造起来吧董小姐

    对象池主代码

    require("Util/FunctionsEx")
    require("Util/Queue")
    require("Util/List")

    LuaPool = class("LuaPool")

    function LuaPool:ctor(prefab, count, position, parent, rotation)

        -- 存放未使用的go
        self.queue = Queue.new()
        -- 存放已使用的go
        self.list = List.new()
        self.count = count
        self.prefab = prefab
        self.parent = parent
        self.position = position
        self.rotation = rotation
    end


    function LuaPool:Prewarm()
        for i = 1, self.count do
            local go = LoadTest(self.prefab, self.position, self.parent)
            go.transform.name = i
            self.list:Add(go)
            self:Put(go)
        end
    end


    function LuaPool:Put(go)
      --  print("回收是否为真", self.list:Contains(go))
        if self.list:Contains(go) == true then
            self.list:Remove(go)
            go:SetActive(false)
            self.queue:Enqueue(go)
        else
            print("对象池回收出错")
        end


    end


    function LuaPool:Get()
        local go = nil
        if self.queue:Count() == 0 then
            go = LoadTest(self.prefab, self.position,self.parent)
        else
            go = self.queue:Dequeue()
        end
        self.list:Add(go)
        go:SetActive(true)

        return go
    end

     

     

    再把list和queue的发了吧 省得又是找到半个

    require("Util/FunctionsEx")
    List = class("List")
    function List:ctor()
        self.items = { }
    end

    function List:Add(item)
        table.insert(self.items, self:Count() + 1, item)
    end

    function List:Count()
        return #self.items
    end

    function List:Contains(item)
        local isExist = false
        for k, v in pairs(self.items) do
          --  print("contains", item:GetInstanceID(), v:GetInstanceID())
            if v:GetInstanceID() == item:GetInstanceID() then
                isExist = true
                break
            end
        end
        return isExist
    end

    function List:Remove(item)
        if not self:Contains(item) then return false end
        for i = 1, self:Count() do
            if self.items[i]:GetInstanceID() == item:GetInstanceID() then
                table.remove(self.items, i)
                break
            end
        end
    end

    function List:RemoveAt(index)
        if not self:Contains(self.items[index]) then return false end
        table.remove(self.items, index)
    end

     

     

    require("Util/FunctionsEx")
    Queue = class("Queue")

    function Queue:ctor()
        self.items = { }
    end

    function Queue:Peek()
        return self.items[1]
    end

    function Queue:Enqueue(item)
        table.insert(self.items, self:Count() + 1, item)
    end

    function Queue:Dequeue()
        local item = self:Peek()
        table.remove(self.items, 1)
        return item
    end

    function Queue:Count()
        return #self.items
    end

    function Queue:Clear()
        self.items = { }
    end

    先把要初始的prefab地址 初始的数目传进来  具体设置自己定

    然后就测试对象池    的get和put方法了

     

    ok今天到这 最近估计要研究pbc这块了  如果有些感悟就写点这方面的东西 下次见

     

    展开全文
  • Lua实现的对象池,Unity

    千次阅读 2017-08-17 17:41:49
    -- 从对象池中获取一个对象,若池为空的,则从Prefab创建一个新的 -- 当对象到达池上限时,会把最早使用的对象回收并作为新对象返回 function PrefabObjectPool:Get() local obj = nil if self.queue.Count == 0 ...
    local PrefabObjectPool = {}
    PrefabObjectPool.__index = PrefabObjectPool
    
    function PrefabObjectPool.New(prefab,capcity)
    	if prefab == nil then
    		error("[PrefabObjectPool]prefab should not be nil")
    	end
    	local self = {}
    	setmetatable(self,PrefabObjectPool)
    	self.prefab = prefab
    	self.queue = LuaQueue.New()
    	self.usedItems = LuaList.New()
    	self.capcity = capcity
    	return self
    end
    
    -- 预先生成指定个数的对象
    -- count 需要生成的个数,最大不能超过池大小,若为空则表示直接将池填充满
    function PrefabObjectPool:Prewarm(count)
    	if count == nil then
    		if self.capcity == nil then
    			error("[PrefabObjectPool]invalid state")
    		else
    			count = self.capcity
    		end
    	elseif count > self.capcity then
    		count = self.capcity
    	end
    
    	for i=1,count do
    		local obj =  GameObject.Instantiate(self.prefab)
    		self:Put(obj)
    	end
    end
    
    -- 回收一个对象到对象池
    function PrefabObjectPool:Put(obj)
    	if self.usedItems:Contains(obj) then
    		self.usedItems:Remove(obj)
    		obj:SetActive(false)
    		self.queue:Enqueue(obj)
    	else
    		error("[PrefabObjectPool]invalid state")
    	end
    end
    
    -- 从对象池中获取一个对象,若池为空的,则从Prefab创建一个新的
    -- 当对象到达池上限时,会把最早使用的对象回收并作为新对象返回
    function PrefabObjectPool:Get()
    	local obj = nil
    	if self.queue.Count == 0 then
    		if self.usedItems.Count == self.capcity then
    			obj = self.usedItems[0]
    			obj:SetActive(false)
    			self.usedItems:RemoveAt(0)
    		else
    			obj = GameObject.Instantiate(self.prefab)
    		end
    	else
    		obj = self.queue:Dequeue()
    	end
    
    	self.usedItems:Add(obj)
    	obj:SetActive(true)
    	return obj
    end
    
    -- 将所有被使用的对象全部回收
    function PrefabObjectPool:RecycleAll()
    	local count = self.usedItems.Count
    	for i=count-1,0, -1 do
    		local item = self.usedItems[i]
    		self:Put(item)
    	end
    	self.usedItems:Clear()
    end
    
    --清空对象池Destroy
    function PrefabObjectPool:Clear()
    
    	self:RecycleAll();
    
    	for i = 0, self.queue.Count - 1 do
    		GameObject.Destroy(self.queue:Dequeue());
    	end
    
    	self.queue:Clear();
    end
    
    return PrefabObjectPool

    展开全文
  • C# 这边 new 了一个GameObject 对象并发给Lua那边, 这时C# 这边在通过GC释放掉这个对象lua 那边会报错;遇到这种问题的两种方式解决方案: 1.lua一个 sprite对象如果被引擎释放了,那引用它的变量怎么不是nil 每...

    C# 这边 new 了一个GameObject 对象并发给Lua那边, 这时C# 这边在通过GC释放掉这个对象;lua 那边会报错;遇到这种问题的两种方式 解决方案:

    1.lua一个 sprite对象如果被引擎释放了,那引用它的变量怎么不是nil
        每一个lua引用的GameObject都有独立的 引用索引,当 lua的 对象的生命周期结束, 调用 原方法 _gc,会减去 一个引用计数,当这个引用计数为0 的时候会 remove 掉 c# 对象池里面的对象,然后如果这个c# 就没有了lua的引用,而如果也失去了 c#的引用,就会触发 c# 的GC,C#端主动Destroy的GameObject不会索引到lua这边来释放lua部分的“代理”内存,2边的gc各自管理自己的内存.
       

     tolua有个tolua.isnull专门来判断这个情况,tolua.isnull则是绕过proxy数据,查看源数据是否为空


        tolua的方案是,lua并不会尝试跨语言去管理C#的内存,他只是简单的“钉住”C#的某一个内存,自己gc完毕后,释放对某段C#内存的引用,至于释放掉引用的C#内存啥时候真正释放,lua不关心,C#gc的事情。
      总得来说:如果遇到C#那边主动Destory并释放GC的话,lua那边在用这个对象时,主动做一下isnull 的验证;验证对象内存是否被销毁

    2.逻辑层去处理,用对象管理池,所有创建C#对象都通过管理器去创建,在创建对象时区分由哪边创建的;删除时,必须由创建时的那边去做destroy操作。如果在写逻辑时Lua把对象传给了C#,那么lua在调用Destroy时,必须先要确保C#的指向Clear。反之C#把对象传给Lua 也一样


    ————————————————
    版权声明:本文为CSDN博主「taohuagege1」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/taohuagege1/article/details/78978146

    展开全文
  • lua,C++

    2021-01-18 19:48:28
    学习lua的三个目标: lua实现面向对象的原理以及方法 lua实现对象池 lua实现内存快照 C++:
  • C# 这边 new 了一个GameObject 对象并发给Lua那边, 这时C# 这边在通过GC释放掉这个对象lua 那边会报错;遇到这种问题的两种方式 解决方案: 1.lua一个 sprite对象如果被引擎释放了,那引用它的变量怎么不是...
  • 看懂Xlua——从宏观到微观(1)传递c#对象Lua我们要解决什么问题?c#传递对象lua 我们要解决什么问题? 为了使基于unity开发的应用在移动平台能够热更新,我们嵌入了Lua虚拟机,将需要热更新的逻辑用lua实现。c#...
  • 对象池 GenericObjectPool 通用对象池

    千次阅读 2019-01-28 16:44:51
    透明代理的使用 在对后端的连接中使用对象池(backend是一个池子 里面是一个域名的连接) 使用需要用到的组件 GenericObjectPool.Config DefaultChannelGroup PoolableObjectFactory BasePoolableObjectFactory ...
  • 对象池和连接池

    2017-07-07 11:55:00
    前言:由于不了解对redis的使用,在使用redis的lua驱动的时候,经常对 redis对象 和 连接池 的联系,感到困惑。... 2、对象池;  3、对象池 和 连接池; 转载于:https://www.cnblogs.com/Renekton/p/7131475.html...
  • 使用LUA userdata手动绑定C++对象

    千次阅读 2016-08-21 01:56:26
    使用LUA userdata手动绑定C++对象
  • 它没有提供完善的对象池方案; 它只是保留了一堆可以推送/弹出的表。 安装 将Stable.lua克隆/下载到您的项目中,并按以下要求进行操作: local Stable = require ( " Stable " ) ( Pool可能是更好的别名) 用法 ...
  • cocos中的对象池

    2019-05-15 10:25:50
    JavaScript对象池***1. 对象池的概念******2. 对象池的使用*** 不久前我做了一个塔防游戏,对塔射击的子弹就是频繁的创建和销毁处理的,后面才学习了解到cocos creator 提供了一种更好的处理方法就是JavaScript对象...
  • 对象池在游戏优化中起着很重要的作用,今天我们来实现一个简单的对象池功能。 1.打开Unity,创建3个C#脚本,分别为GameController.cs(游戏控制器),ObjectPool.cs(对象池),CubeMgr.cs(延迟销毁物体),代码...
  • lua 的协程写法

    2019-03-04 15:39:30
    闲来,写了一个协程 目标是能实现写成复用,而不需要反复去生成新的协程 具体见代码注释 代码如下: local co_running = assert(coroutine.running) local co_create = assert(coroutine.create) local co_yield =...
  • 【unity&文章】对象池

    2017-03-25 21:30:30
    怪物 对象池 子弹 对象池 场景建筑 对象池 特效 对象池 处理同一类型,不同对象的 对象池 有助于 区别管理,怪物 对象池 在怪物 管理器物体 里面 操作管理就行了。 参考资料: 1. 游戏开发设计模式...
  • 在写对象池之前先来聊聊为什么需要对象池对象池是什么。 对象池是什么 对象池有什么作用 对象池该怎么用 对象池是什么 在游戏中会不停地生成(instantiate)、销毁(destroy)许多相同的物体,但是不停地生成、...
  • lua面向对象是怎么实现的

    千次阅读 2018-03-15 20:23:49
    lua语言中没有真正意义的面向对象,而是通过函数模拟面向对象。我们来看是怎么一步步演化的。 基本的函数 [plain] view plain copyPeople = {} function People.sayHi() print("Hi, nice to meet you.
  • cocos2d-x lua对象的使用

    千次阅读 2014-10-11 10:54:49
    lua中使用类对象很简单也很方便
  • cocos2dx游戏性能优化之对象池

    千次阅读 2016-09-20 19:31:22
    cocos2dx游戏性能优化之对象池对象池机制:可回收与重复使用手机游戏的性能对于一款手机游戏来说,那是相当的重要了,我们常说的性能呢,一般包括耗电,发热情况,流畅度,是否存在卡帧等等。从专业的角度来说,包括...
  • 简化对象池

    千次阅读 2005-01-31 18:27:00
    在Java中开发一个普遍性的对象池架构可以更好地利用资源,并可以使初始化的成本达到最小。 ——by Karthik Rangaraju 大多数人对直接或间接运用对象池来连接一个数据库
  • v0.5.1 新增ObjectPool(对象池)模块(优化需要反复构造的对象所造成的性能消耗,比如GameObject) v0.5.2 新增AudioEntry(音频入口)模块(一键生成配置表.json,按需加载,便捷更新) v0.5.3 新增AssetLoader_Beta版 v...
  • using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; //三种特效 public enum EffectType { BloodSpla, ... Holy...
  • 本篇文章开始,我们重点阅读一下Lua的几个重要数据结构:字符串、内存操作、对象操作等。 字符串操作对应的文件:lstring.c 字符串 - 数据结构 Lua的字符串管理都会统一挂载到global_State全局状态机上。 字符串...
  • cocos对象池的使用

    2018-07-17 13:27:00
    如果没有空闲对象,也就是对象池中备用对象不够时,我们就用 cc.instantiate 重新创建 enemy = cc.instantiate( this .enemyPrefab); } enemy.parent = parentNode; // 将生成的敌人加入节点树 this ....
  • Lua Profiler——快速定位Lua性能问题

    千次阅读 2020-01-20 18:35:26
    导读 随着Lua在项目中的大量使用,它所带来的性能问题也逐步成为了项目运行时的重大性能瓶颈之一。...因此,也有越来越多的团队反馈,在监控到table数持续上涨,引用Mono对象持续增多等等问题时...
  • lua堆栈

    2019-07-09 16:17:00
    lua堆栈 来源https://blog.csdn.net/suhuaiqiang_janlay/article/details/56702381 来源https://blog.csdn.net/suhuaiqiang_janlay/article/details/63683036 一、Lua脚本语言 1. 概述 Lua是一种脚本编程...
  • 但凡事过犹不及,对象池也只有在一些场景下才适合。 Object pooling can offer a significant performance boost in situations where the cost of initializing a class instance is high, the rate of ...
  • nginx lua

    2015-12-03 10:59:42
    gx_lua 是一个 NGINX 的第三方扩展模块,它能够将 Lua 代码嵌入到 NGINX 中来执行。 UPYUN CDN 大量使用了 NGINX 作为反向代理服务器,其中绝大部分的业务逻辑已经由 Lua 来驱动了。 这个主题之前在 OSC ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,855
精华内容 2,342
关键字:

对象池lua