165: loadImageにおける無駄なSDL_ConvertSurfaceの除去の提案


最新状況

タイトル loadImageにおける無駄なSDL_ConvertSurfaceの除去の提案
状態 完了
カテゴリ その他
作成日時 2010-07-14 15:05:39
最終更新日時 2010-08-09 18:20:59

履歴

1 | 2010-07-14 15:05:39 | 提案
shinshin319 at yahoo.co.jp
ONScripterLabel_image.cpp内の
ONScripterLabel::loadImage()内の
以下の部分についてですが

SDL_Surface *ret = SDL_ConvertSurface(tmp, image_surface->format, 
SDL_SWSURFACE);
SDL_FreeSurface(tmp);

もし、tmpのフォーマットがimage_surfaceのフォーマットと等しい場合
無駄な変換(単なるコピーだとは思いますが)をしてしまうことになります。
それにより、一時的にメモリを消費してしまうのと
読み込み速度がコピー速度だけ遅くなってしまうと思います。

例えば、createRectangleSurface(filename);で作成したサーフェスは
image_surfaceのフォーマットで作成されています。

ですので、上記の部分でフォーマットが一致した場合は
以下のようにSDL_ConvertSurfaceを呼ばないようにしてはどうでしょうか。

SDL_Surface *ret;
if((tmp->w * tmp->format->BytesPerPixel == tmp->pitch) &&
   (tmp->format->BitsPerPixel == image_surface->format->BitsPerPixel) && 
   (tmp->format->Rmask == image_surface->format->Rmask) &&
   (tmp->format->Gmask == image_surface->format->Gmask) &&
   (tmp->format->Bmask == image_surface->format->Bmask) &&
   (tmp->format->Amask == image_surface->format->Amask)){
	ret = tmp;
} else {
	ret = SDL_ConvertSurface(tmp, image_surface->format, SDL_SWSURFACE);
	SDL_FreeSurface(tmp);
}

秋月かたね

2 | 2010-07-14 15:19:03 | 提案
shinshin319 at yahoo.co.jp
Amaskが0の場合を考えると一致しなくても
処理には問題なさそうなので訂正します。

SDL_Surface *ret;
if((tmp->w * tmp->format->BytesPerPixel == tmp->pitch) &&
   (tmp->format->BitsPerPixel == image_surface->format->BitsPerPixel) && 
   (tmp->format->Rmask == image_surface->format->Rmask) &&
   (tmp->format->Gmask == image_surface->format->Gmask) &&
   (tmp->format->Bmask == image_surface->format->Bmask)){
	ret = tmp;
} else {
	ret = SDL_ConvertSurface(tmp, image_surface->format, SDL_SWSURFACE);
	SDL_FreeSurface(tmp);
}

3 | 2010-08-09 00:28:18 | 修正済
ogapee at aqua.dti2.ne.jp
ご提案ありがとうございます。

遅くなりましたが、いただいた修正をそのまま取り入れさせていただきました。

20100808 以降で修正済みです。
ご確認ください。

4 | 2010-08-09 18:07:09 | 修正済
shinshin319 at yahoo.co.jp
これでSDL_image側を改造してONSと同じフォーマットで出力するようにして
画像の読み込み速度の高速化とメモリ節約をするバイナリを作れます。
非公式バイナリに適用する予定です。

修正ありがとうございました。

5 | 2010-08-09 18:20:59 | 完了
ogapee at aqua.dti2.ne.jp
ご確認ありがとうございます。

標準の SDL_image を使用して jpg や bmp を読み込むと ONScripter で使用するフォーマ
ットとは異なるフォーマットになるため、内心実用上はあまり効果が無いかもしれないと
思っていたのですが、SDL_image 側を改造するのであれば効果が大きそうですね。

より使い勝手のよい ONScripter を公開していただけると、私もたいへんうれしいです。


それでは、本報告は完了とさせていただきます。

[リプライをつける]
Bug Tracking System 影舞 0.8.8
Powered by Ruby 1.8.7