发信人: exaatto(根据GB3100-93,我叫艾可萨阿托), 信区: GNULinux
标 题: SDL:画的太快就不显示?
发信站: 饮水思源 (2012年01月28日01:54:53 星期六), 站内信件


调戏SDL,遇到一个莫名其妙的问题,当我直接操作SDL_Surface的像素时,似乎画的太
快就会最终什么都不显示了。。。

29行那个空循环,如果去掉,SDL窗口就是一片黑,反之就能正常显示我画的pixel。或
者改成其他什么别的费时间到东西也能正常。

不知道该从哪个方向上debug,我完全没头绪。。。

似乎不是越界之类的问题,valgrind跑下来没什么太大的异常,报了几个都不是我的问
题。

环境:
SDL-devel-1.2.14-13.fc16.i686

编译:
gcc -lSDL xxoo.c

代码:
1 #include <stdio.h>

2 #include "SDL/SDL.h"


3 #define PERROR_PREFIX "ERROR\t"
4 #define SDL_Perror( MSG, ...) fprintf( stderr, \
5 PERROR_PREFIX MSG " @" __FILE__ "+%d: %s\n", \
6 ##__VA_ARGS__, __LINE__, SDL_GetError())

7 int main( int argc, char * argv[] )
8 {
9 int ret = 0;
10 SDL_Surface *screen = NULL;
11 volatile Uint32 *pixel = NULL;
12 int x = 0, y = 0, i = 0;
13 Uint32 tmp = 0;

14 if ( (ret = SDL_Init( SDL_INIT_VIDEO)) != 0 ) {
15 SDL_Perror("Cannot init SDL");
16 }
17 if ( (screen = SDL_SetVideoMode(64, 48, 32, SDL_SWSURFACE)) == NULL ) {
18 SDL_Perror();
19 }
20 printf("bpp: %d\n", screen->format->BytesPerPixel);

21 pixel = (Uint32*) screen->pixels;
22 if ( SDL_MUSTLOCK(screen) && SDL_LockSurface(screen) < 0 ) {
23 SDL_Perror();
24 }
25 for ( y = 0, i = 0; y < screen->h; y++) {
26 for ( x = 0; x < screen->w; x++) {
27 pixel[i] = SDL_MapRGB( screen->format, x* 0xff/screen->w , y*
0xff/screen->h , 0);
28 i++;
29 for ( tmp = 0; tmp < 10000; tmp++ )
30 {
31 }
32 }
33 }
34 SDL_UpdateRect(screen, 0,0,0,0);
35 if ( SDL_MUSTLOCK(screen) ) {
36 SDL_UnlockSurface(screen);
37 }
38 puts("done");

39 getchar();
40 SDL_FreeSurface( screen);
41 SDL_Quit();
42 return 0;
43 }

--

矛盾律:
一件事物为真,或这件事物为假,二者不同成立

※ 来源:·饮水思源 bbs.sjtu.edu.cn·[FROM: 1.25.122.131]