2011-08-29 39 views
5

Tôi muốn vẽ đồ thị dữ liệu thời gian thực từ thiết bị bluetooth. Tôi có một thiết bị Bluetooth mà điện thoại sẽ kết nối và đọc dữ liệu từ nó. Dữ liệu là mức điện áp từ một số cảm biến và có tốc độ lấy mẫu 300 mẫu mỗi giây. Hầu hết các lib âm mưu (như aiChart, Androidplot, achartengine, ...) tôi đã thấy không thể xử lý lượng dữ liệu đó và vẽ lại đồ thị. Vì vậy, tôi đã xem xét OpenGL và NDK của Android và có vẻ như tôi có thể vẽ đồ thị bằng cách sử dụng một trong hai loại này với tỷ lệ mẫu mà tôi có. Có ai có một mã mẫu cho đồ thị dòng OpenGL âm mưu trong mẫu mã Android/Java và/hoặc NDK?Vẽ biểu đồ động với openGL trong Android

Trả lời

3

Chúng tôi đã làm một cái gì đó như thế này chỉ đơn giản bằng cách tạo ra một lớp mảng điểm với một số trang và vẽ trong opengl với bù đắp để điểm hiện tại luôn ở cùng một vị trí.

Ý tưởng sử dụng mảng kích thước cố định với bộ đếm riêng biệt để bạn không gặp phải vấn đề cấp phát bộ nhớ, điều này sẽ khiến cho gc khởi động. Khi trang đầy, hãy chuyển sang trang tiếp theo hiển thị thông tin cũ. Ý tưởng là nếu bạn có 5 trang, bạn có thể viết cho một trang, hiển thị 3 và hàng loạt ghi phần cuối cùng vào sqlite trên một sdcard trong một chuỗi riêng biệt để bạn có thể kéo tất cả dữ liệu ra sau này.

Chừng nào bạn chỉ có một thread bằng văn bản cho mảng, bạn có thể nhận được ngay với một cái gì đó giống như

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  
} 

của nó rất nhanh và nên làm những gì bạn cần. Sau đó, bạn có thể xuất dưới dạng một điểm trên canvas hoặc vẽ trong thanh công cụ

Hy vọng điều đó sẽ hữu ích.

+0

Ý tưởng của bạn có ý nghĩa về viết để nói 5 trang dữ liệu ... trên thực tế, trang cuối cùng có thể được ném vào một tiến trình/chuỗi bên để thực hiện việc ghi vào SD. Mặc dù phương pháp mã của bạn tôi sẽ không đi với điều đó có vẻ quá chậm. Vì dữ liệu có thể có kích thước và tốc độ thay đổi và đẩy một mảng cho biết khi bạn có 10 điểm dữ liệu mới và lập chỉ mục lại sẽ là quá chậm. Do đó, tại sao tôi sử dụng LinkedLists nếu đây là mã Java mà chúng ta đang nói đến. – JPM

+0

Một câu hỏi trong mã OpenGL của bạn mà bạn đã viết trong Android/Java hoặc trong C/NDK? – JPM

+0

Hi JPM Lý do tôi đi với mảng tĩnh là tránh gc vì đó là cổ chai chính của tôi. Tôi đã tìm thấy từ kinh nghiệm cá nhân rằng các lớp năng động tạo ra hàng nghìn đối tượng và sẽ giết bất kỳ cơ hội nào để giữ cho dữ liệu nhanh chóng trôi chảy. Sử dụng một mảng tĩnh với một chỉ mục để kết thúc có nghĩa là một hoạt động duy nhất của nó để thiết lập lại nó (bằng cách thiết lập kết thúc đến -1) và dữ liệu được ghi đè lên như được thêm vào. Có một vở kịch với DDMS và bạn có thể theo dõi nơi bạn đang tạo ra các đối tượng. Tôi đã viết tất cả mọi thứ trong Android Java và nó đã đủ nhanh một khi tôi gỡ bỏ GC. – Kactus

Các vấn đề liên quan