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

Cocos2dx中线程优先级的更多相关文章
- EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)
在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...
- 了解Java线程优先级,更要知道对应操作系统的优先级,不然会踩坑
Java 多线程系列第 6 篇. 这篇我们来看看 Java 线程的优先级. Java 线程优先级 Thread 类中,使用如下属性来代表优先级. private int priority; 我们可以通 ...
- Java 多线程基础(十一)线程优先级和守护线程
Java 多线程基础(十一)线程优先级和守护线程 一.线程优先级 Java 提供了一个线程调度器来监控程序启动后进去就绪状态的所有线程.线程调度器通过线程的优先级来决定调度哪些线程执行.一般来说,Ja ...
- Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞
Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...
- <<Windows via C/C++>>学习笔记 —— 线程优先级【转】
转自:http://www.cnblogs.com/wz19860913/archive/2008/08/04/1259807.html 每个线程都有一个“优先级”,范围是0-31,0为最低优先级,3 ...
- 线程优先级抢占实验【RT-Thread学习笔记 3】
同时处于就绪状态的线程,优先级高的先执行. 高优先级就绪时,低优先级任务让出CPU,让高优先级任务先执行. 创建两个任务函数: //线程优先级抢占 void thread1_entry(void *p ...
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...
- Delphi中线程类TThread实现多线程编程1---构造、析构……
参考:http://www.cnblogs.com/rogee/archive/2010/09/20/1832053.html Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大 ...
- [改善Java代码]线程优先级只使用三个等级
线程的优先级(priority)决定了线程获得CPU运行的机会,优先级越高获得的运行机会越大,优先级越低获得的机会越小.Java的线程有10个级别(准确的说是11个级别,级别为0的线程是JVM,应用程 ...
随机推荐
- 使用Xamarin开发iOS7应用时隐藏StatusBar方法
在iOS7之前如果需要隐藏StatusBar,比较简单,直接在AppDelegate.cs中使用如下代码就可以进行隐藏: UIApplication.SharedApplication.StatusB ...
- Java的异步HttpClient
上篇提到了高性能处理的关键是异步,而我们当中许多人依旧在使用同步模式的HttpClient访问第三方Web资源,我认为原因之一是:异步的HttpClient诞生较晚,许多人不知道:另外也可能是大多数W ...
- Java回调方法详解
回调在维基百科中定义为: 在计算机程序设计中,回调函数,是指通过函数参数传递到其他代码的,某一块可执行代码的引用. 其目的是允许底层代码调用在高层定义的子程序. 举个例子可能更明白一些:以Androi ...
- .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数
.Net中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成10个随机数: ; i < ; i++) { Rando ...
- Entity Framework Code First学习系列目录
Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...
- 判断CPU是大端还是小端模式
在小端模式中,低位字节放在低地址,高位字节放在高地址:在大端模式中,低位字节放在高地址,高位字节放在低地址.big-endian和little-endian,51单片机是典型的大端模式,Intel电脑 ...
- fluent-ffmpeg 常用函数
最近项目频繁用到fluent-ffmpeg,将目前使用到的函数进行总结. 首先引入fluent-ffmpeg模块: var ffmpeg = require('fluent-ffmpeg'); 1.函 ...
- java自定义注解类
一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...
- 使用OAuth、Identity创建WebApi认证接口供客户端调用
前言 现在的web app基本上都是前后端分离,之前接触的大部分应用场景最终产品都是部署在同一个站点下,那么随着WebApi(Restful api)的发展前后端实现的完全分离,前端不在后端框架的页面 ...
- C站投稿189网盘视频源(UP主篇)
C站投稿189网盘视频源(UP主篇) 现在C站(吐槽弹幕网)的视频来源基本靠的都是189网盘,比如番剧区的每个视频基本来源于此,不像AB两站,拥有自己的资源服务器,为啥呢?没钱啊.都是外来的视频.本站 ...