文档章节

基于帧的分时调度框架设计

ueharaai
 ueharaai
发布于 2013/07/26 08:27
字数 738
阅读 66
收藏 0
点赞 0
评论 0

随着项目的推进,越来越多的需要在帧与帧之间写一些pause&continue的任务,写了几个后,觉得还是要从框架上来解决这个问题比较好。比如你需要渲染一个很大很大的表格。而表格单元里的内容和大小是是先不知道的,每一个表格的里单元渲染完毕都有可能直接引发整体的重新布局,这个消耗是非常大的,因此渲染和布局的任务不能一次性完成,就像加载页面的浏览器,如果在页面载入的时候不能进行任何操作,估计没有人能够忍受。


分时调度的基本思想是把原本一份执行过程切分成N分,一次执行一份或几份,如果在本帧内执行不完,就留到下一帧执行,直到全部执行完毕。这样保证前端的流畅度并且能完成任务,此外,如果有多个任务在执行的话,就存在调度的问题,不然大家就会撞车,结果还是跟不分开执行没什么么区别。


这时候,要是用python,ruby,或lua这样的软件来写程序就爽死了,直接在方法中放入yield。要做的事情是最少的。go的话,据说有coroutine,应该也不错。不支持yield的程序语言,有的人肯定想到了用线程……如果要用线程,权衡下由之引发的问题,宁可寻找一种不那么直接的处理方法。


接口设计:


function add(type:int,tasks:Array,callback:function)


type决定了一个此tasks的运行方式,基本类型有
1.顺次执行


假设一个任务的流程是


function foo(){
   //do something1
   //do something2
   //do something3
   return result
}


改写成


function foo(callback){
   function do1(){
       //do something1
   }
   function do2(){
       //do something2
   }
   function do3(){
       //do something3
   }
   function getresult(){
      callback(result)
   }


   add(1,[do1,do2,do3],getresult)


}




2.链形


链形每次返回下次执行的方法,直到返回null结束,比如for循环


function foo(){
for(i=0;i<10;i++){
//do something1
}
}


改写后变成


function foo(callback){
i = 0;
function doNext(){
//do something1
i++;
if(i<10){
return doNext;
}else{
callback();
return null;
}
}


add(2,[doNext],null);
}


可以选择将callback交给调度器返回,也可自行返回,自由决定。


调度主循环




function startLoop(){
timeleft = 0;
onExitFrame(){
timeleft = getTime();
}
onEnterFrame(){
timeleft = 1000/30-(timeleft-getTime());//比较两个差值记录本帧剩余时间量。假设一秒钟运行30帧
if(timeleft<=0){
//即使帧内时间已耗尽,至少执行一次
return;
}
while(timeleft){
time = getTime();
//遍历每个任务,执行
timeleft -= getTime()-time;//减去执行任务的损耗
},
}


}


差不多了,其实还可以加上优先级别,再加上挂起,中断等方法,这就是个线程框架了,实施代码要多些。
虽然没有yield,但是人工的将代码分割,也并不是那么复杂的。


© 著作权归作者所有

共有 人打赏支持
ueharaai
粉丝 42
博文 19
码字总数 18134
作品 0
徐汇
技术主管
802.11ax前瞻3:上行随机接入(TF,TF-R)

序言 在802.11ax以前,MAC的接入机制是典型的CSMA机制(即DCF中所采用的CSMA/CA)。在引入了OFDMA的需求之后,802.11ax的MAC层随机接入机制也发生了变化,在协议中,代替传统的CSMA思想,802...

徐方鑫 ⋅ 2016/12/18 ⋅ 0

纯用户空间抢占式多线程的设计

纯用户空间的抢占式多线程库其实是很麻烦的一件事,在设计之前首先必须明白抢占式多线程的意义,其本质就是古老的unix多道程序设计,策略可以是分时的,也可以是其它任何的调度策略,不管什么...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

WEB(事务型)系统软硬件生产力、可靠性,稳定性及其它质量方案(MAP/REDUCE:HADOOP)

操作系统理论毫无任何理由地“认为”分时调度优于批处理调度。 严重怀疑这是IBM的一个阴谋:即利用分时策略浪费用户的大型机资源。以便销售出去更多的当时很赚钱的大型主机。因为分时理论的提...

刘小兵2014 ⋅ 2010/12/06 ⋅ 2

自动驾驶入门日记-6-视频语义分割

在自动驾驶任务中,实时性一直是急需解决的一个问题,也是极其具有挑战性的一个问题。一方面,现阶段一辆装满所有传感器的自动驾驶汽车每秒收集的数据量高达1-4GB(数据来自网络,不一定准确...

我爱大头老婆 ⋅ 前天 ⋅ 0

两种驱动系统运行的方式--分时的方式

引子:哪些是该负责的,哪些是不该负责的 哪些是该负责的,哪些是不该负责的,这是一个问题,hrtimer就能保证所有的timer都可以不延时的被执行吗?不能,很简单,如果你排入10000个timer,每...

晨曦之光 ⋅ 2012/04/10 ⋅ 0

进程与进程调度优先

这里先说一下进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程...

Sevenot_Hu ⋅ 2017/07/08 ⋅ 0

阿里云郑晓:浅谈GPU虚拟化技术(第三章)

第三章 浅谈GPU虚拟化技术(三)GPU SRIOV及vGPU调度 GPU SRIOV原理 谈起GPU SRIOV那么这个世界上就只有两款产品:S7150和MI25。都出自AMD,当然AMD的产品规划应该是早已安排到几年以后了,未...

阿里云头条 ⋅ 04/25 ⋅ 0

java线程调度

1、首先简单说下java内存模型:Java中所有变量都储存在主存中,对于所有线程都是共享的(因为在同一进程中),每个线程都有自己的工作内存或本地内存(Working Memory),工作内存中保存的是主...

小天120 ⋅ 2014/01/26 ⋅ 0

进程调度算法

调度也称dispatcher 这是内核的主要职责之一就是决定该轮到哪个任务运行了多数实时内核是基于优先级调度算法的每个任务根据其重要程度的不同被赋予一定的优先级基于优先级的调度法指CPU 总是...

2k10 ⋅ 2015/03/14 ⋅ 0

FusionSphere 物理CPU与VCPU的关系梳理总结

原贴转自http://forum.huawei.com/enterprise/zh/forum.php?mod=viewthread&tid=322397&extra=&page=1 背景说明: 之前在项目和培训中多次被问题FusionSphere物理CPU和vCPU的对应或分配关系,...

羊草 ⋅ 04/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【elasticsearch】 随笔 Date datatype

一。时间类型的本质 首先json是没有时间类型的,对于es来说,时间类型的标示可以是下面三种情况 1.一个时间格式的字符串,如:"2014-11-27T08:05:32Z","2015-01-01" or "2015/01/01 12:10:3...

xiaomin0322 ⋅ 16分钟前 ⋅ 0

阿里云资源编排ROS使用教程

阿里云资源编排ROS详细内容: 阿里云资源编排ROS使用教程 资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、...

mcy0425 ⋅ 19分钟前 ⋅ 0

适配器设计模式

1、适配器模式 把一个类的接口变换成客户端所期待的另一种接口 使原本因接口不匹配而无法在一起工作的两个类能够在一起工作 分为类的适配器模式和对象的适配器模式 2、类适配器模式 类的适配...

职业搬砖20年 ⋅ 23分钟前 ⋅ 0

npm操作报错 _stream_writable.js:61

有一天 不知道什么原因(估计和node的版本有关),无论你做什么npm的操作 都会报错/usr/local/lib/node_modules/npm/node_modules/readable-stream/lib/_stream_writable.js:61 这时候只要执...

lilugirl ⋅ 27分钟前 ⋅ 0

Eclipse安装插件的几种方式

Eclipse魅力之一就是支持可扩展的插件,来丰富自身的功能,这种方式也是建立在开源思想之上的。具体使用什么方式去安装插件,要看我们拿到的是什么。 1. 拿到的是一串URL,如http://subclips...

GordonNemo ⋅ 29分钟前 ⋅ 0

div图片叠加

css实现代码如下: <div style="position: relative;"><!--这个层为外面的父层,需设置相对位置样式--> <div style="position: absolute;"><!--子层,需设置绝对位置样式--> <i......

niithub ⋅ 30分钟前 ⋅ 0

作用域slot

如果父组件需要使用子组件中的内容怎么办,比如父组件需要控制子组件的显示 <div id="root"><child><template slot-scope="props"><h1>{{props.item}} <div>编辑</div></h1><......

金于虎 ⋅ 33分钟前 ⋅ 1

HongHu commonservice-eureka 项目构建过程

上一篇我们回顾了关于 spring cloud eureka的相关基础知识,现在我们针对于HongHu cloud的eureka项目做以下构建,整个构建的过程很简单,我会将每一步都构建过程记录下来,希望可以帮助到大家...

明理萝 ⋅ 36分钟前 ⋅ 1

xml和对象的相互转化

@Data//setter和getter方法,toString和equals,hashcode方法@EqualsAndHashCode//代表重写equals和hashcode方法@XmlAccessorType(XmlAccessType.FIELD)public class Classroom {@X......

拐美人 ⋅ 36分钟前 ⋅ 0

tableView cell的高度 分组头部尾部的高度 自适应

@property (nonatomic) CGFloat rowHeight; // default is UITableViewAutomaticDimension@property (nonatomic) CGFloat sectionHeaderHeight; // default is UITableViewA......

娜一片蓝色星海 ⋅ 37分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部