【问题标题】:Dynamic Graph Plotting with openGL in Android在 Android 中使用 openGL 进行动态图形绘图
【发布时间】:2011-11-06 07:29:30
【问题描述】:

我想绘制来自蓝牙设备的实时数据。我有一个蓝牙设备,手机将连接到它并读取来自它的数据。数据是来自某些传感器的电压电平,采样率为每秒 300 个样本。我见过的大多数绘图库(如 aiChart、Androidplot、achartengine 等)都无法处理这么多的数据并重新绘制图表。所以我研究了 openGL 和 Android NDK,似乎我可以使用其中任何一个和我拥有的采样率来绘制图表。有没有人有在 android/Java 和/或 NDK 代码示例中绘制 openGL 线图的示例代码?

【问题讨论】:

    标签: android opengl-es graph charts android-ndk


    【解决方案1】:

    我们只是通过创建一个包含多个页面的点数组类并在 opengl 中使用偏移量进行绘制来完成类似的操作,因此当前点始终在同一个位置。

    这个想法使用固定大小的数组和一个单独的计数器,这样您就不会遇到内存分配问题,这会导致 gc 启动。一旦页面已满,循环到下一页也显示旧的。这个想法是,如果你有 5 个页面,你可以写入一个页面,显示另外 3 个页面,然后在单独的线程中将最后一个页面批量写入 sdcard 上的 sqlite,这样你以后就可以提取所有数据。

    只要你只有一个线程写入数组,你就可以摆脱类似的事情

    arrayPoint[] p;
    ....
    int currentPos = 0;
    arrayPoint current = p[currentPos];
    
    ..... 
    while(....
    
    if(current.end < current.max)
    {
          .... get datax and datay
         current.end++;
         current.x[current.end] = datax;
         current.y[current.end] = datay;
    }
    else
    {
         currentPos = getNextPos();
         current = p[currentPos];
         current.end = -1; // truncate the array without actually freeing or allocating mem
         ..... flip volatile bool to let other thread know its ok to get exclusive access to its data etc      
    }
    

    它非常快,应该可以满足您的需求。然后你可以输出为画布上的一个点或在 opengl es 中绘制

    希望对您有所帮助。

    【讨论】:

    • 关于写入 5 页数据的想法是有道理的……事实上,最后一页可以被扔到一个侧面进程/线程来写入 SD。尽管您的代码方法我不会使用,因为这似乎太慢了。由于数据可能具有可变的大小和速率,并且推送数组说当您有 10 个新数据点时,重新索引会太慢。因此,如果这是我们正在讨论的 Java 代码,我为什么要使用 LinkedLists。
    • openGL 代码中的一个问题是您用 Android/Java 还是 C/NDK 编写的?
    • 嗨,JPM 我使用静态数组的原因是为了避免 gc,因为那是我的主要瓶颈。我从个人经验中发现,动态类会产生数千个对象,这将扼杀保持快速数据流动的任何机会。使用带有索引的静态数组结束意味着它只有一个重置它的操作(通过将 end 设置为 -1)并且数据在添加时被覆盖。使用 DDMS,您可以跟踪创建对象的位置。我用 Android Java 编写了所有东西,一旦我删除了 GC,它就足够快了。
    • 我应该提一下,您的设备处理 opengl 的能力因设备而异,但您可以通过减少重复调用来优化。例如,每帧一组启用,然后您的所有翻译和 DrawElements 以及最后一组禁用。不要绑定超过你需要的。如果您最好为每个数据集绘制点或为页面重新创建顶点缓冲区,则需要测试您的数据,但在我的情况下,我使用了单点进行平移。再次将 DDMS 与方法分析一起使用,看看您可以在哪里获得收益。
    • 我不知道你在说什么,因为我是 openGL 的新手,但我相信你。只是想弄清楚用动态线图绘制实时数据的最佳方法是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2017-04-14
    • 2013-02-10
    相关资源
    最近更新 更多