228: PC上でUSE_SDL_RENDERERを有効にした際の問題


最新状況

タイトル PC上でUSE_SDL_RENDERERを有効にした際の問題
状態 完了
カテゴリ バグ
作成日時 2012-01-14 04:47:19
最終更新日時 2012-02-05 13:19:26

履歴

1 | 2012-01-14 04:47:19 | 提案
tmkk at smoug.net
Mac OS X上でUSE_SDL_RENDERERを有効にしてしてコンパイルした際に気づいた点を報告し
ます。

SDL側のコードを確認したところ、OpenGL ESレンダラが受け取るテクスチャフォーマット
はABGRですが、PC向けに使われるOpenGLやDirect3DレンダラはARGBなテクスチャを受け取
るので、これに起因した問題が発生するようです。具体的にはaccumulation_surfaceを使
う描画でRとBが反転する、SDL_CreateTextureFromSurfaceでのABGR->ARGB変換に時間が
かかるためにblt命令が非常に遅くなる等の問題があります。

ということで、単純にUSE_SDL_RENDERERの有無でARGBとABGRを切り替えるわけにはいかな
いようです。とはいえ、当面はAndroidやiOS向けのモードでしょうから、取り急ぎ報告ま
でということで、気が向いた時にでも対処していただければと思います。

なお、現在のレンダラのネイティブなテクスチャフォーマットはSDL_RendererInfo構造体
のtexture_formatsという配列から得られるようなので、これを使えば動的にコードを切り
替えることも可能ではあるようです。

2 | 2012-01-14 05:36:37 | 提案
tmkk at smoug.net
もう一点、bltの速度に関してです。

ONScripter::loadImageで画像からsurfaceを作る際に、元画像がalphaを持っておらず、
RGBの並びが内部表現と一致している場合、画像から直接得られたalphaを持たない(XBGR 
or XRGBな)surfaceが生成されると思います。

blt実行時にこのsurfaceからテクスチャを生成する場合、
SDL_CreateTextureFromSurfaceでXBGR->ABGR (XRGB->ARGB) の変換が行われるた
め、alpha付きのsurfaceから生成する場合と比べて低速になります。手元の環境での比較
では、20%程度の速度低下がありました。

よって、画像から直接得られたsurfaceを使う条件に
(tmp->format->Amask == image_surface->format->Amask)
を加えて元画像にalphaが無い場合でもalpha付きのsurfaceを生成したほうが、若干パフォ
ーマンスが向上するかと思います。

3 | 2012-02-04 22:49:50 | 修正済
ogapee at aqua.dti2.ne.jp
ご報告ありがとうございます。

USE_SDL_RENDERER 定義時の画像フォーマットについては、ご指摘のとおり 
SDL_RendererInfo 構造体の texture_formats[0] を見て切り替えるように変更しました。


また、ONScripter::loadImage() の件についても、ご指摘のとおり修正しました。

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

4 | 2012-02-05 13:17:07 | 修正済
tmkk at smoug.net
対応ありがとうございます。修正を確認しました。

5 | 2012-02-05 13:19:26 | 完了
ogapee at aqua.dti2.ne.jp
ご確認ありがとうございます。

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

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