目标:将一个顺序载入的系统变成分步载入的系统。
动机:
也许你会说背景线程 可以达到更好的效果, 但是我想说的是在一些情况下是无法使用多线程的。
比如装载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 / ?)