時間拉回到兩天前, D25 - MMORPG事件處理問題 壅塞控制篇 的結論是
如果要解決壅塞問題,我們可以每一段時間把事件蒐集起來集中處理
基於昨天的RxJS程式,我們再插入一個 bufferTime
函式
rx.merge(觀察刀賊移動, 觀察刀賊動作)
.pipe(rx.bufferTime(3000))
// 把三秒內的事件打包成陣列,如果三秒內沒有事件發生,則會回傳空陣列
.subscribe((events) => {
for (let e of events) {
map.on(e);
}
console.clear();
console.log(visualize(map));
});
執行程式後就能看到狀態跳轉變成每三秒一次囉~
最後再補充一個之前沒有做好的部分,本來觀察刀賊動作
可能會回傳undefined
const 觀察刀賊動作 = rx
.timer(2500, tick)
.pipe(rx.take(15))
.pipe(
rx.map((_, i) => (i == 10 ? 刀賊迴旋斬 : i == 11 ? 刀賊撿取 : undefined))
)
// type signature :
// const 觀察刀賊動作: rx.Observable<AttackEvent | PickEvent | undefined>
這會導致後面還有新增 if 判斷把 undefined 的情況排除
rx.merge(觀察刀賊移動, 觀察刀賊動作).subscribe((event) => {
if (event) {
map.on(event);
console.clear();
console.log(visualize(map));
}
});
但我們如果提早用 filter 把 undefined 排除掉
const 觀察刀賊動作 = rx
.timer(2500, tick)
.pipe(rx.take(15))
.pipe(
rx.map((_, i) => (i == 10 ? 刀賊迴旋斬 : i == 11 ? 刀賊撿取 : undefined))
)
.pipe(rx.filter((event) => event !== undefined));
後面就可以不用擔心 event 可能為空的情形了
rx.merge(觀察刀賊移動, 觀察刀賊動作).subscribe((event) => {
map.on(event);
console.clear();
console.log(visualize(map));
});
今天下班想說小睡一下,結果睡過頭了 ...
但即使沒有獎牌也不能放棄! 沒有每天準時發文,至少要在30天內把30篇寫完!