Cocos2dx中线程优先级

Cocos2dx中线程优先级问题

  不论是ios还是android,遇到耗时的任务都要另起线程处理,否则程序不能及时用户的反馈。游戏中如果一圈循环不能在1/frameRate(帧率是30则1/30)秒内完成,就会有掉帧,游戏卡顿。比如,游戏中要解析一个动画json配置,需要60ms,这如果在主线程中搞就掉帧了,那么另再开个线程解析json,解析完了再通知主线程如何?这是可以的,但是考虑一种极端情况,线程切换到json解析线程,直到json解析完成后才切换到主线程,这不是一样掉帧吗!所以理想情况是让json解析线程的优先级低于主线程,在主线程空闲时才进行json解析,这就与控制线程的优先级了,那么cocos2dx中可以设置线程的优先级吗?请看下文。

1.创建线程方式

  创建线程采用c++11中thread库,但是c++11中thread没有指定线程优先级或cpu亲和度(affinity)的相关方法(比如sched_setaffinity、 SetThreadAffinityMask、 pthread_attr_setschedpolicy)。需要用到pthread库中函数(目前用的是pthread_setschedparam),才可能控制线程优先级。

2. 线程优先级:

  类unix系统中线程优先级调度策略常用的有SCHED_OTHER、SCHED_FIFO、SCHED_RR,其他的还有SCHED_BATCH、SCHED_BATCH、SCHED_IDLE。可以参考sched_setscheduler(2) - Linux man page

  SCHED_OTHER:新创建的线程默认情况下是此调度方式,主线程也是此调度方式,此调度方式没有线程优先级,在所有线程都是SCHED_OTHER调度方式时,由操作系统进行公平调度。

  SCHED_FIFO和SCHED_RR:  有优先级的调度,有优先级高的线程,操作系统运行运行优先级高的线程。当既有SCHED_OTHER也有SCHED_FIFO(或SCHED_RR)时,SCHED_FIFO(或SCHED_RR)总是先于SCHED_OTHER运行。

  SCHED_FIFO和SCHED_RR区别是:若线程优先级一样,则SCHED_FIFO按照FIFO的顺序运行,后进入的线程要等前面线程运行完或放弃cpu才能执行。SCHED_RR会进行时间片轮转,时间片到了,切换执行线程。

  SCHED_OTHER优点是不用处理线程的实时(有高优先级线程来立即切换线程)切换,cpu利用率会比SCHED_FIFO和SCHED_RR高。

  可以参考linux进程调度方法(SCHED_OTHER,SCHED_FIFO,SCHED_RR)

3.结论:

  若不改变主线程的默认调度规则SCHED_OTHER,则通过pthread_setschedparm设置线程优先级无效果,也就是说不能保证其他的线程一定不影响主线程的执行效率。若将主线程的调度规则改为SCHED_FIFO(或SCHED_RR),创建的线程也设置调度规则为SCHED_FIFO并设置低优先级,可以保证主线程有更高cpu占用率。

在AppDelegate::applicationDidFinishLaunching中加入如下代码改变主线程调度方式,游戏可以正常运行,副作用暂时没有发现。

4.测试数据

  打印的线程优先级优先级最大值最小值都是47到15,不是传说中的1到99。SCHED_OTHER max is 47, min is 15。SCHED_FIFO max is 47, min is 15。SCHED_RR max is 47, min is 15。每次测试开2个线程(线程1和线程2),分别设置调度方式和优先级,红字是令人费解的地方。

mac下mac模拟器


调度方式


优先级


Log打印次数


线程1


SCHED_OTHER


46


16374


线程2


SCHED_OTHER


16


311


线程1


SCHED_OTHER


16


579


线程2


SCHED_OTHER


46


7856


线程1


SCHED_OTHER


30


1400


线程2


SCHED_OTHER


31


8082


线程1


SCHED_OTHER


31


8628


线程2


SCHED_OTHER


30


1864


线程1


SCHED_RR


16


1099


线程2


SCHED_OTHER


46


12784

Mac下ios模拟器


调度方式


优先级


Log打印次数


线程1


SCHED_OTHER


46


16799


线程2


SCHED_OTHER


16


238


线程1


SCHED_OTHER


16


3982


线程2


SCHED_OTHER


46


103177


线程1


SCHED_OTHER


30


2147


线程2


SCHED_OTHER


31


21478


线程1


SCHED_RR


16


1674


线程2


SCHED_OTHER


46


16096

iphone 5s:


调度方式


优先级


Log打印次数


线程1


SCHED_OTHER


46


463/ 1465/1553


线程2


SCHED_OTHER


16


1781/1726/1568


线程1


SCHED_OTHER


16


1030


线程2


SCHED_OTHER


46


1284


线程1


SCHED_OTHER


30


372


线程2


SCHED_OTHER


31


2005


线程1


SCHED_RR


16


52262


线程2


SCHED_OTHER


46


1161


线程1


SCHED_RR


46


13055


线程2


SCHED_RR


16


1145


线程1


SCHED_RR


46


19858


线程2


SCHED_RR


45


2046

Mac下 app


调度方式


优先级


Log打印次数


线程1


SCHED_OTHER


46


13099


线程2


SCHED_OTHER


16


59311


线程1


SCHED_OTHER


16


45864


线程2


SCHED_OTHER


46


3598


线程1


SCHED_OTHER


30


7512


线程2


SCHED_OTHER


31


4561


线程1


SCHED_RR


16


57981


线程2


SCHED_OTHER


46


5909


线程1


SCHED_RR


46


58960


线程2


SCHED_RR


45


5494

测试代码mac app:

Cocos2dx测试代码:

时间: 2024-08-02 15:16:35

Cocos2dx中线程优先级的相关文章

java中线程优先级是怎么回事给出一个例子

j6.线程优先级 (视频下载) (全部书籍) java中线程的优先级用1-10之间的数字表示,数值越大优先级越高,默认的优先级为5.Java中的线程优先级是在Thread类中定义的常量 NORM_PRIORITY : 值为5,MAX_PRIORITY :值为10,MIN_PRIORITY : 值为1,缺省优先级为 NORM_PRIORITY.有关优先级的常用方法有两个:1)final void setPriority(int newp) : 修改线程的当前优先级  2)final int get

编程思想之多线程与多进程(2)——线程优先级与线程安全

原文:http://blog.csdn.net/luoweifu/article/details/46701167 作者:luoweifu 转载请标名出处 <编程思想之多线程与多进程(1)--以操作系统的角度述说线程与进程>一文详细讲述了线程.进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础.本文将接着讲一下线程优先级和线程安全. 线程优先级 现在主流操作系统(如Windows.Linux.Mac OS X)的任务调度除了具有前面提到的时间片轮转的特点外,还有优先级调度(Prior

C#的线程类之Thread类以及对为什么设置线程优先级却不先执行这一问题本身的认识

1.C#对线程进行操作时,通过Thread类,可以对线程进行创建.挂起.恢复.休眠.终止及设置优先级. Thread类位于System.Threading命名空间下,该命名空间还包含一个ThreadPool类(允许用户使用系统提供的线程池)和一个Timer类(在线程池上执行回调方法) 在线程运行期间,不同的时刻会表现为不同的状态,但它总是处于由ThreadState定义的一个或多个状态中.用户可以通过使用ThreadPriority枚举为线程定义优先级,但不能保证操系统会接收该优先级 2.Thr

第10章 线程控制(2)_线程属性和线程优先级

3. 线程属性 3.1 线程属性结构体 (1)pthread_attr_t结构体 (2)线程属性初始化和销毁 头文件 #include <pthread.h> 函数 int pthread_attr _init(pthread_attr_t* attr); //初始化 int pthread_attr_destroy(pthread_attr_t* attr); //销毁 返回值 成功返回0,否则返回错误编号 3.2 设置和获取分离属性 头文件 #include <pthread.h&g

cocos2d-x中的Box2D物理引擎

在Cocos2d-x中集成了2个物理引擎,一个是Chipmunk,一个是Box2D.前者是用C语言编写的,文档和例子相对较少:Box2D是用C++写的,并且有比较完善的文档和资料.所以在需要使用物理引擎的时候,大多数开发者会选择Box2D.Box2D是一款用来模拟刚体在物理世界运动的仿真引擎.通过Box2D物理引擎,世界中的物体就可以按照运动定律进行运动. 注:Box2D下的类都是以b2为前缀的,希望不要与你的命名相冲突 1. 首先我们介绍下需要用到的基本概念. 世界(world) :世界代表了

关于Java中线程池的解读

之前的面试中多次被问到线程池的相关内容,所以在之后的时间内我仔细的学习了一下线程池的相关内容. 1.使用线程池的意义 复用:类似WEB服务器等系统,长期来看内部需要使用大量的线程处理请求,而单次请求响应时间通常比较短,此时Java基于操作系统的本地调用方式大量的创建和销毁线程本身会成为系统的一个性能瓶颈和资源浪费.若使用线程池技术可以实现工作线程的复用,即一个工作线程创建和销毁的生命周期期间内可以执行处理多个任务,从而总体上降低线程创建和销毁的频率和时间,提升了系统性能. 流控:服务器资源有限,

《Windows via C/C++》学习笔记 —— 线程优先级【转】

转自:http://www.cnblogs.com/wz19860913/archive/2008/08/04/1259807.html 每个线程都有一个“优先级”,范围是0-31,0为最低优先级,31为最高优先级.当系统决定哪个线程需要调度的时候,首先查看是否存在优先级为31的可调度线程,如果存在,就从中选择一个进行调度.当该线程的时间片到达之后,系统查看是否存在另一个优先级为31的可调度线程,如果存在,就调度它. 只要有一个可调度的优先级为31的线程存在,那么系统绝对不会调度优先级为0-30

线程优先级抢占实验【RT-Thread学习笔记 3】

同时处于就绪状态的线程,优先级高的先执行. 高优先级就绪时,低优先级任务让出CPU,让高优先级任务先执行. 创建两个任务函数: //线程优先级抢占 void thread1_entry(void *parameter) { rt_uint32_t count = 0; while(1) { for(;;count++) { rt_thread_delay(3*RT_TICK_PER_SECOND); //等三秒输出一次 rt_kprintf("count = %d\n",count);

五、线程优先级和守护线程

java 中的线程优先级的范围是1-10,默认的优先级是5.“高优先级线程”会优先于“低优先级线程”执行.优先比不是绝对. java 中有两种线程:用户线程和守护线程.可以通过isDaemon()方法来区别它们:如果返回false,则说明该线程是“用户线程”:否则就是“守护线程”. 用户线程一般用户执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务.需要注意的是:Java虚拟机在“用户线程”都结束后会后退出. 在一些运行的主线程中创建新的子线程时,子线程的优先级被设置为等于“创建