我是一位非常喜欢使用C进行数值计算的科学家,但是我需要一些帮助显示结果。我希望能够在一个窗口中显示一个连续更新的位图,该位图是根据实时数据计算得出的。我希望能够相当快地更新图像(例如,快于1帧/秒,最好是100 fps)。例如:
char image_buffer[width*height*3];//rgb data initializewindow(); for (t=0;t<t_end;t++) { getdata(data);//get some realtime data docalcs(image_buffer, data);//process the data into an image drawimage(image_buffer);//draw the image }
在linux(Ubuntu)上最简单的方法是什么?我应该为initializewindow()和drawimage()使用什么?
如果您只想显示数据(即不需要GUI),则可能需要看一下SDL:直接从像素数据创建表面,然后将其显示在屏幕上很简单。
受Artelius的回答启发,我还破解了一个示例程序:
#include <SDL/SDL.h> #include <assert.h> #include <stdint.h> #include <stdlib.h> #define WIDTH 256 #define HEIGHT 256 static _Bool init_app(const char * name, SDL_Surface * icon, uint32_t flags) { atexit(SDL_Quit); if(SDL_Init(flags) < 0) return 0; SDL_WM_SetCaption(name, name); SDL_WM_SetIcon(icon, NULL); return 1; } static uint8_t * init_data(uint8_t * data) { for(size_t i = WIDTH * HEIGHT * 3; i--; ) data[i] = (i % 3 == 0) ? (i / 3) % WIDTH : (i % 3 == 1) ? (i / 3) / WIDTH : 0; return data; } static _Bool process(uint8_t * data) { for(SDL_Event event; SDL_PollEvent(&event);) if(event.type == SDL_QUIT) return 0; for(size_t i = 0; i < WIDTH * HEIGHT * 3; i += 1 + rand() % 3) data[i] -= rand() % 8; return 1; } static void render(SDL_Surface * sf) { SDL_Surface * screen = SDL_GetVideoSurface(); if(SDL_BlitSurface(sf, NULL, screen, NULL) == 0) SDL_UpdateRect(screen, 0, 0, 0, 0); } static int filter(const SDL_Event * event) { return event->type == SDL_QUIT; } #define mask32(BYTE) (*(uint32_t *)(uint8_t [4]){ [BYTE] = 0xff }) int main(int argc, char * argv[]) { (void)argc, (void)argv; static uint8_t buffer[WIDTH * HEIGHT * 3]; _Bool ok = init_app("SDL example", NULL, SDL_INIT_VIDEO) && SDL_SetVideoMode(WIDTH, HEIGHT, 24, SDL_HWSURFACE); assert(ok); SDL_Surface * data_sf = SDL_CreateRGBSurfaceFrom( init_data(buffer), WIDTH, HEIGHT, 24, WIDTH * 3, mask32(0), mask32(1), mask32(2), 0); SDL_SetEventFilter(filter); for(; process(buffer); SDL_Delay(10)) render(data_sf); return 0; }