1. 程式人生 > >Lua實現的物件池,Unity

Lua實現的物件池,Unity

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

相關推薦

Lua實現物件,Unity

local PrefabObjectPool = {}PrefabObjectPool.__index = PrefabObjectPool function PrefabObjectPool.New(prefab,capcity) if prefab == nil t

C++利用智慧指標shared_ptr實現物件

         C++中用new來分配物件,還要顯式的呼叫delete來析構物件,很容易造成記憶體洩露。所以在研究我們遊戲伺服器的程式碼的時候發現,我們將new函式封裝,在物件池上,利用shared_ptr的特性來自動釋放物件,同時實現了一種簡單的GC回收物件的機制。看完

【C++11】實現物件

物件池 物件池顧名思義,就是存放一堆物件的池,目前一般的實現方式大多都是如下思路: 初始化建立一些系列(或者從外部載入) 從物件池取出一個物件使用 用完之後返回物件池 物件池有很多場景都可以使用,例如:一個物件構造很消耗時間,又或者一些物件被很頻繁的使

Unity物件實現

物件池是一個單例類: using System.Collections; using System.Collections.Generic; using UnityEngine; public class ObjectPool { private static ObjectPool ins

unity實現簡單物件,附教程原理

Unity物件池的建立與使用 本文提供全流程,中文翻譯。 Chinar 堅持將簡單的生活方式,帶給世人!(擁有更好的閱讀體驗 —— 高解析度使用者請根據需求調整網頁縮放比例) Chinar —— 心分享、心創新!助力快速完成 Unity

unity裡, lua 面向物件方式,成員物件有可能殘留的問題。

TaskItemUI = { name = nil, content = nil, schedule = nil, schedulebg = nil, targetObj = nil, taskData = nil, curAimId =

雲風大神部落格中的Lua實現面向物件

在 Lua 中實現面向物件 在 pil 中,lua 的作者推薦了一種方案來實現 OO,比較簡潔,但是我依然覺得有些繁瑣。 這裡給出一種更漂亮一點的解決方案:為了貼程式碼和修改方便,我把它貼在了 wiki 上。 Lua 中實現面向物件 在這個方案中,只定義了一個函式

Unity簡易物件(集合儲存資料)

1、下面這個程式碼是用list集合建立的簡易物件池,只能儲存一種遊戲物件。 using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameObjectPoo

Unity簡易物件

廢話不多說,直奔主題  以下內容如有不恰當的地方,歡迎指正 關於物件池有款外掛 推薦部落格 雨鬆MOMO http://www.xuanyusong.com/archives/2974 什麼是物件池?物件池是用來幹什麼的?網上有很多解釋,這裡主要寫一下自己的理解 物件池,簡而言

Unity中的物件

什麼是物件池? 為了方便物件的產生和回收,我們使用一個集合來儲存不使用物件,當需要使用該物件時,從集合中取出來,不用時不進行銷燬,而是將其取消啟用,重新存入物件池中。 為什麼要使用物件池? 當一個遊戲需要頻繁的建立和銷燬物件時,為了不增加GC的效能消耗,可以考慮使用回收物件來達到複用的目

Unity程式設計】Unity3D-使用物件高效管理記憶體

Unity程式設計標準導引-3.4 Unity中的物件池   本節通過一個簡單的射擊子彈的示例來介紹Transform的用法。子彈射擊本身很容易製作,只要製作一個子彈Prefab,再做一個發生器,使用發生器控制按頻率產生子彈,即克隆子彈Prefab,然後為每個子彈寫上運動邏

【設計模式】之物件模式--JDBC連線簡單實現案例

文章目錄 物件池設計模式 物件池設計模式的目標 問題 討論 結構 示例 核驗單 經驗法則 連線池模式示例程式碼 ObjectPool.java

Lua面向物件實現

lua中沒有類的概念,一般所說的類其實就是一個table實現的。關於lua類有兩種實現方式 第一種是在cocos2d-x引擎目錄下圖示檔案 function clone(object) local lookup_table = {} local function _co

Unity遊戲開發】用C#和Lua實現Unity中的事件分發機制EventDispatcher

一、簡介   最近馬三換了一家大公司工作,公司制度規範了一些,因此平時的業餘時間多了不少。但是人卻懶了下來,最近這一個月都沒怎麼研究新技術,部落格寫得也是拖拖拉拉,週六周天就躺屍在家看帖子、看小說,要麼就是吃雞,唉!真是罪過罪過。希望能從這篇部落格開始有些改善吧,儘量少玩耍

物件的簡單實現

1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 5 public class GameInstatie : MonoBehaviour { 6 7 pr

Unity優化篇:物件的建立與使用。(簡單且實用)

1.物件池是什麼? 物件池是一種Unity經常用到的記憶體管理服務,它的作用在於可以減少建立每個物件的系統開銷。 2.為什麼要使用物件池? 在Unity遊戲開發的過程中經常會建立一些新的物件,如果數量較少還可以接受,如果建立的新物件數量龐大,那麼對記憶體而言是一個極大的

Unity實戰篇:移植遊戲到安卓平臺的注意事項及其例項(四)(物件概念的引入以及優化)

1.物件池基礎概念的瞭解(必看) 2.針對專案來進行嵌入 using System.Collections; using System.Collections.Generic; using UnityEngine; using Unit

unity遊戲物件

簡單實現一個遊戲物件池: 物件池的型別,同時也是預設體的名稱: /** * 專案名稱: * 指令碼描述: * 版本: * 日期:#DATE# * 作者:陳超 * */ public clas

Unity之深入分析物件

首先先分析一下何為物件池,什麼情況下使用:對於遊戲中經常使用而且需要及時銷燬的物件,比如子彈,特效,捕魚遊戲中的魚,甚至音效,這些物件如果使用平常的instantiate方法,是在不停的申請記憶體,而這些物件基本有沒有區別,這樣無疑會消耗我們大量效能。所以物件池為此而生。物件池就是在我們不需要的時候

CocosCreator之KUOKUO帶你利用物件實現cc.graphics的單步撤銷

本次引擎2.0.5 編輯工具VSCode   目標:畫筆單步撤銷。 方法:物件池儲存節點,通過回收實現單步撤銷。   新建工程:bk白色背景。 新建個空節點:drawManager(便於管理預製體) 然後新建一個空節點,綁上cc.graphi