通用编程能力训练 -- 设计心得:分步载入的改造(包含异步IO练习)

目标:将一个顺序载入的系统变成分步载入的系统。

 

动机:

也许你会说背景线程 可以达到更好的效果, 但是我想说的是在一些情况下是无法使用多线程的。
比如装载Shader程序,这些程序都需要使用CPU进行本地编译。
这时支持分步载入的系统就能根据情况来分散载入任务,平滑资源载入的过程,可以让系统充分利用时间来使前台功能看起来平滑。
另外一个理由是性能,基于多线程的系统总是会为各种锁支付额外的开销,对于Ogre而言,这2种工作模式的性能差异可以达到30%以上。
注意,这个改造方案和多线程工作模式不冲突。

 

步骤:

1、确保存在 isLoaded() 或类似方法,因为分步载入的结构和异步结构一致.
2、确保存在一个用于记录所有的加载任务的数据成员,如果没有就定义一个.
3、添加一个游标变量记录当前正在处理哪个子对象,可以是一个对象引用、上值、索引、迭代器等.
4、添加一个用于步进载入的函数 bool loadNext(), 在该函数中发起"当前正在处理的子对象"的加载, 并将游标指向下一个对象.
5、添加一个用于直接载入的函数 void loadDirectly(), 该函数使用 基于 while( loadNext()) 的结构来实现自己.
6、在创建母对象的接口上添加一个 bool manualLoad 变量,用于确定是否使用步进加载,或使用原有的直接加载方式.

 

范例:(注意下面的 + expand / sourceview / plaincopy to clipboard / print / ?)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值