質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

3423閲覧

Unityのフリーズの原因の見つけ方について

aoshanghai

総合スコア24

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

3クリップ

投稿2019/04/03 06:47

Unityのフリーズの原因の見つけ方についてです。

Unity上で開発を行っているのですが、
1日ぐらいゲームを動かすと、フリーズが発生します。
簡単なプログラムなので、Unityのsceneの遷移や
データの読み込みや開放は行っておりません。
ただ、UnityのUNETを使ったネットワーク通信は行っております。
(Unity 2017 4.21f1 64bitを使用)

ということで、比較的シンプルな構成のつくりなのですが、
1日ぐらい動かし続けるとフリーズが発生します。
メモリリークは、起きていなさそうでした。

Unity上でフリーズが発生した場合の調査方法について
調べていたのですが、今のところ、以下の2つが見つかりました。

1、PanicButtonというアセットを使用する
2、以下のサイトの方法を使う。
https://blogs.unity3d.com/jp/2016/05/24/breakout-how-to-stop-an-infinite-loop-in-a-unity-c-script/

1は、早速アセットを購入してインストールしてみたのですが、
動かそうとすると、Unityが落ちてしまい、上手く使えませんでした。

2は、実験的に、簡単な無限ループを作成して試してみたところ
無事、無限ループが発生しているスクリプトを特定できました。

しかし、問題が出ているゲームプログラムで試したところ
処理が比較的複雑なせいか、今のところ上記サイトのように
上手くはいっておりません。
細かい説明をしますと、フリーズが起きてVisualStudio2017で、
Unity.exeにデバッガをアタッチして、アセンブリコードを見て
ループの状況を見ていたのですが、レジスタr11を使ったcmpがなくて
r12のものはあったので、そこでr12の中の値を0にして、メモリ
リードエラーを発生させたのですが、上記のサイトが紹介するように
ならずに(Unityへ処理が戻らずにずっとフリーズの状態のまま)
原因が発生しているスクリプトを特定することは出来ませんでした。

ということで、Unity上でフリーズの問題が発生したときに、
原因を特定する良い方法がありましたら、ご教示頂けると助かります。

お手数をおかけいたしますがどうぞよろしくお願い致します。

Lighthigh57👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakura_hana

2019/04/05 01:37

あんまり参考にならないと思うのでこちらに書きますが、 1.新規作成したプロジェクトや、基礎的なシステムのみ(例えばUNETのルームに入るだけ)のプロジェクトを作り、1日放置して同様の問題が起こるか確認する(実行環境自体が耐えられない可能性の切り分け) 2.ログを外部ファイルに書き出す仕組みを作り、Debug.Logの要領で逐一ログを書き出す(途切れているところが原因箇所である可能性が高い) などの方法を一応試してみてはいかがでしょうか。(後者はそれ自体が負荷になる可能性がありますが……) また、エディタがフリーズ原因の可能性もあるので、2を実装後ビルドして試してみるのもいいかもしれません。
aoshanghai

2019/04/05 08:56

ご教示ありがとうございます。 1、テストプログラムを作っての検証 2、ログを活用する 3、ログを実装後ビルドして検証してみる ご教示頂いたこれらについて試してみたいと思います!
tmp

2019/04/05 09:35

2のリンク先を見てみましたが、あくまでも例でアタッチして強制的に例外発生させることで情報が得られることもあるよって話です。 だからレジスタr11やcmpのコードがそのまま当てはまるわけではないと思います。 発生頻度が低い場合、sakura_hanaさんが、言っているようにログを残すことが結構有効だと思います。 また、ネットワークを疑っているのなら、LAN内ではあまり発生しないが発生するパケットロス時のの不具合の可能性があるのでUNetには、パケットロスをテストする機能もあったと思いますので試してみてはどうでしょうか
aoshanghai

2019/04/06 10:12 編集

ご教示ありがとうございます。 レジスタをいじる件については、今後もいろいろと試してみたいと思います。 今のところ2回ほどループしてそうな箇所でサンプルと似ていそうなパターンでレジスタをいじってみたのですが、Unityには処理が戻りませんでした。 もしかしたら、スクリプトの中でループしているのではなくて、Unityエンジンの中なのかもしれません。 また、ログについてもさらに詳細が分かるように追加していっております。 これでもう少し範囲を絞ることでできればと思っております。 パケットロスのテストは、まだやったことがないので、試してみたいと思います。 ご教示ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問