Creator 导成iOS 原生的,挺不流畅的。求解决!!!

很多年以前,捕鱼达人说性能卡,拿过来后我们改掉用Intel的工具查了一下性能热点,改掉里面两层for循环嵌套的地方,搞定。

后来北京触控另一个用cocos项目说手机发烫、耗电飞快,团队天天加班到半夜已经持续一周了。我们飞了个主力过去,只花了1天时间review代码,渲染的地方没有查出问题,结果人家在网路线程里面用死循环去轮询,while里面每次 sleep(1微秒),是的你没看错,1微秒。这一行代码顺手改成 sleep(20毫秒) 就搞定了,然后给他们上课讲什么叫生产者-消费者模型,怎么用事件等待。

我见过的游戏里的绝大多数闪退崩溃发热,都是这种很低级的错误,明明是通过公司内的技术培训、代码交叉审核就可以避免的。而且发热这种问题,用工具查一下热点,是非常容易的事情。

4赞

不是想拆王哲大大的台,一个线程里用死循环去轮询sleep(1)是绝对够了,这个东西的意义不是sleep,主要是用来切换CPU时间片,让当前CPU从当前线程切换到其它线程.我现在C++服务器底层就是这样写的,每个线程都只sleep(1),而且这个东西在linux系统下没什么问题,主要在windows系统下需要sleep(1);

他说的单位是 1微秒 和 20毫秒 你自己的是1毫秒

1毫秒=1000微秒

第一:我还真不知道sleep(1微秒)如何写
第二:只要sleep(>0),这里的实际sleep时间往往在15毫秒以上
第三:多线程是用几分钟就能学会,但要精通,需要很多年的亲身体会,特别作为客户端程序员往往轻视这个问题,导致各种机率很低的偶现宕机.

我再贴个分析:
"Sleep 接口均带有表示睡眠时间长度的参数 timeout。调用以上提到的 Sleep 接口,会有条件地将调用线程从当前处理器上移除,并且有可能将它从线程调度器的可运行队列中移除。这个条件取决于调用 Sleep 时timeout 参数。

当 timeout = 0, 即 Sleep(0),如果线程调度器的可运行队列中有大于或等于当前线程优先级的就绪线程存在,操作系统会将当前线程从处理器上移除,调度其他优先级高的就绪线程运行;如果可运行队列中的没有就绪线程或所有就绪线程的优先级均低于当前线程优先级,那么当前线程会继续执行,就像没有调用 Sleep(0)一样。

当 timeout > 0 时,如:Sleep(1),会引发线程上下文切换:调用线程会从线程调度器的可运行队列中被移除一段时间,这个时间段约等于 timeout 所指定的时间长度。为什么说约等于呢?是因为睡眠时间单位为毫秒,这与系统的时间精度有关。通常情况下,系统的时间精度为 10 ms,那么指定任意少于 10 ms但大于 0 ms 的睡眠时间,均会向上求值为 10 ms。"

sleep(1) 是可以,但当时的问题是在移动设备上发烫、耗电快。改成 20ms 后实际的 sleep 时间很可能变成 20 - 30ms,这对降低发热是有效的。定位出发热问题在哪后,解决问题就有思路了。

1赞

sleep(0.001)…

我怎么感觉以前做Window Mobile 程序也写过这事,是挺正常的,主要的目的是切换CPU时间片。也许上面的循环里条件太复杂了。
不过最近用的creator -js版本,确实让我有点无从下手的感觉。 用了几年了lua,写法开发上都差不多,只是对lua项目翻译成js,支持h5。。哎 又要蛋疼起来。

如果别人都不卡的话,我也只能认怂 撸去了。长夜漫漫,代码很难。:joy:

js有时间打印函数,你确定下哪块的代码执行时间长,是多少毫秒! 尽量精确到某行代码,或者通过引擎的哪个接口导致耗时长。
有数据说话,比猜测好多了!

http://forum.cocos.com/t/web/48512 这个案例,铁证如山

真的感谢@panda和@jare,貌似论坛里面有问题就@他们两个了,王哲大大记得给他们多一些股票:wink:
对于这些问题,具体问题具体分析:
问一些功能怎么现实的,或是基础用法,或是无脑喷,大多可以忽略掉了。
如果是一些有价值的反馈,像崩溃,性能的问题,还是值得关注一下的。特别是我们做的游戏,真正会面对很多实际的问题,有时候真的是引擎没法满足,而我也认为我们这种实际MMO提出来的需求,一定是非常实用的,也是使引擎更上一个台阶的。

2赞

你最后是怎么搞定的。

wangzhe你好,请问下你说的Intel工具是哪一个,没有搜道,谢谢!

我猜是vtune

来 给个联系方式,大保键必须有。

用的什么工具,以前没有接触过,发个名字出来,以后要用的话可以去查,谢谢

一样,很感谢@jare,一直很活跃给大家回复问题。

这个问题在Creator 1.6就已经修复掉了

你怎么知道我要多给他们股票。

没有,我这两天拿到1.6做了很多测试,只能说1.6比以前要好一点,以前效率比是 1:20(原生:web),现在大概是1:14,不得不说,原生效率提升了30%左右。当然,这只是个案不代表所有游戏