文档章节

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

ueharaai
 ueharaai
发布于 2013/07/26 08:27
字数 738
阅读 70
收藏 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
徐汇
技术主管
私信 提问
纯用户空间抢占式多线程的设计

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

晨曦之光
2012/04/10
315
0
WEB(事务型)系统软硬件生产力、可靠性,稳定性及其它质量方案(MAP/REDUCE:HADOOP)

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

刘小兵2014
2010/12/06
0
2
802.11ax前瞻3:上行随机接入(TF,TF-R)

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

徐方鑫
2016/12/18
0
0
自动驾驶入门日记-6-视频语义分割

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

我爱大头老婆
06/20
0
0
JAVA的多个线程可以同时在CPU的多个核心上运行么?

现在的电脑cpu 都是多核,CPU对于各个线程的调度是随机的(分时调度),如果程序中 开启了多个线程,那么这几个线程是分别同时运行在不同的核心上呢,还是由于 JVM对线程的调度,使得 这几个...

_星仔
08/20
560
4

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Feign 异常处理

问题 最近在项目开发中,使用 Feign 调用服务,当触发熔断机制时,遇到了以下问题: 异常信息形如:TestService#addRecord(ParamVO) failed and no fallback available.; 获取不到服务提供方...

xiaomin0322
23分钟前
2
0
解决OSX使用oh-my-zsh后.bash_profile自定义失效

场景描述 为了使OSX自带的终端在使用上更加顺手,便安装了oh-my-zsh插件, 但发现之前在.bash_profile自定义的一些内容都失效了。 问题分析 oh-my-zsh有自己的配置文件,覆盖了.bash_profile...

SuShine
26分钟前
1
0
java中线程读取配置文件properties

配置文件在很多方面可以用到,比如数据库连接,数据库工厂方法的调用,只要在配置文件中修改即可,不用修改程序,使用起来还是很方便的。 现在演示一下通过线程读取配置文件进行反射的一种方...

寒风中的独狼
28分钟前
3
0
面向接口编程详解-Java篇

  相信看到这篇文字的人已经不需要了解什么是接口了,我就不再过多的做介绍了,直接步入正题,接口测试如何编写。那么在这一篇里,我们用一个例子,让各位对这个重要的编程思想有个直观的印...

浮躁的码农
29分钟前
3
0
NPM install -save 和 -save-dev 傻傻分不清

本文原文地址:https://www.limitcode.com/detail/59a15b1a69e95702e0780249.html 回顾 npm install 命令 最近在写Node程序的时候,突然对 npm install 的-save和-save-dev 这两个参数的使用...

翔飘飘
30分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部