请问这样用update是不是有点过分啊?

看到别人代码里有这样的处理:比如玩家获得100分后,利用update的刷新效果,每刷新一次就把分数加1,这样可以实现一个效果就是屏幕上分数栏那里的分数实现了分数滚动变大的效果,意思就是update 100次后,分数栏那里的分数就变成+100了。
一般而言,分数滚动或者倒计时之类的这种效果应该用setTimeout递归实现,但这兄弟用update的这个特性,偷懒地实现了分数滚动功能。
我也觉得这样挺省事,感觉此计甚妙啊,于是照着学,但我这里,类似于分数的地方比较多,比如钻石,道具之类的,有七八个,这样做的话,update里的代码量就有点多了。所以挺担心的,这样虽然省事,但update里内容太多,会不会有卡顿啊?
自己测试,偶尔有时候手机卡一下,但搞不清是不是和这个有关系,因为我的手机本来也比较老旧,玩别人的游戏有时候也卡顿。
请问大家一般都是怎样实现这种分数的滚动?这样用update实现滚动效果是不是有点不太好啊。。。。其实也就是想请教大家怎样把握用update的度的问题,是尽量能不用就不用呢?还是说像我这样有七八处动态显示栏的地方都用update也问题不大?
谢谢!

其实是差不多的,因为setTimeout在内部也会执行类似update的操作去累加dt。只不过从代码整洁度上来说,全写在update中不太好看

感谢回复,不过,玩家没获得分数的时候,自己就没有必要做分数滚动的setTimeout处理。但update这玩意不管玩家是不是获得分数了,一般是一秒肯定更新60次左右吧,频率比较高啊,有点害怕啊。反正如果这种滚动分数方法如果是个坏习惯,干脆不想用了。
现在有点神经质,有时候机器卡顿一下,自己就有点疑神疑鬼是不是update的问题。
其实有点哲学性质了,好比几十年前,那时候机器性能普遍比较差,大家能节约点内存就节约点,所以为了节约两个数字那点内存,出了个2000年问题。但现在没人刻意那么节约资源了,很多时候,为了代码简单易读等原因,浪费点资源也无所谓。
我就是不太清楚这么用update是无伤大雅呢,还是习惯非常不好。归根结底,就是update这东西能经得起多大程序量的摧残,搞不太清楚,呵呵

对,尽量少在update里写东西,代码一多就很难维护了,自己写个计时器模块吧

感谢回复,我没有做过小游戏开发。如果铁的原则是update里的东西尽量少,那我就另写计数模块了。

出于好奇,自己测试了一下,写了个十万的for循环,在电脑的chrome上好像都算流利,一百万的for循环时,明显卡顿了。
所以,感觉好像update这东西还挺皮实的。不过,无论如何,出于良好的习惯考虑,滚动分数我还是自己写计数器模块了。

UI肯定是在主线程跑的。
卡的话。你要优化的是update的代码。

嗯,倒不是说开销的问题,如果里面写的代码比较多各种判断会显得较比乱,当然这还是得看个人,毕竟每个人的想法不一样嘛 :grinning:

你可以浏览器上放慢6倍来模拟

我是单独写个计时器来滚动数字。有需要再滚动。放update里,update一直跑,就得一直判断有没有需要滚动数字。

给你讲个奇淫巧计

update1=function(){ }

update(dt){
update1()
}

有某种需要时
update1=function(){
某种需要…
}

没有需要时
update1= function(){ }

不过其实 我测试过
用 上面的方法和
update(dt){
if(xxxxx)return;
某种需要
}

这个方法…在谷歌浏览器中…并没有分出 优劣 耗时互有 消长

不过还是 第一个方法 看着舒服

其实你可以这样的,假如最终钻石100-当前钻石30等于70,设置个时间,计算出runAction的repeat个数,完美解决,每次变动就调用这个函数

1赞

你这个方法最靠谱,如果非要用update的话,最好封装一个,所有的都调用这一个~

cc.tween他不香么

建议自己写模块,而且数字滚定是滚动的总时间是一定的,滚动的数字越大,需要滚动的越快,updata控制起来不是很好

感谢大家的回复。昨天本来自己写了个setTimeout递归的计数,但怎么感觉有时有点卡啊,没准是我的错觉。或者是因为有时玩家加分比较大的时候,setTimeout递归几百次(更极端的时候,玩家连续得分,上次加分还没滚动玩呢,新的递归计数又来了),是不是javascript对这种疯狂递归的开销有点不适应啊。
我准备试试afk_yd老师说的runAction repeat的方法。

可以固定滚动次数,比如不管加分多少 ,就只滚动十次;
写个模块,有任务就丢进去,如果上次的没结束就终止掉

这个正解! 目前最好的方法就是用时间动画去实现, 对于单线程语言来说 放到定时器和放到迭代函数里面一样的, 但是在多线程框架里面, 效果就不一样了, 迭代函数阻塞会直接影响渲染线程, 所以为了统一和编码习惯,最好还是将大量带有运算逻辑和比较耗时的代码放在定时器里面,因为在多线程框架中, 迭代器是处在独立线程或协程中执行的, 并不会直接的影响渲染线程. 但是对于加金币的滚动效果, 请使用带有时间的动画制作.

看一下评论啊亲。。

我们游戏的做法也是类似,但对update的频率做了限制,例如: 刷新动画两秒,每秒update 5次左右。
你每帧update,不是必须的,你可以多试几次,你会发现每秒更新几次和每帧更新的效果差不多的,然后你设置一个比较合适的数值就好了
update 是不耗多少的,而是你对label 进行了操作,才会损耗的。如果你要对label 进行大量频繁操作,建议你用位图字体。