Динамическое построение графиков с помощью openGL в Android - PullRequest
5 голосов
/ 30 августа 2011

Я хочу отображать данные в реальном времени с устройства Bluetooth.У меня есть устройство Bluetooth, к которому телефон будет подключаться и считывать поступающие с него данные.Данные представляют собой уровни напряжения от некоторых датчиков и имеют частоту дискретизации 300 выборок в секунду.Большинство созданных графических библиотек (таких как aiChart, Androidplot, achartengine, ...), которые я видел, не могут обрабатывать такое количество данных и перерисовывать график.Итак, я посмотрел на openGL и Android NDK, и мне кажется, что я мог бы построить график, используя любой из них с частотой дискретизации, которая у меня есть.У кого-нибудь есть пример кода для построения линейного графика openGL в образце кода Android / Java и / или NDK?

1 Ответ

3 голосов
/ 30 августа 2011

Мы сделали что-то подобное, просто создав класс массива точек с несколькими страницами и нарисовав в opengl со смещением, чтобы текущая точка всегда была в одном и том же месте.

Идея состоит в использовании массивов фиксированного размера с отдельнымсчетчик, так что вы не сталкиваетесь с проблемами выделения памяти, которые могут привести к срабатыванию gc. Как только страница заполнится, перейдите к следующей странице, отображающей также старую страницу.Идея состоит в том, что если у вас есть 5 страниц, вы можете написать на одну, отобразить остальные 3 и пакетно записать последнюю на sqlite на SD-карте в отдельном потоке, чтобы вы могли извлечь все данные позже.

Пока у вас есть только один поток, записывающий в массив, вы можете получить что-то вроде

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

Надеюсь, это поможет.

...