トップページ > 記事閲覧
サイズの大きいフォントを扱うとCPU使用率が100%になる
名前:初心者 日時: 2023/06/10 05:55

こんにちは。 お世話になっております。 タイトルの通り、特定のサイズを境に負荷の量が天地の差なので不思議に思い、自分の方でも色々と検証しているのですが、一人だと一生かかりそうなので助力頂ければと思い、スレッドを立てさせて貰います。 現状わかっていること 具体的には DxLib::DrawStringFToHandle, DxLib::GetDrawStringCharInfoToHandle で発生した。その他は未検証。 サイズが22~28程度以上のフォントを扱うとCPU使用率が100%になる。(全コアが100%になるのでは無く、1コアのみ100%に張り付く) サイズが上記に当てはまらない場合のCPU使用率はほぼ0% CPU使用率が100%になるフォントサイズの境界はそのフォントハンドルの使い方によるのか、コードの内容が異なると22~28程度でぶれる。なお、同じコードの場合は何度再ビルド及び再実行しても境界は変わらない。 リリースビルド(-NDEBUG, -O2 を指定、-_DEBUG, -g, -O0 を非指定)でも変わらないと思われる。(検証数少なめ) フォントは主にメイリオで検証していたが、游明朝でも同様の現象が確認できた。 検証結果 5枚の画像です。 ttps://8.gigafile.nu/0710-ccd8d21ade7ab028d0076c2ba7db02cd4 ログ それぞれメイリオ21pt, 22pt, 48ptです。 最後の 1, 2, 3, のような数字は自分がデバッグ用に出力したものです。 ttps://8.gigafile.nu/0710-bcf674ebe5b8fca1780ba157cc748a88a
メンテ

Page: 1 |

Re: サイズの大きいフォントを扱うとCPU使用率が100%になる ( No.1 )
名前:初心者 日時:2023/06/10 05:59

肝心のコードを張るのを忘れていました! メインで検証していた方のコードは複雑化しているので別コードの方を上げさせてもらいます。 -------------------------------------------------- #include <bits/stdc++.h> #include <DxLib.h> int WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { DxLib::ChangeWindowMode(true); DxLib::SetGraphMode(1280, 720, 32); DxLib::SetWindowText(TEXT("メイリオ:28pt")); if (DxLib::DxLib_Init()) { return -1; } const auto font = DxLib::CreateFontToHandle(TEXT("メイリオ"), 28, -1, DX_FONTTYPE_ANTIALIASING_16X16); const auto color = DxLib::GetColor(0, 255, 255); while (!DxLib::ProcessMessage()) { DxLib::ClearDrawScreen(); float y = 0; DxLib::DrawStringFToHandle(0, y, TEXT("日本国民は、正当に選挙された国会における代表者を通じて行動し、われらとわれらの子孫のために、諸国民との協和による"), color, font); y+=30; DxLib::DrawStringFToHandle(0, y, TEXT("成果と、わが国全土にわたつて自由のもたらす恵沢を確保し、政府の行為によつて再び戦争の惨禍が起ることのないやうにする"), color, font); y+=30; DxLib::DrawStringFToHandle(0, y, TEXT("ことを決意し、ここに主権が国民に存することを宣言し、この憲法を確定する。そもそも国政は、国民の厳粛な信託によるもの"), color, font); y+=30; DxLib::DrawStringFToHandle(0, y, TEXT("であつて、その権威は国民に由来し、その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。これは"), color, font); y+=30; DxLib::DrawStringFToHandle(0, y, TEXT("人類普遍の原理であり、この憲法は、かかる原理に基くものである。われらは、これに反する一切の憲法、法令及び詔勅を"), color, font); y+=30; DxLib::DrawStringFToHandle(0, y, TEXT("排除する。 日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであつて、平和を"), color, font); y+=30; DxLib::DrawStringFToHandle(0, y, TEXT("愛する諸国民の公正と信義に信頼して、われらの安全と生存を保持しようと決意した。われらは、平和を維持し、専制と隷従"), color, font); y+=30; DxLib::DrawStringFToHandle(0, y, TEXT("、圧迫と偏狭を地上から永遠に除去しようと努めてゐる国際社会において、名誉ある地位を占めたいと思ふ。われらは、"), color, font); y+=30; DxLib::DrawStringFToHandle(0, y, TEXT("全世界の国民が、ひとしく恐怖と欠乏から免かれ、平和のうちに生存する権利を有することを確認する。われらは、いづれ"), color, font); y+=30; DxLib::DrawStringFToHandle(0, y, TEXT("の国家も、自国のことのみに専念して他国を無視してはならないのであつて、政治道徳の法則は、普遍的なものであり、"), color, font); y+=30; DxLib::DrawStringFToHandle(0, y, TEXT("この法則に従ふことは、自国の主権を維持し、他国と対等関係に立たうとする各国の責務であると信ずる。日本国民は、"), color, font); y+=30; DxLib::DrawStringFToHandle(0, y, TEXT("国家の名誉にかけ、全力をあげてこの崇高な理想と目的を達成することを誓ふ。"), color, font); y+=30; DxLib::ScreenFlip(); } DxLib::DxLib_End(); return 0; } --------------------------------------------------
メンテ
Re: サイズの大きいフォントを扱うとCPU使用率が100%になる ( No.2 )
名前:初心者 日時:2023/06/10 06:33

完全におま環だと思っていたので、検索すらせず検証していたのですが、ふと調べてみたところ SetFontCacheCharNum 関数なるものがあるようで… 試してみたところ、 メイリオ21pt SetFontCacheCharNum(100) -> 逆に CPU 使用率が100%になる… SetFontCacheCharNum(1000) -> CPU 使用率は100%にはならないが、変更前よりCPU使用率悪化… メイリオ48pt SetFontCacheCharNum(1000) -> メイリオ21pt(1000)と同程度のCPU使用率!これは成功! と使い方が難しい関数のようで… SetFontCacheCharNum 関数について教えて欲しいです! また、この関数以外にも解決策がありましたら教えて頂けるとありがたいです!
メンテ
Re: サイズの大きいフォントを扱うとCPU使用率が100%になる ( No.3 )
名前:管理人 日時:2023/06/11 00:08

CPU 使用率が100%になってしまうのはフォントキャッシュのサイズ不足が原因なので 基本的には SetFontCacheCharNum(1000); を実行してから CreateFontToHandle を呼ぶと CPU 使用率が100%になる現象を防ぐことができます ただ、キャッシュできる文字の数を増やせば増やすほど使用メモリは多くなるので あまり大きい値を設定してしまうのは良くありません 1フレームで DrawStringFToHandle や GetDrawStringCharInfoToHandle で扱う文字の数の 最大数より少し大きいくらいの値を SetFontCacheCharNum に渡すようにすると CPU 使用率が100%にならず、且つ使用メモリも無駄に多くせずに済みます > また、この関数以外にも解決策がありましたら教えて頂けるとありがたいです! SetFontCacheCharNum 以外の解決策はありません ( 強いて言えば『フォントサイズを小さくする』『画面に一度に表示する文字数を減らす』等の解決策となります )
メンテ
Re: サイズの大きいフォントを扱うとCPU使用率が100%になる ( No.4 )
名前:初心者 日時:2023/06/11 05:56

お返事ありがとうございます。 SetFontCacheCharNum に指定すべき値の参考になります。ありがとうございます! SetFontCacheCharNum 関数のようなキャッシュ関係関数等の指定すると、VRAM 等のリソースとのトレードオフで性能が爆増する関数が他にもあるかと思います。 提案なのですが、このような性能に関わりうる関数の一覧を作っていただけないでしょうか?(線引きが難しいと思いますが…) 検討よろしくお願いします!
メンテ
Re: サイズの大きいフォントを扱うとCPU使用率が100%になる ( No.5 )
名前:管理人 日時:2023/06/12 00:12

> 提案なのですが、このような性能に関わりうる関数の一覧を作っていただけないでしょうか?(線引きが難しいと思いますが…) 少し考えてみたのですが SetFontCacheCharNum のような性能に関わりうる関数は他には思いつきませんでした
メンテ
Re: サイズの大きいフォントを扱うとCPU使用率が100%になる ( No.6 )
名前:初心者(解決済み) 日時:2023/06/12 05:08

分かりました。 ご丁寧な対応ありがとうございました!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存