为何写这个性能优化
上面这个问题的答案也是我写这篇文章的初衷,在最近给游戏添加一些列表的时候,对比着应用了一下他们两个,在它们两个之间的优劣势之间进行取舍,就有了这个问题的答案。性能
按照我一个iOS开发而言,他们俩之间交集就是 UITableView是UIScrollView 的子类,也就是说UITableView是在UIScrollView的基础上写的,在平时的应用中 UITableView或者是UICollectionView应用确定比UIScrollView要多,要强大! 学习
可是在Cocos中,UITableView的性能真的好低!这是我这两天使用它以后惟一的感觉! 而且它的优化方案很差找,我找了一会,没找到合适的一个优化方案,这和咱们iOS或者Android就不同了,Android哪怕是性能不高的ListView在通过性能优化以后仍是能够的,这个Cocos的UITableView有什么还的优化方案但愿大神能指导一下,供你们参考学习一下!优化
因此,因为UITableView的性能低,在写一些列表的时候不得以使用UIScrollView + View 的方式,直接看可能以为比较愚蠢,但事实是在使用中滑动的流畅度要比UITableView好,很尴尬!ui
UITableView你怎么用的spa
其实要是只是讨论它们的使用的话真的也挺简单的,UITableView 你只须要记得一句话 -- 先注册,在使用 是的就是在说咱们日常说的代理方法,不论是返回行列数的,仍是设置cell的,或者点击等等等等,都是须要咱们先注册这个方法,在使用的,大概咱们看看下面的代码:代理
self._listView = cc.TableView:create(cc.size(744, 367)) self._listView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL) self._listView:setPosition(cc.p(0,0)) self._listView:setDelegate() self._listView:addTo(csbNode) self._listView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN) self._listView:registerScriptHandler(handler(self,self.cellSizeForTable), cc.TABLECELL_SIZE_FOR_INDEX) self._listView:registerScriptHandler(handler(self,self.tableCellAtIndex), cc.TABLECELL_SIZE_AT_INDEX) self._listView:registerScriptHandler(handler(self,self.numberOfCellsInTableView), cc.NUMBER_OF_CELLS_IN_TABLEVIEW) self._listView:registerScriptHandler(handler(self,self.tableCellTouched), cc.TABLECELL_TOUCHED)
下面是它们这些方法的实现,具体的这些方法都是用来干什么的咱们就不详细说了,相信你们都懂!code
--cell视图大小 function BankRecordLayer:cellSizeForTable(view, idx) return width ,height end --cell视图数目 function BankRecordLayer:numberOfCellsInTableView(view) return count end --获取cell function BankRecordLayer:tableCellAtIndex(view, idx) local cell = view:dequeueCell() return cell end --点击cell function BankRecordLayer:tableCellTouched(view, cell) local cell = view:dequeueCell() return cell end
UIScrollView你怎么用的blog
那一样是这个界面咱们要使用UIScrollView该怎么实现呢?游戏
其实大体的思路很简单,就是你给你建立的ScrollView上面按照你给的位置一个个的添加View,其实这样也比较简单,重点是咱们有几个细节问题须要咱们处理好:
function EmailRecordLayer:CreatEmailItem() self._emalRecordListCell = {} local count = #self._emalRecordList self._listView:setInnerContainerSize(cc.size(735,90*count+10)) for i=1,count do local itemView = EmailItemLayer:create(self,self._emalRecordList[i]) itemView:setPosition(5,self._listView:getInnerContainerSize().height-90*(i-1)-10) itemView:addTo(self._listView) table.insert(self._emalRecordListCell,itemView) end end
下面这个方法是一个完成的给ScrollView 上面添加View的方法,应该能注意到咱们再给ScrollView添加View的时候,他就是从底部开始添加的,这个我试过改变他们的锚点,但都是无济于事!
这样当咱们须要从上往下显示View的时候就只能倒着去设置它的位置了,这是须要注意的第一点!
第二点就是滑动范围的问题,这里有两点的确须要咱们注意一下: setContentSize 和 setInnerContainerSize 这两个方法须要咱们区分清楚!!这点区分清楚就能设置好滑动范围!
最后还有一点就是点击事件的问题 view要是能点击就会吞噬滑动事件!设置它不吞噬事件以后不就好了!ennnnn 还有一点: 你按住一个View滑动,滑动结束的时候松开View,这个时候就会无心间触发点击事件的!这个怎么处理?
针对上面这个问题,看下面的代码:
local startY, endY local btcallback = function(sender, eventType) if eventType == ccui.TouchEventType.began then startY = sender:getTouchBeganPosition().y elseif eventType == ccui.TouchEventType.ended then endY = sender:getTouchEndPosition().y if math.abs(startY-endY) < 10 then self:onButtonClickedEvent(sender,self.img_red,item) end end end img_bg:setSwallowTouches(false) --不要吞噬事件 img_bg:addTouchEventListener(btcallback)
那选哪一个?
按照我本身的使用的经验!
要是你只是须要一个列表,不须要对列表进行其余的操做,这两个都是比较简单也是比较合适的,只不过TableView的滑动性能有一点底,让你看着滑动的时候会感受不流畅!
但要是你在列表的列上面有大量的操做的时候,仍是建议使用ScrollView + View 比较好一点!为何这么说呢?
一、TableView有cell的复用问题,这个固然也能够解决,在iOS中也是同样的,这个你得清楚怎么解决
二、滑动起来TableView会更加的卡顿! 我本身的尝试结果是掉针比之前更严重呢!
上面这些内容就是关于这个要谈论的内容!