投稿記事

無料プランの記事 (168)

Heliodor 2021/01/01 17:51

あけましておめでとうございます


突然ですが、皆様は初夢を見ましたか?

なんか諸説あって(12/31~1/1の夜に見た夢説、1/1~1/2の夜に見た夢説、1/2~1/3の夜に見た夢説)初夢とは違うのかもしれませんが、私は大晦日から正月に掛けての夜に、少し変わった夢を見ました。というか今朝です。


父が夢に出てきて、実家の壁に掛けてある時計を指差して「ほら、時間だしそろそろ行きな」と言われたところで目が覚めた、というものです。


なんだか意味深ですよね。

実際はこんなホラーではなく普通の雰囲気だったので、不吉な夢ではないと思いますが……そろそろ本気で頑張れという父からのメッセージだったのでしょうか?

いや、ずっと本気で頑張ってるつもりなんですが……今年はより一層頑張ろうと思います。




あ、ちなみに父はバリバリ元気に生きてます。
実家も電車で30分ぐらいの距離ですw





余談

ドラゴンクエスト11S(steam版)買いました。

実はまだ11やってなかったんですよ。
UE4エンジンで表現された世界、オーケストラ音源、豪華声優陣……ドラクエもここまで来たかと感無量です。
少年の頃の自分に、これが未来のドラクエだぞ、スゲェだろ!と自慢してやりたくなります。
このエンジンで1~3リメイクしてくれないかなぁ。ダメか。ドラクエ8を見たときも同じこと考えた気がする。

去年(2020年)は忙しくて全然ゲーム出来なかったんですが、この正月はロトゼタシアで冒険してきます!


え、本気? し、正月が終わってから……。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Heliodor 2020/12/30 18:00

もう一人の主人公

今回は今作っているゲームの話。
フォロワー以上限定です。

フォロワー以上限定無料

まずは無料プランで様子見を。 お気軽にフォローしてみて下さい。

無料

【 500円 】プラン以上限定 支援額:500円

このバックナンバーを購入すると、このプランの2020/12に投稿された限定特典を閲覧できます。 バックナンバーとは?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Heliodor 2020/12/19 18:19

ベンチマーク

今回はいかにも自作PCっぽい話題と見せかけて、今作ってるゲームの話です。



今作っているゲーム(あやかし紅白戦)ですが、以前から一つの懸念がありました。

それは……


重くね?
ってことです。


当サークルのゲームは基本的にドット絵2Dなので、パッと見レトロな雰囲気です。あくまでパッと見。

別に色数や解像度を昔のハードに合わせて縛り製作ているわけでもないし、内部的には3D系の処理をしている部分も多いので全然レトロじゃないんですが「こんな古臭いゲームがなんでここまで重いの?」という血も涙も無い評価を頂く事があります。主にリアル友人。
3D系は多少重くてもは許されて、2D系には厳しい風潮……ありますよね……。

実際問題として、開発初期は何の問題もありませんが、製作が進むにつれていろいろな要素を入れたくなってしまい、しかもその要素を「出来るか分からないけど取りあえず作ってよう!」と効率や高速というものをあまり考慮せず、シンプルに実装できるやり方でどんどん追加していった結果、いろいろな場所に無駄な処理が入り込んでしまう(ように感じる)のです。

さらに安全に動作するようにさまざまなチェックを入れていった結果、メモリーやポインタ関係のエラーは格段に減ったものの、代償として処理速度がガンガン削られることとなりました。

デバッグモードで動かした場合は本当にひどくて、マップによっては重すぎでテストする気がなくなるぐらいです。
(ヴィータ大脱出の頃はデバッグモードで動かしてもそこそこ早かったんですよ……)

高速化の手段と言いますか、引っ掛かってそうな部分はたくさんあるので、そこを片っ端から直しても良いのですが、80:20の法則(プログラム全体の2割の部分で、全体の処理時間の8割を消費している的なヤツ)のこともありますし、ここはきちんとプロファイラー(プログラムのどこでどれだけの時間を消費しているか調べるヤツ)を使って、どこがホットスポットになっているか調べた方が良いなと。
最近の Visual Studio は無料版にもプロファイラーがついてますしね。



以下、プロファイラーについての話がしばらく続きます。面倒でしたら後半までスキップしちゃってください



ここから細かい話


1分ほど起動した後に終了すると、こんな感じで解析結果を出してくれます。

これを見ると、重い割には CPU 使用率が10%程度なのですが、これは即ちマルチコアの1個のCPUだけがめちゃくちゃ頑張ってるっていう状態ですね。
分散処理とか何もしてないので……。


で関数の利用状況の表を見てみると、こんな感じになるわけですよ


この「セルフCPU」という項目を見ると mo::CCollisionImpl::update_dynamicbody_collision_unsafe 関数で(名前が見切れてますが)全体の 24% の時間を消費していることになっています。
仮にこの関数の実行時間が 0% になったら、全体の実行時間が 100 → 76 に減ることになるので全体では 1.3 倍程度早くなるってことですね。

※合計CPUは、その関数の最初から最後までの合計実行時間です。
別の関数を呼んで、その関数が戻ってくるまで待っているだけの時間もすべてカウントしています。
例えば以下のようなプログラムの場合、 main 関数の合計CPUはほとんど100%になります。

 int main() {
  game_main();
  return 0;
 }

それに対してセルフCPUは、純粋にその関数自身が実行している部分の時間です。なので、別の関数を呼んだ場合、それが戻ってくるまでの待ち時間は含みません。
上記の main 関数で言えば、main 関数はただ game_main() を呼んでいるだけで、main 関数自身は何もしていません(戻り値 0 をセットするぐらいか)。この場合のセルフCPUは 0% になります。

より詳しく見れば、具体的に関数のどこの部分でどれだけの時間を消費してるかってのが分かります。


例えばこの関数 get_active_static_body_list_unsafe で言えば
15554行目にある body-node->is_static() の呼び出しだけで全体の 11.81% の時間を使ってるとあります。
なので、このあたりをどうにかすれば速度が改善しそうだ、となるわけです。

ちなみに関数の呼び出し関係を表示させることもできて、これを使うと、同じ関数がどこから呼び出されたときに一番時間がかかっているかを見ることができます。


現在の関数に mo::KCollider::get_aabb とありますが、この関数の呼び出し元が左にあります。これをみると、mo::CCollisionImpl::update_dynamicbody_collision_unsafe から呼ばれたときに 11.72% の時間を消費している、とあります。

また、 mo::KCollider::get_aabb が呼び出した関数の中では KMatrix4::transform が一番時間を消費しています(真っ赤になってます)
あきらかに行列計算で持っていかれてますね……(これでもSIMD使うようになって少しは改善したんですよ)。

※ちなみにこの画像の下に表示されてる情報だと get_offset_world() が 9.54% 消費してることになっていますね。

この関数は上のリストにありませんが、これは最適化によって get_offset_world の呼び出しが消え、本当なら get_offset_world の中から呼ばれていた KMatrix4::transform が直接呼ばれているということです。

細かい話ここまで







まあそんな感じで、プロファイラーつきでゲームを起動して重そうな場所に目星をつけ、そこを修正してもう一度起動し、改善されたかどうか見てみる、というのを繰り返していたわけです。

ところでこのとき、ロード画面やタイトル画面をプロファイルしてもあまり意味はないので、

ゲームを起動→ロードが終わってタイトル画面が出るまで待つ→タイトル画面放置デモを起動させる(プレイヤーを自動操縦させたいので)→デモ部分でのCPU利用状況を調べる

という手順を踏んでいしましたが、さすがにこれを毎回毎回やるのが面倒になってきたので、起動してすぐに自動でデモモードが始まるようにしたものを作りました。

起動すれば後は勝手にステージが始まってプレイヤーが自動で動き回るし、ステージに必要なデータしかロードしない(タイトル用のデータとかいらない)ので起動が若干早くて楽になるというものです。



……で、何となくこれを眺めていてい思ったんですよ。
「これ、スコアを付ければそのままベンチマークソフトになるんじゃね?」と。
これを体験版に内蔵しておけば、動作快適環境の目安にもなりますよね。



というわけでメニューとか作って、紆余曲折を経て、ひたすら敵が湧くだけのベンチマークとして体裁を整えてみました。


今回は低負荷だけ作りましたが、将来的に高負荷の方ではムチャクチャやってみたいと思います。

……毎度のことですが、どうしてこういうことに手が伸びるんでしょうね?
そんな暇があったらゲーム本編を(略



フォロワー以上の特典でそのベンチマークソフトがダウンロードできます。
気になる方はどうぞ。(フォローだけなら無料です)

フォロワー以上限定無料

まずは無料プランで様子見を。 お気軽にフォローしてみて下さい。

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Heliodor 2020/12/14 17:59

新たなるファン

ファンというのは愛好家とかのファンじゃなくて、回転して空気を送る方のファンです。



今回の話も要約するとこんな感じ。


またぬかりました。つまりどうでもいい話です。

前々回の記事( https://ci-en.dlsite.com/creator/59/article/401956 )で「10年戦える」とか言ったそばから、またPCトラブル発生しました。

とは言ってもそんな致命的な問題ではなく、電源投入から起動時にファンが
「ゴゴゴゴゴゴゴ!」
と唸って、デスクトップが表示される頃には静かになるというものです。
CPU温度を見た感じ特に高温になっている様子も無いので、単にファンが高回転時に異音を出しているだけっぽいです。軸かベアリングがへたったか?

このPCは特にクロックアップとか高負荷なことするつもりも無かったんで、リテールのクーラーそのまま使っていたんですが、考えてみれば10年前に組んでからずっと物理的に稼動していた部分だし、むしろ今までよくもったと考えるべきですよね。

ありがとうIntel、ありがとうリテールのCPUクーラー、キミのとこは忘れない……。


などと感傷に浸っている間にファンが完全停止してしまったらさすがにマズイので、Amazonで適当なCPUクーラーを注文。CPUクーラーごとき一瞬で交換済ませて……済ま……。


めっちゃ難易度高ぇ!

いや、ケースからマザーボードを取り外せばそんなに難しいものでもないんですが、そこまでバラバラにして組み立て直すのは面倒臭過ぎるのでなんとかそのまま交換しようと四苦八苦。

こんなCPUクーラーひとつ交換するのに何故自分はこんな汗掻いて苦労しているのか。
せめてケーブル外して狭くて暗い机の下から引きずり出して作業するべきだったか。



絶対に分解した方が早かったヤツですが、なんかもう意地になって力こそパワーで取り外して交換完了。最後の方はかなりヤケクソになっていたので、まさか壊れていないよね?とドキドキしながら電源投入。


BIOS画面、そしてWindows起動画面が出てホッと一安心。

よかった。CPUファンもちゃんと回っているし、どこも壊してなかった。今度こそこれで10年戦える……。



PC「ゴゴゴゴゴゴゴ!」



!?



PCケース内を覗き込み、後方に排気しているケースファンをそっと指で止める。

ピタリと止む異音。


指を離す……。



PC「ゴゴゴゴゴゴゴ!」








前回さながら、どうしてくれようこの徒労感。あと無駄な出費。



10年働いたCPUクーラーと新しく買ったヤツ(空き箱)

面倒臭過ぎるんで元に戻したりはしませんが
Intel純正CPUクーラー(のファン)耐久性スゴイね!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Heliodor 2020/12/06 19:43

ちょいネタ

今回は一応フォロワー以上で。

フォロワー以上限定無料

まずは無料プランで様子見を。 お気軽にフォローしてみて下さい。

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

4 5 6 7 8 9 10

限定特典から探す

記事のタグから探す

月別アーカイブ

記事を検索