前提・実現したいこと
現在コンソールを用いたゲームを作ろうと思い、エスケープシーケンスを用いたフルカラー描画のできるエンジンの仕組みを作りました。
しかし、そのせいか描画の処理、WriteConsole関数(WindowsAPI)の処理が重く
(ゲーム環境)
[画面サイズ]240×150,
16ピクセル/ドット
で動かすと
関数処理に350~500msかかってしまい
平均フレームレートも2しか出なくなってしまっています。
画面を小さくすれば30fps出るのですが、どうにか元の環境のまま軽くすることはできないでしょうか?
(なるべくC言語で組みたいのですが、可能であればC++でもかまいません。)
発生している問題・エラーメッセージ
該当のソースコード
C
1 2#include <Windows.h> 3typedef struct 4{ 5 //出力用ハンドル 6 HANDLE m_hConsole; 7 //入力用ハンドル 8 HANDLE m_hConsoleIn; 9 10 //エラー用ハンドル 11 HANDLE m_hOriginalConsole; 12 13 //ウィンドウサイズ、位置 14 SMALL_RECT m_rectWindow; 15 16 //スクリーンバッファ(エスケープシーケンスに関しては次の資料を参考 https://en.wikipedia.org/wiki/ANSI_escape_code) 17 unsigned char* m_bufScreen; 18 19 20}ConsoleManager, *PConsoleManager; 21 22//フルカラー用の出力バッファポインタ 23static char* screen_buffer_full; 24 25=========================処理======================== 26 27 28void PrintImage(PConsoleManager const p_this) 29{ 30 //この下は出力バッファにエスケープシーケンス文字列を当てている処理です.ここは速度的にも~1ms/フレームだったので特に問題ありません。 31 32 DWORD write_num; 33 unsigned char* in_buf = p_this->m_bufScreen; 34 char *out_buf = screen_buffer_full; 35 36 for (int y = 0; y < m_nScreenHeight; y++) 37 { 38 39 for (int x = 0; x < m_nScreenWidth; x++) 40 { 41 out_buf += 7; 42 // R設定 43 *(out_buf + 0) = CharRGBconvTBL[0][*in_buf]; //0x30 + (*in_buf / 100); 44 *(out_buf + 1) = CharRGBconvTBL[1][*in_buf]; //0x30 + (*in_buf % 100 / 10); 45 *(out_buf + 2) = CharRGBconvTBL[2][*in_buf]; //0x30 + (*in_buf % 10); 46 in_buf++; 47 // G設定 48 *(out_buf + 4) = CharRGBconvTBL[0][*in_buf]; //0x30 + (*in_buf / 100); 49 *(out_buf + 5) = CharRGBconvTBL[1][*in_buf]; //0x30 + (*in_buf % 100 / 10); 50 *(out_buf + 6) = CharRGBconvTBL[2][*in_buf]; //0x30 + (*in_buf % 10); 51 in_buf++; 52 // B設定 53 *(out_buf + 8) = CharRGBconvTBL[0][*in_buf]; //0x30 + (*in_buf / 100); 54 *(out_buf + 9) = CharRGBconvTBL[1][*in_buf]; //0x30 + (*in_buf % 100 / 10); 55 *(out_buf + 10) = CharRGBconvTBL[2][*in_buf]; //0x30 + (*in_buf % 10); 56 in_buf++; 57 out_buf += 13; 58 } 59 out_buf++; 60 61 } 62 63 //ここの処理がどうしても重くなります 64 WriteConsole(p_this->m_hConsole, screen_buffer_full, m_nScreenHeight * (m_nScreenWidth * 20) + (m_nScreenHeight - 1), &write_num, NULL); 65 66 67 68 69}
試したこと
OpenMPの並行処理も少し試してみましたが、触り始めということもあり
上手くできませんでした。
補足情報(FW/ツールのバージョンなど)
Visual Studio 2017
回答1件
あなたの回答
tips
プレビュー