SDL2 OSX上的SDL_GetWindowSurface和/或SDL_CreateRenderer上的渲染器无效

所以我一直在玩SDL2以确定它是否符合我的需求。 我正在按照介绍性示例(主要来自lazyfoo)进行简单的测试。

#include  #include  const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480; int main(int argc, char const *argv[]) { /* The window handle */ SDL_Window* window = NULL; /* The surface contained in the window */ SDL_Surface* screen_surface = NULL; /* Init SDL */ if(SDL_Init(SDL_INIT_VIDEO) format, 0x50, 0x50, 0x50)); // /* Update the surface */ SDL_UpdateWindowSurface(window); printf("%s\n", SDL_GetError()); /* Wait n secs */ SDL_Delay(2000); } } /* Destroy the window */ SDL_DestroyWindow(window); /* Quit SDL subsystem */ SDL_Quit(); return 0; } 

在OSX 10.7.5(MBA 2011)上编译:

 gcc `sdl2-config --cflags --libs` -o sdl_test sdl_test.c 

示例很简单。 它应该初始化SDL,创建一个窗口,将一个表面附加到窗口,将颜色设置为灰色并将其渲染出来 – 两秒后它应该退出。

但是,窗口保持黑色。 没有显示灰色表面。 这就是我在延迟之前为SDL错误引入printf的原因。 它显示了我跟踪的Invalid renderer ,由screen_surface = SDL_GetWindowSurface(window);触发screen_surface = SDL_GetWindowSurface(window);

我也尝试过另一种方式

 renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE); SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); SDL_RenderClear(renderer); SDL_RenderPresent(renderer); 

而不是SDL_Surface方式..但同样的事情发生在SDL_CreateRenderer抛出Invalid renderer 。 正如你所看到的,我用_SOFTWARE和_ACCELERATED标志尝试了它 – 同样的事情。

现在,这是“有趣”的部分。 在第一个代码中,用SDL_Surface方式我调用了SDL_UpdateWindowSurface(window); 两次 – 一个接一个。 灰色显示! 但是,仍然会抛出Invalid renderer ,但代码可以正常工作。 为什么要调用SDL_UpdateWindowSurface(window); 两次,一个接一个,工作,一旦它不会? 如果抛出Invalid renderer它为什么会起作用? 我很困惑。

  • OSX: 10.7.5
  • 编译器: i686-apple-darwin11-llvm-gcc-4.2(GCC)4.2.1(基于Apple Inc. build 5658)(LLVM build 2336.11.00)
  • SDL2: 2.0.3(通过自制软件安装)

我也尝试通过手动输入include path和libs来调用没有sdl2-config的gcc。