2

Android SDL 2.0 を試していますが、解決できない問題に遭遇しました。私の問題は、アプリケーションの背景として 1080*1920 の画像を作成しようとしていることです。フォトショップで作成しているのですが、スマホでアプリを起動しようとすると画質がかなり悪くなります。

以下に例を示します。写真ではどれくらい悪いかわかりませんが、私の電話の画面を見ると、もっと悪いです。

私の電話の写真

私が使用しているコード:

int main(int argc, char *argv[])
{
  int w, h;
  KEP kep;
  SDL_Window *window;
  SDL_Renderer *renderer;
  SDL_Surface *surface;
  SDL_CreateWindowAndRenderer(0, 0, 0, &window, &renderer);
  SDL_GetWindowSize(window, &w, &h);


  surface = IMG_Load("hatter.png");
  kep.w = w;
  kep.h = h;
  kep.texture=SDL_CreateTextureFromSurface(renderer, surface);
  SDL_FreeSurface(surface);
  SDL_Rect destination={0, 0, kep.w, kep.h};

  SDL_RenderClear(renderer);
  SDL_RenderCopy(renderer, kep.texture, NULL, &destination);
  SDL_RenderPresent(renderer);
  return 0;
}

「kep」は、前に宣言された画像のテクスチャ、幅、および高さを持つ単なる構造です。現在 SDL_image 拡張機能を使用していますが、どちらでも機能しませんでしたSDL_LoadBMP()

品質が落ちないようにするにはどうしたらいいでしょうか?

どうもありがとう!

4

1 に答える 1

1

私は最近、これにも役立つはずの何かに同様に答えました。ここにあります:

まず、画像が「PNG」などの小さなファイル形式であることを確認してください。次に、画像をブリットするときは、背景画像に透明色を追加していないことを確認してください。これは無意味であり、多くの CPU サイクルを占有します。これは、画像読み込みのラッパーとしてずっと前に書いたコードの例です

SDL_Surface* altSDL::load_image(std::string filename)  
{
    SDL_Surface* loadedImage = NULL;

    SDL_Surface* optimizedImage = NULL;

    loadedImage = IMG_Load( filename.c_str() );

    if( loadedImage != NULL )
    {
        optimizedImage = SDL_DisplayFormat( loadedImage );        
        SDL_FreeSurface( loadedImage );
    }
    else
    {
        Failure* fail;
        fail = Failure::getInstance();
        fail->failLog(filename);
    }

    if( optimizedImage != NULL )
    {
        Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0xFF, 0, 0xFF );
        SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, colorkey );
    }

    return optimizedImage;
}

このコードでは、すべての画像をこれに渡して非常にシームレスに最適化することができますが、背景/大きな画像の場合、コードのこの最後のブロックが次の行に沿って何かに変更されていることを確認する必要がありますこのようなもの:

//Added some Sudo code

    if( loadedImage != NULL && !isBigImage)
            {
                optimizedImage = SDL_DisplayFormat( loadedImage );        
                SDL_FreeSurface( loadedImage );
            }
            else if(!isBigImage)
            {
                Failure* fail;
                fail = Failure::getInstance();
                fail->failLog(filename);
            }

isBigImage は、追加した sudo コードであり、渡されたパラメーターです。これにより、すべての画像が最適化され、小さくなり(pngファイルであることを確認する必要があります)、透明度が小さな画像ファイルにのみ追加されるようになり、背景がfpsを解決しません

于 2015-07-29T20:57:23.147 に答える