LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1681|回复: 1

SDL里使用cairo画图的例子

[复制链接]
发表于 2009-11-6 18:04:03 | 显示全部楼层 |阅读模式
编译使用,假设源码文件名称为sdlcairo.c。
gcc -g sdlcairo.c -o sdlcairo `pkg-config --cflags --libs cairo sdl`
在windows xp sp3平台用mingw编译测试通过。

  1. #include <SDL/SDL.h>
  2. #include <cairo/cairo.h>

  3. const int WIDTH = 768, HEIGHT = 576;

  4. int main(int argc, char** argv)
  5. {
  6.        
  7.         atexit(SDL_Quit);
  8.         if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
  9.                 return -1;
  10.         SDL_Surface *screen = SDL_SetVideoMode( WIDTH, HEIGHT, 0,
  11.                 SDL_HWSURFACE | SDL_DOUBLEBUF);
  12.        
  13.         unsigned char data[WIDTH*HEIGHT*4];
  14.         SDL_Surface *sdl_surface = SDL_CreateRGBSurfaceFrom(&data[0],
  15.                 WIDTH, HEIGHT, 32, WIDTH*4, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000);
  16.        
  17.         cairo_surface_t *surface = cairo_image_surface_create_for_data(
  18.                 &data[0], CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT, screen->pitch);
  19.         cairo_t *cr = cairo_create( surface);
  20.         cairo_set_antialias(cr, CAIRO_ANTIALIAS_GRAY);

  21.         int running = 1;

  22.         while (running) {
  23.                 SDL_Event event;
  24.                 while( SDL_PollEvent( &event)) {
  25.                         if( SDL_QUIT == event.type)
  26.                         {
  27.                                 running = 0;
  28.                         }
  29.                         else if( SDL_VIDEOEXPOSE == event.type)
  30.                         {
  31.                                 cairo_set_source_rgba(cr, 0, 0, 0, 1);
  32.                                 cairo_paint(cr);
  33.                                 cairo_set_source_rgba(cr, 1, 0, 0, 1);
  34.                                 cairo_arc (cr, WIDTH/2, HEIGHT/2, 76.8, 0, 2 * 3.1416926);
  35.                                 cairo_fill (cr);
  36.                                 SDL_BlitSurface( sdl_surface, NULL, screen, NULL);
  37.                         }
  38.                 }

  39.                 SDL_Flip(screen);

  40.         }
  41.         cairo_destroy( cr);
  42.         cairo_surface_destroy( surface);
  43.         SDL_FreeSurface(sdl_surface);

  44.         return 0;
  45. }

复制代码


我发现程序运行时占用的内核时间相当的多,我的机器是windows xp sp3,intel双核U,集成G31显卡。
发表于 2009-11-11 17:04:49 | 显示全部楼层
那是因为绘制函数是一个死循环,一直在不停的绘制,实际编写游戏的时候,总是会用一个
帧时间补正函数去sleep一会儿的,保持帧数在一定范围内即可。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表