SWidgetCache.lua 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. local SWidgetCache = class("SWidgetCache")
  2. local SUIHelper = require("sui/SUIHelper")
  3. local SWidget = require("sui/SWidget")
  4. local tremove = table.remove
  5. local tinsert = table.insert
  6. function SWidgetCache:ctor()
  7. self._renderCache = {}
  8. self._renderEmptyImageCache = {}
  9. self._renderButtonCache = {}--按钮单独一缓存
  10. end
  11. function SWidgetCache:releaseAll()
  12. -- 释放渲染组件
  13. for _, caches in pairs(self._renderCache) do
  14. for _, cache in pairs(caches) do
  15. cache:autorelease()
  16. end
  17. end
  18. for _, caches in pairs(self._renderEmptyImageCache) do
  19. for _, cache in pairs(caches) do
  20. cache:autorelease()
  21. end
  22. end
  23. for _, caches in pairs(self._renderButtonCache) do
  24. for _, cache in pairs(caches) do
  25. cache:autorelease()
  26. end
  27. end
  28. self._renderCache = {}
  29. self._renderEmptyImageCache = {}
  30. self._renderButtonCache = {}
  31. end
  32. function SWidgetCache:releaseLimit()
  33. for _, caches in pairs(self._renderCache) do
  34. while #caches > 100 do
  35. local cache = tremove(caches, 1)
  36. cache:autorelease()
  37. end
  38. end
  39. for _, caches in pairs(self._renderEmptyImageCache) do
  40. while #caches > 100 do
  41. local cache = tremove(caches, 1)
  42. cache:autorelease()
  43. end
  44. end
  45. for _, caches in pairs(self._renderButtonCache) do
  46. while #caches > 100 do
  47. local cache = tremove(caches, 1)
  48. cache:autorelease()
  49. end
  50. end
  51. end
  52. function SWidgetCache:generateSWidget()
  53. return SWidget.new()
  54. end
  55. local function clearMouseLastInSideNode(render)
  56. if global.mouseEventController:GetLastInsideNode() and global.mouseEventController:GetLastInsideNode() == render then
  57. global.mouseEventController:ClearLastInsideNode()
  58. print(render, "___clearMouseLastInSideNode")
  59. end
  60. end
  61. function SWidgetCache:generateRender(classname)
  62. if self._renderCache[classname] and #self._renderCache[classname] > 0 then
  63. local render = tremove(self._renderCache[classname], 1)
  64. render:autorelease()
  65. render:removeAllChildren()
  66. return render
  67. end
  68. if classname == "ccui.Layout" then
  69. return ccui.Layout:create()
  70. elseif classname == "ccui.Text" then
  71. return ccui.Text:create()
  72. elseif classname == "ccui.ImageView" then
  73. return ccui.ImageView:create()
  74. elseif classname == "ccui.Button" then
  75. return ccui.Button:create()
  76. elseif classname == "ccui.ListView" then
  77. return ccui.ListView:create()
  78. elseif classname == "ccui.Widget" then
  79. return ccui.Widget:create()
  80. end
  81. end
  82. function SWidgetCache:generateEmptyImageRender(classname)
  83. local render = nil
  84. if self._renderEmptyImageCache[classname] and #self._renderEmptyImageCache[classname] > 0 then
  85. render = tremove(self._renderEmptyImageCache[classname], 1)
  86. render:autorelease()
  87. render:removeAllChildren()
  88. return render
  89. end
  90. render = ccui.ImageView:create()
  91. render._isEmptyImage = true
  92. return render
  93. end
  94. --1-normalAndPress 2-Normal 3-Press 4-nil
  95. function SWidgetCache:generateButtonRender(Button_Type)
  96. local render = nil
  97. if self._renderButtonCache[Button_Type] and #self._renderButtonCache[Button_Type] > 0 then
  98. render = tremove(self._renderButtonCache[Button_Type], 1)
  99. render:autorelease()
  100. render:removeAllChildren()
  101. clearMouseLastInSideNode(render)
  102. return render
  103. end
  104. render = ccui.Button:create()
  105. render._Button_Type = Button_Type
  106. return render
  107. end
  108. function SWidgetCache:cachingRender(swidget)
  109. -- can't loaded
  110. if not swidget.render then
  111. return false
  112. end
  113. local render = swidget.render
  114. local etype = swidget.element.type
  115. local classname = tolua.type(render)
  116. local isEmptyImage = render._isEmptyImage--是否是空图片
  117. local Button_Type = render._Button_Type--按钮类型
  118. if render.useMetaValue == true then
  119. return false
  120. end
  121. if etype == "Img" then
  122. elseif etype == "Text" or etype == "COUNTDOWN" then
  123. if classname == "ccui.Layout" then
  124. return false
  125. end
  126. elseif etype == "Button" then
  127. else
  128. return false
  129. end
  130. -- cleanup
  131. SUIHelper.cleanuprender(render)
  132. render:retain()
  133. if swidget.trunk and swidget.trunk.render and swidget.trunk.element.type == "ListView" then
  134. swidget.trunk.render:removeItem(swidget.trunk.render:getIndex(render))
  135. else
  136. render:removeFromParent()
  137. end
  138. if etype == "Button" then
  139. self._renderButtonCache[Button_Type] = self._renderButtonCache[Button_Type] or {}
  140. tinsert(self._renderButtonCache[Button_Type], render)
  141. else
  142. if isEmptyImage then
  143. self._renderEmptyImageCache[classname] = self._renderEmptyImageCache[classname] or {}
  144. tinsert(self._renderEmptyImageCache[classname], render)
  145. else
  146. self._renderCache[classname] = self._renderCache[classname] or {}
  147. tinsert(self._renderCache[classname], render)
  148. end
  149. end
  150. return true
  151. end
  152. function SWidgetCache:cachingTrunk(trunkSwidget)
  153. if not trunkSwidget then
  154. return nil
  155. end
  156. -- caching swidgets
  157. local function solveBranches(trunk)
  158. if #trunk.branches == 0 then
  159. self:cachingRender(trunk)
  160. return nil
  161. end
  162. for _, branch in pairs(trunk.branches) do
  163. solveBranches(branch)
  164. end
  165. self:cachingRender(trunk)
  166. end
  167. solveBranches(trunkSwidget)
  168. end
  169. return SWidgetCache