SDL_ConvertSurfaceについて注意
今回テクスチャの読み込みにはSDL_imageを使っている。対応しているフォーマットの画像ならばIMG_Load()一発で読み込めるという優れもの。透過色やα付きPNGにも対応。
ところで、WEB上のSDL_Imageでテクスチャを読み込むサンプルではこういうコードをよく見る。
// 読み込み SDL_Surface *image = IMG_Load ( "mudamuda.png" ); // 32ビットRGBAフォーマットに変換するための空Surfaceを作成 SDL_Surface *tmpImage = SDL_CreateRGBSurface ( SDL_SWSURFACE, 0, 0, 32, rmask, gmask, bmask, amask ); //イメージの変換 image = SDL_ConvertSurface ( image , tmpImage->format, SDL_SWSURFACE ); SDL_FreeSurface ( tmpImage );
読み込んだ画像をSDL_ConvertSurfaceで32ビットRGBAに変換しているんだけれど、変換元Surfaceとして変数imageを渡し、変換後Surfaceをそのままimageに代入してしまっている。これだと変換元Surfaceが開放されずにLeakしてしまうのでは?
それともSDL_ConvertSurface内で自動的に変換元を開放したりしてるのか?ということでSDLのソースを追って調べてみたけど、内部で変換元を解体するような処理はしていないようだった。
というわけで、SDL_ConvertSurfaceを使う場合はちゃんと変換元Surfaceを開放してあげたほうがよさそう。
SDL_Image* converted; converted = SDL_ConvertSurface ( image, tmpImage->format, SDL_SWSURFACE ); if( converted != NULL ) { SDL_FreeSurface(image); image= converted; }
いい加減なこと書いてたらごめんなさい。