懒加载
我最先接触懒加载(延时加载)是在Hibernate里,因为一次和数据库交互过多,导致应用程序卡顿,所以就延迟加载这些数据,等需要的时候再取.可以认为懒加载就是非即时的加载数据.
问题的产生
在游戏开发中,也会碰到一次处理太多数据造成游戏卡顿降帧,比较典型的比如”背包”模块,背包可以认为是一个ListView,由一个lua table里的一些元素作为数据源来构建,当用一个for循环去构造界面时,背包格子过多会导致游戏线程卡住,游戏降帧在所难免.如何做到不降帧?我们可以把一个复杂的逻辑分在多个帧里去做.
来看看代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
local LazyLoader = class("LazyLoader") LazyLoader.ON_FUNC = "ON_FUNC" LazyLoader.ON_CALLBACK = "ON_CALLBACK" function LazyLoader:ctor(params) cc(self):addComponent("components.behavior.EventProtocol"):exportMethods() if params then self:setItemList(params.itemList) if params.func then self:onFunc(params.func) end if params.callback then self:onCallback(params.callback) end end end function LazyLoader:setItemList(itemList) self._itemList = itemList self._count = #self._itemList end function LazyLoader:onFunc(func) return self:addEventListener(LazyLoader.ON_FUNC, func) end function LazyLoader:onCallback(callback) return self:addEventListener(LazyLoader.ON_CALLBACK, callback) end function LazyLoader:start() if self.updateSchedulerEntry == nil then self.updateSchedulerEntry = cc.Director:getInstance():getScheduler():scheduleScriptFunc(handler(self,self.update),0,false) self._curIdx = 1 end end function LazyLoader:update(dt) if self._curIdx >= self._count then if self.updateSchedulerEntry ~= nil then cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.updateSchedulerEntry) end self:dispatchEvent({name = LazyLoader.ON_CALLBACK}) return end self:dispatchEvent({name = LazyLoader.ON_FUNC, item = self._itemList[self._curIdx], idx = self._curIdx}) self._curIdx = self._curIdx + 1 end return LazyLoader |
用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
local lazy = LazyLoader.new() local lazyLabel = cc.ui.UILabel.new({ text = "aaaa", color = cc.c3b(255, 255, 255), }) lazyLabel:align(display.LEFT_TOP,50,display.height - 270) self:addChild(lazyLabel) local itemList = {} for i=1,10000 do itemList[i] = "No."..i end lazy:setItemList(itemList) lazy:onFunc(function(event) lazyLabel:setString(event.item) end) lazy:onCallback(function(event) lazyLabel:setString("Finish!!!") end) lazy:start() |