Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум разработчиков электроники ELECTRONIX.ru _ Программирование _ Быстрое отображение динамических данных

Автор: Кнкн May 29 2017, 12:15

Посоветуйте, пожалуйста, на какой основе сделать быстрое графическое отображение
динамических данных в Windows? (1000 линий 30 fps)
(Direct2d , DirectX, OpenGL или что-то еще ?)

Автор: V_G May 29 2017, 14:13

Какие данные?
30 fps - это видео/кино.
Если речь о 2- и 3-мерных графиках, то если они будут дергаться со скоростью 30 fps, глазам будет некомфортно.
А вообще я делал спектроанализатор в WPF на С#, скорости хватало. Точнее, графика - в WPF, остальное (работа со звуковой картой, БПФ) - просто на Си. Еще точнее, БПФ - открытый пакет fftw.org, звуковуха из winAPI

Автор: _pv May 29 2017, 15:12

fltk 100000 рандомных линий отрисовывает примерно 480мс.
opengl даже через glbegin/end на каждую линию - за почти те же 580мс успевает отрисовать миллион линий.


Код
#include "FL/Fl.h"
#include "FL/fl_draw.h"
#include "FL/Fl_Double_Window.h"
#include "FL/Fl_GL_Window.h"
#include <FL/gl.h>

#include "stdlib.h"

#pragma comment (lib, "fltk.lib")
#pragma comment (lib, "opengl32.lib")
#pragma comment (lib, "fltkgl.lib")


class MyWindow : public Fl_Double_Window {
  void draw(){
    for(int i = 0; i<100000; i++){
      fl_color(rand()*255/RAND_MAX,rand()*255/RAND_MAX,rand()*255/RAND_MAX);
      fl_line(rand()*1000/RAND_MAX,rand()*1000/RAND_MAX,rand()*1000/RAND_MAX,rand()*1000/RAND_MAX);
    }
  }
public:
  MyWindow(int X, int Y, int W, int H, const char *L) : Fl_Double_Window(X, Y, W, H, L) {}
};

class MyGLWindow : public Fl_Gl_Window {
  void draw(){
    if (!valid()) {
      glLoadIdentity();
      glViewport(0,0,w(),h());
      glOrtho(-w(),w(),-h(),h(),-1,1);
    }
    glClear(GL_COLOR_BUFFER_BIT);
    for(int i = 0; i<1000000; i++){
      glColor3f(1.0f*rand()/RAND_MAX, 1.0f*rand()/RAND_MAX, 1.0f*rand()/RAND_MAX);
      glBegin(GL_LINE_STRIP);
      glVertex2f(w()*(2.0f*rand()/RAND_MAX-1), h()*(2.0f*rand()/RAND_MAX-1));
      glVertex2f(w()*(2.0f*rand()/RAND_MAX-1), h()*(2.0f*rand()/RAND_MAX-1));
      glEnd();
    }
  }
public:
  MyGLWindow(int X, int Y, int W, int H, const char *L) : Fl_Gl_Window(X, Y, W, H, L) {}
};


void callback(void * w) {
  static int t0 = GetTickCount();
  int t1 = GetTickCount();
  printf("%d\n",t1-t0);
  t0 = t1;
  ((MyGLWindow *)w)->redraw();
  Fl::repeat_timeout(1.0/50, callback, w);
}

int main(){
//  MyWindow win(100,100,1000,1000,"Test");
  MyGLWindow win(100,100,1000,1000,"Test");
  win.show();
  Fl::add_timeout(1.0/50, callback, &win);
  return(Fl::run());
}

Автор: Кнкн May 30 2017, 07:02

Большое спасибо!

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)