【发布时间】:2020-04-09 20:17:17
【问题描述】:
我正在使用 Mobx 构建一个 webgl 游戏引擎。我没有将它与反应一起使用。我正在使用它来增强实体组件系统。我有像
这样的实体类import {observable, observe, computed, autorun} from 'mobx';
class Entity {
@observable position = [0,0,0]
@observable rotation = [0,0,0]
@computed get modelMat(){
return position * rotation;
}
}
我像这样使用这个实体:
var ent = new Entity();
entity.position = [0,10,0];
if(entity.modelMat == 6){
// do something
}
我的理解是,像这样直接阅读modelMat 并不是最佳做法。它会导致重新计算计算。它没有被缓存。这对我的游戏引擎是有害的,因为我可能会以 60fps 这样的高速访问这些计算值。
这对我来说似乎不直观,因为您使用 get 帮助器定义了计算,然后不应该将其用作吸气剂?调试computedRequiresReaction 设置可用于防止这种直接计算读取模式。
configure({
computedRequiresReaction: true
});
然后我的问题是如何缓存或记忆这些将频繁访问的计算值?为了避免这种情况,我开始使用一种使用自动运行的模式,以便在计算发生变化时更新局部变量。它看起来像:
class Entity {
@observable position = [0,0,0]
@observable rotation = [0,0,0]
modelMat = []
constructor(){
autorun(() => {
this.modelMat = this.computedModelMat()
})
}
@computed get computedModelMat(){
return position * rotation;
}
}
这为类启用了一个接口,以便ent.modelMat 仍然可以快速访问,但不会每次都重新计算。有没有更好的建议模式?为每个计算的自动运行似乎是多余的。我的一些类最终有许多自动运行处理程序来缓存这些值。
【问题讨论】:
标签: javascript mobx