问题:我有一个持续时间很长的基于帧的动画,我创建了许多spritesheets(例如50个spritesheets,每个有10个图像 - 每个spritesheet 2 MB)。在使用基于下面的示例代码片段的代码播放动画之前预加载所有50个spritesheets需要相当长的时间(和内存)(这在电晕文档中建议):
local function spriteListener( event )
thisSprite = event.target -- "event.target" references the sprite
if ( event.phase == "ended" ) then
sequenceNumer = sequenceNumer + 1;
if (sequenceNumer <=10) then
thisSprite:setSequence(filenameArray[sequenceNumer])
thisSprite:play()
end
end
end
local spriteWidth = 551
local spriteHeight = 401
local numFrames1 = 15
local startFrame = 1
frameInfoSet1 = {width = spriteWidth , height = spriteHeight, numFrames = numFrames1}
filenameArray = {"001-015","016-030","031-045","046-060","061-075","076-090","091-105","106-120","121-135","136-150"}
fullSequence =
{
{name=filenameArray[1], sheet=graphics.newImageSheet("spritesheets/" .. filenameArray[1] .. ".png", frameInfoSet1), start = startFrame, count=numFrames1, time=2250, loopCount=1},
{name=filenameArray[2], sheet=graphics.newImageSheet("spritesheets/" .. filenameArray[2] .. ".png", frameInfoSet1), start = startFrame, count=numFrames1, time=2250, loopCount=1},
{name=filenameArray[3], sheet=graphics.newImageSheet("spritesheets/" .. filenameArray[3] .. ".png", frameInfoSet1), start = startFrame, count=numFrames1, time=2250, loopCount=1},
-- more such spritesheets are loaded further...
}
firstSpriteSheet = fullSequence[1]["sheet"]
sequenceNumer = 1
tt = display.newSprite (firstSpriteSheet, fullSequence)
tt.x = display.contentWidth/2 ; tt.y = display.contentHeight/2
tt:addEventListener( "sprite", spriteListener )
tt:play()
但是,我想要实现的是这种技术的“流式”版本。即我将从总共50个中加载3个精灵表,因此需要6 MB来开始播放动画并继续加载额外的精灵表,因为已经加载的精灵表继续播放。因此,为了进一步说明,我加载薄片1,2,3并在时间薄片1完成时开始播放动画和装入薄片4,在时间薄片2完成时装载薄片5,依此类推。
任何建议表示赞赏!提前致谢。
我觉得这是一个老问题,但我会从我的经验中添加一些想法:
这不是一件容易的事,但它是可能的
我建议添加简单的加载场景,您将在加载时显示进度条。
local filenameArray = ... -- this is from your code
local preloadedSheets = {}
local function enterFrameLoading()
local nextSheetToLoad = #preloadedSheets + 1
if (nextSheetToLoad > #filenameArray) then
Runtime:removeEventListener("enterFrame", enterFrameLoading)
-- go to game scene if you are using scenes
return
end
preloadedSheets[nextSheetToLoad] =
graphics.newImageSheet("spritesheets/" .. filenameArray[nextSheetToLoad] .. ".png", ??)
updateProgress(nextSheetToLoad) -- this function will update UI, i.e. progress bar, text, etc
end
Runtime:addEventListener("enterFrame", enterFrameLoading)
预加载后,所有工作表都将在内存中,因此您不应该遇到性能问题
您可以在spriteListener
中创建新对象 - 再次,将所有精灵存储在表中并使用.isVisible = false
隐藏旧精灵
您只需3个序列即可创建精灵对象。然后像上面显示的那样在enterFrame监听器中预加载其他工作表。
预加载完成后,你想要销毁旧的精灵并使用相同的序列和框架创建新的精灵
如果您需要更多相关信息,请与我们联系