文档章节

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

ueharaai
 ueharaai
发布于 2013/07/26 08:27
字数 738
阅读 67
收藏 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
博文 22
码字总数 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
0
纯用户空间抢占式多线程的设计

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

晨曦之光
2012/04/10
268
0
自动驾驶入门日记-6-视频语义分割

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

我爱大头老婆
06/20
0
0
WEB(事务型)系统软硬件生产力、可靠性,稳定性及其它质量方案(MAP/REDUCE:HADOOP)

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

刘小兵2014
2010/12/06
0
2
两种驱动系统运行的方式--分时的方式

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

晨曦之光
2012/04/10
541
0

没有更多内容

加载失败,请刷新页面

加载更多

控件WebView显示网页

一、代码编写 (一)方法一:通过打开app直接打开指定网站 1.打开Android Stutio,新建一个工程,名为Sdca。注意,名称开头必须为大写。 2.添加WebView控件 打开app esactivity_main.xml添加...

lanyu96
25分钟前
2
0
WinRAR 去除弹窗广告

想要去除它,需要用到另外一个工具resource hacker,百度一下,下载它,工具很小,安装也简单。安装过后,找到winrar安装目录下的WinRAR.exe文件,右击选择 open useing resource hacker打开...

YunOu
39分钟前
2
0
Bash工作管理详解

Bash工作管理 Bash的工作是对具体任务的一个抽象表述,更确切的说是对管道的应用上的表述。Bash中的工作在形式上表现为一组相关进程或单个进程。工作进程组分为前台和后台,前台进程会对键盘...

小陶小陶
43分钟前
2
0
Qt那些事0.0.1

LIBS += -L$$PWD/lib/ -lStv1QMAKE_POST_LINK += $$QMAKE_COPY $$replace(PWD,"/","\\")\lib\Stv1.dll $$replace(OUT_PWD,"/","\\")\debug\Stv1.dll pro文件里,写起来按理说应该是轻松地......

Ev4n
52分钟前
2
0
如何正确的使用动态VPS(Linux)自动更换IP

背景 现在越来越多的人开始玩网赚项目,蚂蚁再小也是肉,薅羊毛的羊毛党越来越多,一些网赚项目也越来越受欢迎,但是一般的网赚项目都是要求真实用户的,所以要想获得大量的真实ip,一种动态...

bengozhong
58分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部