文档章节

cocos2d-x子线程渲染问题。

消失了雨痕
 消失了雨痕
发布于 2014/03/25 14:40
字数 986
阅读 1608
收藏 2

原因有2个:

1、在子线程中是不能进行UI 更新的,而可以更新的结果只是一个幻像:因为子线程代码执行完毕了,又自动进入到了主线程,执行了子线程中的UI更新的函数栈,这中间的时间非常的短,就让大家误以为分线程可以更新UI。如果子线程一直在运行,则子线程中的UI更新的函数栈 主线程无法获知,即无法更新
 
2、只有极少数的UI能,因为开辟线程时会获取当前环境,如点击某个按钮,这个按钮响应的方法是开辟一个子线程,在子线程中对该按钮进行UI 更新是能及时的,如换标题,换背景图,但这没有任何意义
 

1、程序一开始运行就进入了主线程
 
2、处理某些数据太过费时,影响用户交互,可以开辟子线程处理,然后通知主线程进行界面更新
 
测试代码:
 
开辟一个多线程,直接在子线程里进行ui 更新:
 
-(void)testUIRefresh:(UIButton *)button{

       [NSThread detachNewThreadSelector:@selector(beginTest) toTarget:self withObject:nil];

}
 
-(void)beginTest {
       NSLog(@” 当前线程  %@”,[NSThread currentThread]);

       NSLog(@” 主线程    %@”,[NSThread mainThread]);

      //该button 为  响应 testUIRefresh的button

       [self.button setTitle:@"AAA" forState:0];

}
 

2012-11-15 12:14:02.147 TestProj[2455:1b07]  当前线程  {name = (null), num = 3}
 
2012-11-15 12:14:02.147 TestProj[2455:1b07]  主线程    {name = (null), num = 1}
 
结果:当前的确是在子线程中,但是UI马上更新了??

结果分析:大家都说UI更新在主线程中做,上面的结果怎么解释

假设:如果在子线程里做了UI更新,待子线程运行完毕,程序自动进入 主线程进行指定的ui更新!

问题:如果子线程没结束呢?

在分线程中加入:
-(void)beginTest{
      NSLog(@” 当前线程  %@”,[NSThread currentThread]);

      NSLog(@” 主线程    %@”,[NSThread mainThread]);

      //该button 为  响应 testUIRefresh的button

      [self.button setTitle:@"AAA" forState:0];

      [NSThread sleepForTimeInterval:4.0];

}
 
结果:

self.button的title还是马上更新了

结果分析:难道上面的假设不成立?

问题:这次在分线程中add 一个button

-(void)beginTest{

      NSLog(@” 当前线程  %@”,[NSThread currentThread]);

      NSLog(@” 主线程    %@”,[NSThread mainThread]);

      //该button 为  响应 testUIRefresh的button
      [self.button setTitle:@"AAA" forState:0];
      UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
      [backButton setTitle:@"测试runloop" forState:0];
      [backButton setTitleColor:[UIColor redColor] forState:0];
      backButton.frame = CGRectMake(100, 200, 100, 50);
      [backButton addTarget:self action:@selector(testRunLoop)   forControlEvents:UIControlEventTouchUpInside];
      [self.window addSubview:backButton];
      [NSThread sleepForTimeInterval:4.0];

}
 
结果:[self.button setTitle:@"AAA" forState:0];马上响应了,但是添加的这个Button却一直等到线程结束才绘制出来
 
分析:在子线程中:如果要对其他UI 进行更新,则必须等到该子线程运行结束,而对响应用户点击的Button的UI更新则是及时的!不管他是在主线程还是在子线程中做的更新,意义都不大了,因为子线程中对所有其他ui更新都要等到该子线程生命周期结束才进行。
 
 
 
结论:
 
1、在子线程中是不能进行UI 更新的,而可以更新的结果只是一个幻像:因为子线程代码执行完毕了,又自动进入到了主线程,执行了子线程中的UI更新的函数栈,这中间的时间非常的短,就让大家误以为分线程可以更新UI。如果子线程一直在运行,则子线程中的UI更新的函数栈 主线程无法获知,即无法更新
 
2、只有极少数的UI能,因为开辟线程时会获取当前环境,如点击某个按钮,这个按钮响应的方法是开辟一个子线程,在子线程中对该按钮进行UI 更新是能及时的,如换标题,换背景图,但这没有任何意义

本文转载自:http://blog.sina.com.cn/s/blog_9a7e29220101bvfc.html

共有 人打赏支持
消失了雨痕
粉丝 6
博文 19
码字总数 1487
作品 0
杭州
高级程序员
私信 提问
加载中

评论(1)

无锡首席大都督程序员
这是2d啊,不是2dx啊
Cocos2d-x优化中多线程并发访问

多线程并发访问在Cocos2d-x引擎中用的不是很多,这主要是因为中整个结构设计没有采用多线程。源自于Objective-C的Ref对象,需要使用AutoreleasePool进行内存管理,AutoreleasePool是非线程安...

智捷课堂
2014/11/11
0
0
Cocos2d-x 3.x中Draw calls与ZOrder和纹理材质的关系

在Cocos2d-x 3.x中官方优化了引擎渲染的过程 例子 假如有A,B,C三个在不同plist的纹理,且他们的材质不相同,如果程序中 A-1 (表示 addChild(A,1),以下一样) B-1 C-1 Cocos2d-x引擎首先会根...

贺路的路
2016/10/20
10
0
Cocos2d-X 2.0嵌入MFC的子窗体的方法(1.0姐妹篇)

红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier 红孩儿Cocos2d-X学习园地QQ群:249941957 加群写:Cocos2d-x 另本章为我的Cocos2d-x教程一书初稿。望各位看官多提建议!...

长平狐
2013/03/19
96
0
Cocos2d-x游戏开发之图片元素

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier] 红孩儿Cocos2d-X学习园地QQ群:249941957 加群写:Cocos2d-x 本章为我的Cocos2d-x教程一书初...

长平狐
2013/03/19
56
0
Cocos2d-X 2.0嵌入MFC的子窗体的方法(1.0姐妹篇)

红孩儿的游戏编程之路 CSDN博客地址:http://blog.csdn.net/honghaier 红孩儿Cocos2d-X学习园地QQ群:249941957 加群写:Cocos2d-x 另本章为我的Cocos2d-x教程一书初稿。望各位看官多提建议!...

长平狐
2012/11/19
388
0

没有更多内容

加载失败,请刷新页面

加载更多

错误: 找不到或无法加载主类

在IDEA的使用过程中,经常断掉服务或者重启服务,最近断掉服务重启时突然遇到了一个启动报错: 错误:找不到或无法加载主类 猜测:1,未能成功编译; 尝试:菜单---》Build---》Rebuild Pro...

安小乐
13分钟前
1
0
vue路由传参,刷新页面,引发的bug

最近遇到一个bug 通过vue路由跳转到页面, 然后接参控制(v-if ),成功显示 而刷新页面,显示失败。 苦苦地找了半天原因,打印参数发现正确,再打印下类型......,路由跳过来会保持传参时的...

hanbb
13分钟前
0
0
【58沈剑 架构师之路】InnoDB,select为啥会阻塞insert?

MySQL的InnoDB的细粒度行锁,是它最吸引人的特性之一。 但是,如《InnoDB,5项最佳实践》所述,如果查询没有命中索引,也将退化为表锁。 InnoDB的细粒度锁,是实现在索引记录上的。 一,Inn...

张锦飞
16分钟前
0
0
冒泡,选择和插入排序比较

/** * 冒泡排序,两层嵌套循环,内层局部比较后,找出最大或者最小数据并交换数据,使其局部有序,外层用于比较剩余元素,相较于选择排序,选择排序相当于是冒泡的一个优化版本(减少了交换...

strict_nerd
17分钟前
0
0
html内联(行内)元素、块级(块状)元素和行内块元素分类

HTML可以将元素分类方式分为内联(行内)元素、块级(块状)元素和行内块元素三种。 注:HTML是标签语言,那么既然是标签,就可以自己定义一些自己元素(如<wode>自定义的元素</wode>等),自...

NB-One
23分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部