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测试代码:

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

  1. EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)

    在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...

  2. 了解Java线程优先级,更要知道对应操作系统的优先级,不然会踩坑

    Java 多线程系列第 6 篇. 这篇我们来看看 Java 线程的优先级. Java 线程优先级 Thread 类中,使用如下属性来代表优先级. private int priority; 我们可以通 ...

  3. Java 多线程基础(十一)线程优先级和守护线程

    Java 多线程基础(十一)线程优先级和守护线程 一.线程优先级 Java 提供了一个线程调度器来监控程序启动后进去就绪状态的所有线程.线程调度器通过线程的优先级来决定调度哪些线程执行.一般来说,Ja ...

  4. Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞

    Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...

  5. <<Windows via C/C++>>学习笔记 —— 线程优先级【转】

    转自:http://www.cnblogs.com/wz19860913/archive/2008/08/04/1259807.html 每个线程都有一个“优先级”,范围是0-31,0为最低优先级,3 ...

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

    同时处于就绪状态的线程,优先级高的先执行. 高优先级就绪时,低优先级任务让出CPU,让高优先级任务先执行. 创建两个任务函数: //线程优先级抢占 void thread1_entry(void *p ...

  7. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...

  8. Delphi中线程类TThread实现多线程编程1---构造、析构……

    参考:http://www.cnblogs.com/rogee/archive/2010/09/20/1832053.html Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大 ...

  9. [改善Java代码]线程优先级只使用三个等级

    线程的优先级(priority)决定了线程获得CPU运行的机会,优先级越高获得的运行机会越大,优先级越低获得的机会越小.Java的线程有10个级别(准确的说是11个级别,级别为0的线程是JVM,应用程 ...

随机推荐

  1. React单元测试——十八般兵器齐上阵,环境构建篇

    一个完整.优秀的项目往往离不开单元测试的环节,就 github 上的主流前端项目而言,基本都有相应的单元测试模块. 就 React 的项目来说,一套完整的单元测试能在在后续迭代更新中回归错误时候给与警 ...

  2. 玩转Windows服务系列——给Windows服务添加COM接口

    当我们运行一个Windows服务的时候,一般情况下,我们会选择以非窗口或者非控制台的方式运行,这样,它就只是一个后台程序,没有界面供我们进行交互. 那么当我们想与Windows服务进行实时交互的时候, ...

  3. Rxjava Subjects

    上次提到调用observable的publish和connect方法后可以将一个Observable发出的对象实时传递到订阅在上的subscriber. 这个和Rxjava中Subject的概念十分相 ...

  4. 一个小型的CMS后台管理平台发布啦~

    由于我不太懂怎么把博客园里我上传的文件共享,所以只好先放到百度网盘里了 数据库和发布的网站都放在这里 http://pan.baidu.com/s/1eQw3DOA 有问题请参考以下链接: http: ...

  5. 简单使用Git和Github来管理自己的代码和读书笔记

    原文链接:http://my.oschina.net/bxxfighting/blog/378196   先注册github.com的账号官方网站: https://github.com/ 注册界面, ...

  6. 前端学HTTP之WEB服务器

    前面的话 Web服务器每天会分发出数以亿计的Web页面,它是万维网的骨干.本文主要介绍WEB服务器的相关内容 总括 Web服务器会对HTTP请求进行处理并提供响应.术语“Web服务器”可以用来表示We ...

  7. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  8. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(14)-EasyUI缺陷修复与扩展

    系列目录 不知不觉已经过了13讲,(本来还要讲多一讲是,数据验证之自定义验证,基于园友还是对权限这块比较敢兴趣,讲不讲验证还是看大家的反映),我们应该对系统有一个小结.首先这是一个团队开发项目,基于接 ...

  9. 2、C#核心编程结构

     本学习主要参考Andrew Troelsen的C#与.NET4高级程序设计,这小节主要述说以下几个东西: Hello World的Main方法: 利用VS2010新建一个控制台应用程序Hello W ...

  10. 计算机网络学习笔记--数据链据层之MAC子层(整理)

    概述: 为什么需要介质访问控制子层(MAC)? 介质访问控制子层(MAC)是局域网体系结构中划分的子层,多路访问链路采用共享介质连接所有站点.发送站点通过广播方式发送数据并占用整个带宽,如果有多个站点 ...