0

我想知道以非常高的频率(每 15 毫秒新值)绘制具有流数据的实时折线图的最高效方法是什么。我通过 BLE 获取数据,并添加到我永远不会超过 500 个项目的数组中。我需要从这些数据中获得大约 10 个不同的折线图。

整个情况如下:*每15ms的数据流*我将它保存在redux存储中array[500](当有新元素时删除第一个元素并且array.length >= 500 *必须将数据显示为10个独立的折线图

我正在使用react-native-svg-charts,按预期工作,但是当有 500 个点并且第一个点正在改变(因为我正在删除它)时,图表会重新渲染本身并且整个视图变得滞后(~20fps)。

我想知道在这个场景中使用setNativeProps(on <Path />from react-native-svg) 会有所帮助,但我不确定它是否是最高效的方式。如果您有更好的想法和建议(例如使用react-native-art),请告诉我,我需要在此视图中拥有 ~60fps。

最好的

4

1 回答 1

0

我最近在这里回答了一个类似的问题:React Native 中的实时数据更新图表,并会在这里提出相同的建议。

在使用我尝试过的所有基于 SVG 的库(包括react-native-svg-charts. 我不确定您可以做很多事情来实现您正在寻找的基于 SVG 的图表的性能。

我最近决定尝试在 a 中使用几个基于画布的绘图库WebView,结果非常好。我最终制作了一个简单的包:https ://www.npmjs.com/package/@dpwiese/react-native-canvas-charts 。

如果你不想使用这个包,而是自己做,这很简单。虽然包源代码可能是最好的资源,但我将总结以下步骤:

  1. 创建一个 HTML 文件并将其导入到您的组件中:
    const htmlTemplate = require("./index.html");
    
    其中 HTML 包含所选图表库的 JavaScript。上面的链接包目前支持Chart.js v3 和uPlot。在下面的步骤中,我将展示一个 Chart.js 配置。
  2. 创建一个 ref,例如let webref.
  3. 创建一个WebViewonLoadEnd您可以将一些 JavaScript 注入WebView将配置和创建图表的
    <WebView
      originWhitelist={["*"]}
      ref={r  => (webref = r)}
      source={htmlTemplate}
      onLoadEnd={() => { addChart(config) }}
    />
    
    addChart看起来像 :
    const addChart = config => {
      webref.injectJavaScript(`const el = document.createElement("canvas");
        document.body.appendChild(el);
        window.canvasLine = new Chart(el.getContext('2d'), ${JSON.stringify(config)});`);
    };
    
    并且config是有效的 Chart.js 配置。
  4. 要更新图表数据,只需注入一些 JavaScript 来更新数据。对于这里的 Chart.js,看起来像:
    const setData = dataSets => {
      if (dataSets) {
        dataSets.forEach((_, i) => {
          webref.injectJavaScript(`window.canvasLine.config.data.datasets[${i}].data = ${JSON.stringify(dataSets[i])};
          window.canvasLine.update();`);
        });
      }
    };
    
    dataSets有效的 Chart.js 数据集 在哪里。
  5. 而已!我只通过https://www.npmjs.com/package/@dpwiese/react-native-canvas-charts包玩过这两个绘图库,但到目前为止性能非常好,即使使用 JSON所有传递的图表数据的字符串化。我还没有彻底量化它,但是这两个库的性能都比我尝试过的任何基于 SVG 的库都高出几个数量级。
于 2021-02-21T15:29:35.207 回答