关于react+mobx性能优化手段整理

前些日子在优化点云标注相关的模板代码,期望达到600帧10W个对象的流畅运行。前前后后整理了一些mobx需要注意的优化性能的点:

  1. observable 默认会是deep模式,尽量用observable.ref或者observable.shallow来减少内存占用
  2. 在帧循环或者setTimeout或者鼠标、键盘事件里面读取mobx的computed值,接口请求回调或者promise返回,都会导致mobx脱离上下文,从而对所有可能产生影响的computed进行重算,需要改成computed({ keepAlive: true }),有些computed的返回值是一个新数组或者新对象的话,可以考虑添加struct: true来避免react重新渲染
  3. 如果在action或者runInAction方法里,执行其他的action装饰的方法,还是会产生多次更新的问题,可以考虑用transaction方法包裹
@action
updateAll() {
  transaction(() => {  // 强制整个块在一个事务中
    this.value1 = 1;
    this.updateValue2();  // 即使这是 action,也不会立即通知
    this.value3 = 3;
  });
  // 只触发 1 次通知 ✅
}
  1. 如果有多个返回promise的函数希望执行一次更新,也可以考虑用flow函数
updateAll = flow(function* (){
  yield promise1()
  yield promise2()
})

再记录一些大点云数组遍历的位运算优化:
~~(number + 0.5)的性能比Math.round要好很多
imageData的里面的*4的一些运算可以改成 <<2 来优化性能

标签: none

添加新评论