useFrame 和 zustand 是否与 useState 冲突?

如何解决useFrame 和 zustand 是否与 useState 冲突?

我从认情况下每 2 秒采样一次从 websocket 中检索的数据。 我使用 zustand 传播这些数据进行状态管理。 我有多个依赖于此数据的动画/组件。 为了补偿 2 秒的间隔差距,我计算了每帧的数据可能不是由 zustand 处理,而是由 useState 处理。

我可以使用 CustomEvent 来每帧更新所有依赖组件,或者我可以使用我更喜欢的自定义钩子。

问题是每当 api > zustand > useStore 更新 hook 的本地状态(样本)时,useFrame 就会丢失本地状态。

这是钩子...

/**
 * merge two streams of similar data
 * one stream comes from api and has a default sample-rate of about 2 seconds
 * the second stream updates every frame change,roughly 60 frames / second
 */
export default () => {
  const { dc,status,metrics } = useStore((state) => state.api);
  const [sample,setSample] = useState(metrics.slice(-1)[0]);
  const advanceSample = (duration,sample) => {
    if (status === 'open') {
      const radiansPerSecond = (sample.rpm / 60) * 2 * Math.PI;
      const radiansPerFrame = radiansPerSecond * duration;
      const r = (sample.r + radiansPerFrame) % (2 * Math.PI);
      const active = degreesToActive[r * (180 / Math.PI)];
      return {
        ms: Date.Now(),r,rpm: sample.rpm,c1: { mA: mA(active,dc),t: t(active,dc) },c2: { mA: mA(active,c3: { mA: mA(active,c4: { mA: mA(active,c5: { mA: mA(active,c6: { mA: mA(active,};
    }
    return sample;
  };
  useFrame(({ clock },delta) => setSample(advanceSample(delta,sample)));

  // const sampleEvent = new CustomEvent('sample',{ detail: { sample } });
  // document.dispatchEvent(sampleEvent);
  return sample;
};

快速回答是否定的,在这种情况下,useFrame、zustand 和 React.useState 都没有冲突

我的解决方案是通过 zustand 在每一帧上更新托管状态,并通过状态管理器传播状态,如下所示...... 存储方法

// increment state
next: (duration) => {
  const { dc,metrics } = get().api;
  const [sample] = metrics.slice(-1);
  const ms = Date.Now();
  if (get().api.status === 'open') {
    const radiansPerSecond = (sample.rpm / 60) * 2 * Math.PI;
    const radiansPerFrame = radiansPerSecond * duration;
    const r = (sample.r + radiansPerFrame) % (2 * Math.PI);
    const active = activeCoilIndex[r * (180 / Math.PI)];
    set({
      api: {
        ...get().api,metrics: [
          ...get().api.metrics,{
            ms,...range(1,6).reduce((accumulator,coil,index) => ({ ...accumulator,[`c${coil}`]: { mA: mA(active,dc) } }),{}),},].slice(-512),});
  }

然后在一个单独的组件中:

// increment state at generally 60fps
const nextSample = useStore((state) => state.api.next);
useFrame(({ clock },delta) => nextSample(delta));

最后传播:

// use current state within each component as follows
const unsubscribe = useStore.subscribe(
  (metrics) => {
    const [sample] = metrics.slice(-1);
    if (crankshaftRef.current) crankshaftRef.current.rotation.z = sample.r;

    const sqrRodLength = Math.pow(rodLength,2);
    const sqrCrankRadius = Math.pow(crankRadius,2);
    const calcMotion = (offsetRotation) => {
      const radians = sample.r + offsetRotation;
      const cosR = Math.cos(radians);
      const sinR = Math.sin(radians);
      const displacement = crankRadius * cosR + Math.sqrt(sqrRodLength - sqrCrankRadius * Math.pow(sinR,2));
      const moment = Math.asin(crankRadius / (rodLength / sinR)) * -1;
      return [displacement,moment];
    };

    if (conrod1Ref.current && plunger1Ref.current) {
      const [displacement,moment] = calcMotion(pistonsModels['piston1'].offsetRotation);
      conrod1Ref.current.position.x = displacement;
      conrod1Ref.current.rotation.z = moment;
      plunger1Ref.current.position.x = displacement;
    }
    ...
  },(state) => state.api.metrics
);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?