六十分之一秒真的能做那么多事情吗?

cocos现在的帧率是60,我有个疑问,如果游戏中有大量的动作要处理,比如像《捕鱼达人》那样的游戏,界面上那么多的鱼,每条鱼都有自己的动作,而且每一帧还要检测是否被渔网网住(我猜是这样啊,不对的话请指正),每一帧能完成这么多精灵的操作么?是怎么做到的?

我自己做过一个实验,也是在每一帧(update方法中实现)执行位移操作(setPosition方法),但是我发现有一部分的精灵在上一帧执行的动作还没做完的时候,就已经开始了下一帧的操作(因为我是让精灵在几个预设的点上经行位移的,每次位移之前要通过getPosition()方法来获取精灵当前的坐标,如果每一帧的动作都执行完的话,getPosition方法得到的坐标应该都是我预设的那些点中的一个,但是现在发现有时候得到的点并不在我预设的那些坐标之内,所以可以得出结论:上一帧的动作还没做完,下一帧的动作又开始了)。

因为我是在update方法中遍历每一个精灵,去让它们执行自己的动作,所以实际上它们执行动作的时间应该是不一样的,也就是说,如果在60分之一秒的时间内,不能完全遍历这些精灵并让它们执行完自己的动作,那么下一帧开始的时候,就会出问题。我现在只有十来个精灵,就已经是这样了。

所以想问问各位大神,应该怎么做,才能在这么短的时间内遍历完界面上所有应该做动作的精灵,并保证它们的动作能执行完呢?

是不是可以用多线程?

用action啊 可以不用在update中位移

用Action也是一样的呀,它实际上也是在移动精灵的位置呀。

你可以设置成30帧的~~

这个我也试过,帧数太低有些动作看上去就不流畅了……

能说详细一点么,有点不太明白,还有能把update的代码贴一下么

按我理解的话,上一帧没执行完的话是不会执行下一帧的.

如果没执行完帧率肯定会下降的

如果按你这样说上一帧没执行完就执行下一帧那你帧率永远都是60了,那你也不用考虑掉帧的问题了~所以我觉得可能是你update写的有问题吧

就是在update里面调用了一个设置位移的方法,简单说就是setPosition()或者MoveTo()来改变精灵的位置。

update()方法是cocos自己的呀,每1/60秒执行一次。

:12:动作不流畅是因为你setposition的位置不连贯,1/60秒cpu做几个矩阵变换有什么问题?

没听谁说过cocos的update是1/60秒执行一次。

什么叫【setposition的位置不连贯】?我的点是一组预设好的坐标,每个精灵都是按顺序一个点一个点的移动,是连续的呀。

— Begin quote from ____

引用第10楼Fuatnow于2015-12-28 01:15发表的 回 8楼(xiaomayjm) 的帖子 :
没听谁说过cocos的update是1/60秒执行一次。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=454228&pid=1467813

— End quote

:12:

cocos的fps是60,update()是每一帧调用一次,那不是1/60秒执行一次是什么?

我在update方法里面是通过调用别的方法来实现精灵设置位置的操作的,update方法并不用等调用的方法执行完,所以其实update应该是没有问题的,从我的程序逻辑上讲,它就是应该调用那些方法。

我原来想过是不是其他方法里面要做个判断,必须等上一次执行的操作执行完(也就是精灵到达指定的点)之后,才做下一次的位移操作,但是感觉动作有延迟一样,多个精灵之间感觉动作有时候不同步,总之就是不流畅。

我知道你意思,我说的是按帧理解的话,你不可能这帧没执行完就执行下一帧.

所以一般一个动作执行完以后有其他事件,你可以用回调来继续处理完成后的动作

上代码:12:

确实是应该像你说的这样,我可能还得捋一捋思路,看看是不是有些动作设计得不合理。

就是很简单的一个MoveTo()的 Action,木有别的了啊……update里面调用MoveTo,移动到另外一个点。

…moveTo和setPosition能一样吗?用法就有问题,要么你就moveto完用个callfunc移动到下一个点,要么就直接setPosition

如果你update里面moveTo肯定有问题的…(一般我的话update都是用来移动相对位置,比如在这个点的基础上移动2个像素)

他每帧都会执行这个动作,然后效果应该是后面越来越快(因为我之前这样写过)