cocostudio2.06+cocos2dx-3.3final
我把flash的动画导到cocostudio,例子和插件都是论坛的那个。
然后我播放一个动画是从92帧到114帧的,一共22帧,在92帧加了一个start的帧事件,在114帧加了一个end事件。
在60帧是没什么问题的,但我把游戏引擎的帧率从60帧设到20帧,发现动画跑了10帧左右就回调end事件了,没有跑足22帧,求解。
网上也有许多关于flash帧速率的讨论,至今Flash Player的帧速率还有一些令人费解的问题。
Flash使用“相对定时模型”(relative timing model),这意味着它并不考虑全局的帧速率问题,只是尽可能地强制保持帧间隔时间。假设你设置影片速率为30帧/秒,这就意味着Flash Player要在帧间等待33毫秒(包括处理帧内容的时间),这种不精确的定时方法导致了许多问题。首先Flash Player依赖高级的操作系统级事件传递定时信息。最坏的情况下使用基于NetScape plugin API 的WM_TIMER,或者最好的情况下使用Internet Explorer API提供的多媒体时钟。第二,因为windows或者MacOS使用的最小时间单位是毫秒,所以只能近似到毫秒的帧间隔单位。第三,操作系统、浏览器、Flash Player在执行帧上的脚本时还会有额外的开销,所以最终的实际帧速率在设计帧速率上有-10到+5帧/秒的浮动,因此系统环境的性能影响很大。
都导成csb了,和flash应该没多大关系吧。
那个bug是cocos2d-x3.4beta0才有的吧,我用的是cocos2dx-3.3final的。
不是的,3.3也有,反正我3.3的时候也有
但是60帧下是没有问题,这个bug只是低帧率下。
跳帧了,时间是一致的就没问题;帧率60时的22帧和帧率20时的10帧(应该是7-9帧左右)的时间是一致的
cocos理论上不是不需要处理跳帧的这个问题的吗?为什么studio的动画要搞跳帧?
理论上?怎么说?
cocos引擎中,director的runloop,当前帧率超过你预设的就sleep一阵子,而帧率不足就只是一直run而已,逻辑还是会走完了,不需要处理掉帧的情况。
而在flash中,掉帧是要处理掉帧过程的逻辑的。
尝试用3.4beta0测试没出问题吗?
刚尝试用3.4beta0,然后也修复了你的那个cctimeline的bug,还是不行。我也用2.1的cocostudio重新导出过资源,那个问题还是存在。
end的帧事件回调的时候,我把frame的frameIndex输出来,确实是114,但是跟cocos引擎跑过的帧数对不上。
还是那个老问题,帧数低的时候,明明那个动画是22帧的,但只跑了10帧不到。
然后我看ccactiontime的源码,发现时间间隔是写死了1/60?
但我上次用3.3final的时候,在debug模式下,掉帧环境也出现了这个问题了。应该和我主动把帧率设成20帧没关系吧?
这个能解决吗?我怕以后掉帧的时候会出现问题.
可否提供你的代码我瞧瞧。
我有空的时候会测试下。
因为是公司内部代码,不能发出来,我写了一个demo让你测试下,好吗?
资源还是那只鲨鱼,flash转cocos的那个例子的。
帧事件:
我在鲨鱼的generalshark_left_foot部件(第一个)的68帧添加了一个start事件,151帧添加了一个end事件。
环境:
Cocos2dx-3.3final,CocoStudio2.05,CocosCodeIDE1.10
代码如下:
cc.FileUtils:getInstance():addSearchPath(“src”)
cc.FileUtils:getInstance():addSearchPath(“res”)
– CC_USE_DEPRECATED_API = true
require “cocos.init”
– cclog
local cclog = function(…)
print(string.format(…))
end
– for CCLuaEngine traceback
function G__TRACKBACK(msg)
cclog("----------------------------------------")
cclog(“LUA ERROR: " … tostring(msg) … “\n”)
cclog(debug.traceback())
cclog(”----------------------------------------")
return msg
end
local function main()
collectgarbage(“collect”)
– avoid memory leak
collectgarbage(“setpause”, 100)
collectgarbage(“setstepmul”, 5000)
-- initialize director
local director = cc.Director:getInstance()
--turn on display FPS
director:setDisplayStats(true)
--set FPS. the default value is 1.0/60 if you don't call this
director:setAnimationInterval(1.0 / 60)
cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(1280, 720, 1)
--create scene
local gameScene = cc.Scene:create();
if cc.Director:getInstance():getRunningScene() then
cc.Director:getInstance():replaceScene(gameScene)
else
cc.Director:getInstance():runWithScene(gameScene)
end
local i = 1;
cc.Director:getInstance():getScheduler():scheduleScriptFunc(function(dt)
i = i + 1;
end,0,false);
local node = cc.CSLoader:createNode("generalshark.csb");
local action = cc.CSLoader:createTimeline("generalshark.csb");
node:runAction(action);
gameScene:addChild(node);
node:setPosition(150,100);
action:setFrameEventCallFunc(function(frame)
local index = frame:getFrameIndex();
local event = frame:getEvent();
print(string.format("frames:%i index:%i event:%s",i,index,event));
end);
action:gotoFrameAndPlay(68,151,false);
end
local status, msg = xpcall(main, G__TRACKBACK)
if not status then
error(msg)
end
输出:
frames:1 index:68 event:start
frames:208 index:151 event:end
因为这个资源是24fps的,所以它把83帧的动画拉到207帧,这是没问题的。
因为只有一只怪,在debug模式下也不能模拟掉帧的情况,所以我把帧率调成20帧。
director:setAnimationInterval(1.0 / 20)
输出:
frames:1 index:68 event:start
frames:69 index:151 event:end
问题就来了,cocos引擎只跑了68帧,end事件就回调出来了。
方便把那个鲨鱼的资源上传上来么?
我这儿没有flash没法转。
嗯,好的!
昨天回去竟然忘了这件事了。