2011-08-29 3 views
5

블루투스 장치에서 실시간 데이터를 플롯하려고합니다. 전화가 연결되어있는 블루투스 장치를 가지고 있고 거기에서 오는 데이터를 읽습니다. 데이터는 일부 센서의 전압 레벨이며 초당 300 샘플의 샘플 속도입니다. 대부분의 플로팅 라이브러리 (예 : aiChart, Androidplot, achartengine ...)는 데이터 양을 처리하고 그래프를 다시 칠할 수 없습니다. 그래서 저는 OpenGL과 Android NDK를 살펴 보았습니다. 그 중 하나를 가지고 샘플 속도로 그래프를 그릴 수있을 것 같습니다. 누구든지 안드로이드/자바 및/또는 NDK 코드 샘플에서 플로팅 라인 그래프 OpenGL을위한 샘플 코드가 있습니까?안드로이드에서 OpenGL을 이용한 동적 그래프 플로팅

답변

3

여러 페이지가있는 포인트 배열 클래스를 만들고 오프셋이있는 opengl을 그려서 단순히 현재 지점이 항상 같은 위치에 있도록하기 위해 이와 같이했습니다.

아이디어는 고정 된 크기의 배열을 별도의 카운터와 함께 사용하므로 gc가 발생할 메모리 할당 문제가 발생하지 않습니다. 페이지가 가득 차면 이전 페이지를 표시하는 다음 페이지로 순환하십시오. 아이디어는 5 페이지가 있으면 하나에 쓰고 다른 3은 표시하고 나머지는 sqlcard에 별도의 스레드로 작성하여 나중에 모든 데이터를 가져올 수 있다는 것입니다. 당신은 단지 배열에 하나 개의 스레드 기록을 가지고

는만큼 당신은

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에서 그릴 수 있습니다.

희망이 있습니다.

+0

당신의 생각은 5 페이지의 데이터를 말하기 위해 작성하는 것이 좋습니다 ... 사실 마지막 페이지는 사이드 프로세스/쓰레드에 던져져 SD에 쓰일 수 있습니다. 귀하의 코드 방법은 내가 그렇게 가지 않을 것이지만 너무 느리게 보인다. 데이터가 가변적 인 크기와 비율을 가질 수 있고 배열을 푸는 것은 10 개의 새로운 데이터 포인트가 있고 재 인덱싱이 너무 느릴 때라고 말합니다. 따라서 이것이 우리가 이야기하고있는 Java 코드 인 경우 LinkedLists를 사용하는 이유는 무엇입니까? – JPM

+0

OpenGL 코드에서 한 가지 질문을 Android/Java 또는 C/NDK로 작성 했습니까? – JPM

+0

안녕 JPM 내가 정적 배열로 갔다하는 이유는 그게 내 주요 병 목이었다대로 GC를 피하기위한 것입니다. 나는 개인적인 경험을 통해 동적 클래스가 수천 개의 객체를 만들고 빠른 데이터 흐름을 유지할 수있는 기회를 없앨 것이라는 사실을 발견했습니다. 끝으로 인덱스가있는 정적 배열을 사용하면 끝을 -1로 설정하여 다시 설정하기위한 단 하나의 작업을 의미하며 데이터는 추가 된 것으로 덮어 씁니다. DDMS로 게임을하고 어디에서 개체를 만들 수 있는지 추적 할 수 있습니다. Android Java에서 모든 것을 작성했으며 GC를 제거한 후에는 충분히 빨랐습니다. – Kactus

관련 문제