実現したいこと
画面いっぱいに、二枚、画像を重ねて描画し、
フロントの画像の透明度を時間経過で上げて、二枚目の
画像を表示させて行きます。
前提
上記の処理が想像以上に遅く、1秒で非透明から半透明→透明に
かわるはずなのに、1分ぐらいかかっています。
どうすれば速くなりますか?
該当のソースコード
C++
1 2int TimeCounter;//カウンター用 3HBITMAP BitmapBack;//バックバッファ用 4HDC BitmapDC; 5 6HBITMAP hbmpOld; 7 8int APIENTRY wWinMain(_In_ HINSTANCE hInstance, 9 _In_opt_ HINSTANCE hPrevInstance, 10 _In_ LPWSTR lpCmdLine, 11 _In_ int nCmdShow) 12{ 13 14 UNREFERENCED_PARAMETER(hPrevInstance); 15 UNREFERENCED_PARAMETER(lpCmdLine); 16 17 // TODO: ここにコードを挿入してください。 18 ret=CoInitialize(NULL); 19 20 if (FAILED(ret)) { 21 return FALSE; 22 } 23 24 25 26 GdiplusStartupInput gdiplusStartupInput; 27 ULONG_PTR gdiplusToken; 28 29 if (Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL) != Gdiplus::Ok) {//Gdiplus開始 30 return false; 31 } 32 Stanby = false; 33 34 // グローバル文字列を初期化する 35 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 36 LoadStringW(hInstance, IDC_NOTCROSS, szWindowClass, MAX_LOADSTRING); 37 MyRegisterClass(hInstance); 38 39 40 TimeCounter = 0;//タイマーのリセット 41 SetTimer(hWnd, 1, 1, NULL);//タイマースタート 42 BitmapBack=NULL;//バックバッファ作成前 43 44 // アプリケーション初期化の実行: 45 if (!InitInstance (hInstance, nCmdShow)) 46 { 47 return FALSE; 48 } 49 50 HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_NOTCROSS)); 51 52 MSG msg; 53 54 // メイン メッセージ ループ: 55 while (GetMessage(&msg, nullptr, 0, 0)) 56 { 57 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 58 { 59 TranslateMessage(&msg); 60 DispatchMessage(&msg); 61 } 62 } 63 64 Gdiplus::GdiplusShutdown(gdiplusToken); 65 SelectObject(BitmapDC, hbmpOld); 66 67 return (int) msg.wParam; 68} 69 70LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 71{ 72 bool Destroy = false; 73 74 switch (message) 75 { 76 case WM_CREATE: { }break; 77 case WM_TIMER: 78 { 79 TimeCounter++;//時間経過 80 InvalidateRect(hWnd, NULL, TRUE);//再描画 81 } 82 break; 83 case WM_ERASEBKGND://背景の描画を処理したことにする。 84 return TRUE; 85 case WM_PAINT: 86 { 87 PAINTSTRUCT ps; 88 HDC hdc = BeginPaint(hWnd, &ps); 89 90 // TODO: HDC を使用する描画コードをここに追加してください... 91 if (BitmapBack == NULL) {//バックバッファ作成前 92 BitmapBack = CreateCompatibleBitmap(hdc, 1920, 1080);//バックバッファ作成 93 BitmapDC = CreateCompatibleDC(hdc); 94hbmpOld=(HBITMAP)SelectObject(BitmapDC, BitmapBack); 95ReleaseDC(hWnd, hdc); 96} 97 98 if (BitmapBack != NULL)//バックバッファ作成済み 99{ 100 Gdiplus::Graphics* g = new Gdiplus::Graphics(BitmapDC); 101 //バックバッファに、透明にならない裏側の絵を描画 102 g->DrawImage(BackPicImage, 0, 0, 1920, 1080); 103 104 //半透明処理 105 ImageAttributes attr; 106 ColorMatrix cmat = { 107 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // Red 108 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, // Green 109 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // Blue 110 0.0f, 0.0f, 0.0f, (1.0f - (0.001f * TimeCounter)), 0.0f, // Alpha (70%) 111 0.0f, 0.0f, 0.0f, 0.0f, 1.0f // must be 1 112 }; 113 attr.SetColorMatrix(&cmat); 114 115 //バックバッファに、半透明なフロントの描画 116 g->DrawImage(FrontPicImage, Gdiplus::Rect(0, 0, 1920, 1080), 0, 0, 1920, 1080, UnitPixel, &attr, NULL, NULL); 117 118 //バックバッファを本描画 119 BitBlt(hdc, 0, 0, 1920, 1080, BitmapDC, 0, 0, SRCCOPY); 120 121 122 delete g; 123 124} 125 EndPaint(hWnd, &ps); 126 break; 127} 128 case WM_KEYDOWN: 129{ 130 switch (wParam) 131 { 132 case VK_ESCAPE://ESCキーでアプリ終了 133 PostQuitMessage(0); 134 } 135} 136 137} 138} 139 140
試したこと
CPUの交換を考えていますが、根本解決にはならないとも思っています。
Gdiplusのプリミティブ図形描画や、今後png素材の利用を考えており、できるだけgdiplusを使いたいです。
補足情報(FW/ツールのバージョンなど)
Microsoft Visual Studio Community 2022 (64 ビット) - Current
Version 17.7.5
デスクトップアプリケーションをひな形にしています。
プロセッサ Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz 3.00 GHz
実装RAM 16GB
お忙しいところ恐縮ですが、宜しくお願い致します。

回答1件
あなたの回答
tips
プレビュー