( 更新) ゲーム制作

多次元配列の挙動がおかしい…?

2024/5/4追記

このバグは、dmd v2.108.1で修正済み。

多次元配列をメモリ上に確保した際、それがGCのスキャン対象になっていなかったのが原因らしい。もともとはbugzilla 24440で報告されていたが、最終的に、内容が重複する24498のほうで修正されたようだ。

https://issues.dlang.org/show_bug.cgi?id=24498

とりあえず、筆者のプロジェクトではブロックが正常に動作するようになった。よかったよかった。

dmdコンパイラのバージョンをv2.105.0から上げていなかったのでバージョンアップしたところ、多次元配列が不可解なバグを起こすようになった。

なんというか、配列内の要素が意図しない値に勝手に書き換わっているっぽい…?

筆者はゲーム制作で、マップ内のブロックを管理するために巨大な2次元配列を使っているのだが、

// こんな感じでブロックを巨大な2次元配列で管理している。
// Blockは4bytesのデータをラップした構造体。
_blocks = new Block[][](blockCountY, blockCountX);

その中身が書き換わるせいで地形の当たり判定がめちゃくちゃになったり、最悪の場合クラッシュしたりしてしまう。

エラーダイアログが表示されたゲーム画面
中身が変なデータになったブロックに触れてクラッシュする図。ぐえ~

v2.106.0までは問題なくて、どうやらv2.107.0から発生しているようだ。(ちなみに環境はWindows 64bit)

自分以外にこのバグで困っている人はいないものかと、D言語のbugzillaをあさってみたところ、なんと、関連しそうなものが報告されていた。

https://issues.dlang.org/show_bug.cgi?id=24440

多次元配列に要素を追加するとクラッシュするという内容で、発生バージョンはv2.107.0以降。おそらくこれが修正されれば問題は解決しそう。

とはいえ、コンパイラの中身とか分かるわけもないので、なんの後押しもできない… 修正されるのをじっと待つしかない。

v2.108.0で追加されたString Interpolationとか使いたかったなぁ(泣)