Я использую 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
напрямую, как это, не является лучшей практикой. Это приводит к тому, что вычисленное значение будет пересчитано. Это не кешируется. Это вредно для моего игрового движка, так как я могу получать доступ к этим вычисленным значениям с высокой скоростью, например, 60 кадров в секунду.
Это кажется мне не слишком понятным, поскольку вы определяете вычисленные значения с помощью помощника 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
можно по-прежнему быстро обращаться, но он не пересчитывается каждый раз. Есть ли лучший образец для этого? Кажется излишним иметь автозапуск для каждого вычисленного. некоторые из моих классов имеют много обработчиков автозапуска для кэширования этих значений.