CustomCache.lua 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. local CustomCache = class("CustomCache")
  2. local Queue = requireUtil( "queue" )
  3. function CustomCache:ctor()
  4. self._ImageCache = {}
  5. self._SFXCache = {}
  6. self._NodeCache = nil
  7. end
  8. function CustomCache:resetWidget(node)
  9. node:retain()
  10. if node:getParent() then
  11. node:removeFromParent()
  12. end
  13. node:setScale(1)
  14. node:setName("")
  15. node:setTag(-1)
  16. node:setPosition(cc.p(0,0))
  17. node:setAnchorPoint(cc.p(0.5,0.5))
  18. node:setOpacity(255)
  19. node:setVisible(true)
  20. end
  21. function CustomCache:GetImage(path)
  22. if not path or (path == "") then
  23. return nil
  24. end
  25. if not self._ImageCache[path] then
  26. self._ImageCache[path] = Queue.new()
  27. end
  28. local img = nil
  29. if self._ImageCache[path]:size() == 0 then
  30. img = ccui.ImageView:create(path)
  31. img._CachePath = path
  32. else
  33. img = self._ImageCache[path]:pop()
  34. img:autorelease()
  35. img:removeAllChildren()
  36. end
  37. return img
  38. end
  39. function CustomCache:RmImage(img)
  40. local path = img._CachePath
  41. if self._ImageCache[path] then
  42. if self._ImageCache[path]:size() >= 10 then
  43. if img:getParent() then
  44. img:removeFromParent()
  45. end
  46. else
  47. self:resetWidget(img)
  48. self._ImageCache[path]:push(img)
  49. end
  50. end
  51. end
  52. function CustomCache:GetSFXAnim(id)
  53. if not id then
  54. return nil
  55. end
  56. if not self._SFXCache[id] then
  57. self._SFXCache[id] = Queue.new()
  58. end
  59. local sfx = nil
  60. if self._SFXCache[id]:size() == 0 then
  61. sfx = global.FrameAnimManager:CreateSFXAnim(id)
  62. sfx._ChacheId = id
  63. else
  64. sfx = self._SFXCache[id]:pop()
  65. sfx:autorelease()
  66. sfx:removeAllChildren()
  67. end
  68. return sfx
  69. end
  70. function CustomCache:RmSFXAnim(sfx)
  71. local id = sfx._ChacheId
  72. sfx:Stop()
  73. sfx:SetAnimEventCallback(nil)
  74. if self._SFXCache[id] then
  75. if self._SFXCache[id]:size() >= 10 then
  76. if sfx:getParent() then
  77. sfx:removeFromParent()
  78. end
  79. else
  80. self:resetWidget(sfx)
  81. self._SFXCache[id]:push(sfx)
  82. end
  83. end
  84. end
  85. function CustomCache:GetNode()
  86. if not self._NodeCache then
  87. self._NodeCache = Queue.new()
  88. end
  89. local node = nil
  90. if self._NodeCache:size() == 0 then
  91. node = cc.Node:create()
  92. else
  93. node = self._NodeCache:pop()
  94. node:autorelease()
  95. node:removeAllChildren()
  96. end
  97. return node
  98. end
  99. function CustomCache:RmNode(node)
  100. node:setContentSize(0,0)
  101. if self._NodeCache then
  102. if self._NodeCache:size() >= 300 then
  103. if node:getParent() then
  104. node:removeFromParent()
  105. end
  106. else
  107. self:resetWidget(node)
  108. self._NodeCache:push(node)
  109. end
  110. end
  111. end
  112. function CustomCache:Clear()
  113. local node
  114. for k,vec in pairs(self._ImageCache) do
  115. for i = 1,vec:size() do
  116. node = vec:pop()
  117. node:release()
  118. end
  119. end
  120. self._ImageCache = {}
  121. local sfx = nil
  122. for k,vec in pairs(self._SFXCache) do
  123. for i = 1,vec:size() do
  124. node = vec:pop()
  125. node:release()
  126. end
  127. end
  128. self._SFXCache = {}
  129. if self._NodeCache then
  130. for i = 1,self._NodeCache:size() do
  131. node = self._NodeCache:pop()
  132. node:release()
  133. end
  134. end
  135. self._NodeCache = nil
  136. end
  137. return CustomCache