UnityとC#を使用してゲームを作成しています。
使用してから6か月と初心者ですが、自力で調べても問題解決ができなかっため、
質問させていただきます。
セーブデータをロードした際に処理が重く画面が停止してしまうため、
なんとかして停止しないようにしたい。
〇理想
NOWLOADING画面を表示し、
WINDOWSのビジー状態のように「丸い円がぐるぐる」と回り処理終了まで待つ。
(プレイヤーに現在ゲームがフリーズしていないことを見せておきたい)
と考えております。
現状の問題
重たい処理を連続してさせてしまうと、画面が停止してしまう
「丸い円がぐるぐる」が完全停止してしまう
(許容範囲としてはぽつぽつ止まる程度なら、OK)
現状のソース
記述例 <処理説明> 関数などの呼び出しによる処理 今回変更する予定のないブラックボックス部 public static MonoBehaviour main_mono;//IEnumerator内でコルーチンを呼び出すための宣言 public int yomikomi_end_flag = 0;//読み込み終了受け取り void Start() { //処理の開始 //staticでもコルーチンを使うよう g.main_mono = this; //ゲーム処理のメイン部の起動 StartCoroutine(main()); } public IEnumerator main() { //重たい処理の並列実行 yomikomi_end_flag = 0; main_mono.StartCoroutine(load_data_()); main_mono.StartCoroutine( <NOWLOADINGの動く画像表示等の処理>); //処理待ちループ while (true) { if (yomikomi_end_flag > 0) { //読み込み終了したため、ループからの脱出 break; } yield return null; } } public IEnumerator load_data_() { ///////// ※※2 ///////// //セーブファイル読み込み string save_data = <セーブデータ読み込み>; //読み込んだデータの解析 //読み込んだデータの解析 for (int i = 0; i < <データ数行>; i++) { for (int j = 0; j < <データ数列>; j++) { //ココが何度も実行させると重たい 単体ではそこまで重たくない ///////// ※1 ///////// <個別のデータ処理>(save_data, i, j); } } } //読み込み終了の連絡 yomikomi_end_flag = 1; ///////// ※※3 ///////// yield return null; }
現状の解決方法
///////// ※1 /////////
に
yield return null;
を入れると「丸い円がぐるぐる」がずっと回り続ける
だが、これではデータ数が多くなると読み込み時間が多大になる
(予定ではデータ数はプレイに応じて多くなっていく)
初心者の考察
yield return null;
で「丸い円がぐるぐる」になるため
1フレーム中の処理が重たくなりすぎると、画面が止まってしまうのでは?
希望したいこと
///////// ※1 /////////
に
処理に時間がかかっているか確認をして、
時間がかかっているときはyield return null;を実行させて、1フレーム中の処理が重たくなっている状態を開放する
実験したがうまくいかなかったソース
逆に重たくなってしまったため、断念しました
Time.realtimeSinceStartup を何度も実行するほうが重すぎました
public static Dictionary<string, float> check_time = new Dictionary<string, float>(); //1秒以上処理していたらウェイト 用のキャッシュ位置を取得 public static string get_chach_iti(string back_time_iti = "") { //存在チェック float times = keisan_time(); if (back_time_iti == "") { back_time_iti = "" + times; } //名前重複チェック while (true) { if (check_time.ContainsKey(back_time_iti)) { int ran = Random.Range(0, 20); back_time_iti = back_time_iti + "_" + ran; } else { break; } } check_time.Add(back_time_iti, times); return back_time_iti; } //前回処理より時間がたっていたらウェイトさせる信号を送る true でウェイトさせる public static bool chk_wait_over(string back_time_iti,float over_time = 100) { //over_time = over_time / 1000; float now_sec =Time.realtimeSinceStartup*1000; float chk_time_over = 0; float back_time = 0; back_time = check_time[back_time_iti]; chk_time_over = back_time + over_time; //d.b("タイムチェック" + now_sec + " : " + back_time + ")"); //大きいまたは少なすぎるとウェイト if (now_sec > chk_time_over) { //d.b("ナガスギウェイト" + now_sec + " : " + back_time + "(" + chk_time_over + ")"); check_time[back_time_iti] = now_sec; return true; } else if (now_sec < back_time) { //d.b("短すぎウェイト" + now_sec + " : " + back_time + "(" + chk_time_over + ")"); check_time[back_time_iti] = now_sec; return true; } return false; } //終了後のキャッシュの解放 public static void del_check_time(string back_time_iti) { check_time.Remove(back_time_iti); } ///////// ※※1 ///////// を //長過ぎウェイト用キャッシュ取得 string wait_iti = wait.get_chach_iti(); ///////// ※※2 ///////// を //長過ぎウェイトチェック if (wait.chk_wait_over(wait_iti)) { yield return wait.f(1); } ///////// ※※3 ///////// を //キャッシュ解放 wait.del_check_time(wait_iti); に置換して使用する
現在作成中のゲーム
光栄様の三国志7のようなゲームでキャラが時間経過でポコポコ増えていくゲーム
(そのため、どんどんとセーブデータが大きくなっていく)
なにとぞ、ご教授の方をよろしくお願いします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/26 12:11
2019/03/27 06:47
2019/03/27 22:52
2019/03/29 00:20