Перейти к содержанию
    

Быстрое отображение динамических данных

Посоветуйте, пожалуйста, на какой основе сделать быстрое графическое отображение

динамических данных в Windows? (1000 линий 30 fps)

(Direct2d , DirectX, OpenGL или что-то еще ?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какие данные?

30 fps - это видео/кино.

Если речь о 2- и 3-мерных графиках, то если они будут дергаться со скоростью 30 fps, глазам будет некомфортно.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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());
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...