程式語言 - Simple DirectMedia Layer (SDL) - v1.2 - SDL_Flip()、SDL_UpdateRect()



區別如下:

SDL_Flip()假如有設定SDL_DOUBLEBUF時,會直接呼叫Framebuffer Driver的fb_pan_display(),藉此快速刷屏,假如沒有設定,則執行SDL_UpdateRect()
SDL_UpdateRect()一個區塊慢慢複製(透過blitFunc())

(SDL 1.2.15)src/video/SDL_video.c

1105 int SDL_Flip(SDL_Surface *screen)
...
1147   if ( (screen->flags & SDL_DOUBLEBUF) == SDL_DOUBLEBUF ) {
1148     SDL_VideoDevice *this  = current_video;
1149     return(video->FlipHWSurface(this, SDL_VideoSurface));
1150   } else {
1151     SDL_UpdateRect(screen, 0, 0, 0, 0);
1152   }
1153   return(0);
1154 }

(SDL 1.2.15)src/video/fbcon/SDL_fbvideo.c

1423 static int FB_FlipHWSurface(_THIS, SDL_Surface *surface)
1424 {
1425   if ( switched_away ) {
1426     return -2; /* no hardware access */
1427   }
1428 
1429   /* Wait for vertical retrace and then flip display */
1430   cache_vinfo.yoffset = flip_page*surface->h;
1431   if ( FB_IsSurfaceBusy(this->screen) ) {
1432     FB_WaitBusySurfaces(this);
1433   }
1434   wait_vbl(this);
1435   if ( ioctl(console_fd, FBIOPAN_DISPLAY, &cache_vinfo) < 0 ) {
1436     SDL_SetError("ioctl(FBIOPAN_DISPLAY) failed");
1437     return(-1);
1438   }
1439   flip_page = !flip_page;
1440 
1441   surface->pixels = flip_address[flip_page];
1442   return(0);
1443 }

1014 void SDL_UpdateRect(SDL_Surface *screen, Sint32 x, Sint32 y, Uint32 w, Uint32 h)
1015 { 
1016   if ( screen ) {
1017     SDL_Rect rect;
1018     
1019     /* Perform some checking */
1020     if ( w == 0 )
1021       w = screen->w;
1022     if ( h == 0 )
1023       h = screen->h;
1024     if ( (int)(x+w) > screen->w )
1025       return;
1026     if ( (int)(y+h) > screen->h )
1027       return;
1028     
1029     /* Fill the rectangle */
1030     rect.x = (Sint16)x;
1031     rect.y = (Sint16)y;
1032     rect.w = (Uint16)w;
1033     rect.h = (Uint16)h;
1034     SDL_UpdateRects(screen, 1, &rect);
1035   }
1036 }

1037 void SDL_UpdateRects (SDL_Surface *screen, int numrects, SDL_Rect *rects)
...
1097       video->UpdateRects(this, numrects, rects);
1098     }
1099   }
1100 }

1183   this->UpdateRects = FB_DirectUpdate;

1496 static void FB_DirectUpdate(_THIS, int numrects, SDL_Rect *rects)
...
1600     blitFunc((Uint8 *) src_start,
1601         shadow_right_delta,
1602         shadow_down_delta,
1603         (Uint8 *) dst_start,
1604         physlinebytes,
1605         scr_x2 - scr_x1,
1606         scr_y2 - scr_y1);
1607   }
1608 }