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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

1回答

2513閲覧

パーティクル初回表示のときのみフリーズが起きてしまう

release832555

総合スコア9

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

1クリップ

投稿2020/09/26 01:43

編集2020/10/24 13:25

下記ソースでパーティクルを表示しております

using System.Collections; using System.Collections.Generic; using UnityEngine; public class VFXViewer : MonoBehaviour { public GameObject VFXObj; public void SplashVFX(Vector3 pos) { Instantiate(VFXObj, pos, Quaternion.identity); } }

が、パーティクル初回表示のときのみ0.4秒ぐらいのフリーズが起きています
初回表示の時だけなので、パーティクルのデータロードによるフリーズと考えています

ステージ構成は下の画像のように非常に多くの情報をプレハブデータで取り扱っているため多くのメモリを使用している
という要素もフリーズの原因かと考えています(ステージもパーティクルと同じくInstantiateで配置しています)
(丸がHumanoidのメッシュ 四角がパーティクルのデータと考えてください)
イメージ説明

上記ソースの
public GameObject VFXObj;
この変数に情報を代入している時点でキャッシュメモリーにロードされているという認識でしたが
違うということになりそうです

データロードによるフリーズをなくす方法をさがしていますが
もしくは、みなさんならどうやってパーティクルを表示していますか?
みなさんの方法と照らし合わせて上記ソースを添削していくことが解決の1つでもあると考えています

よろしくお願いします

追記 下の画像は初回パーティクル発生時のプロファイラー結果です
イメージ説明

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

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

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

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

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

fiveHundred

2020/09/27 11:40

> 上記スクリプトによってプレハブをすでに配置している状態で(添付画像のようなプレハブが無数に配置されたデータになります) Resources.Loadで読み込んだオブジェクトはInstantiateでコピーして初めて配置される、というのが私の認識なので、「すでに配置している」という言葉に違和感を覚えますが、どういう意味でその言葉を使っていますか?
fiveHundred

2020/09/27 12:01

それとも、「シーン開始時(もしくはそれよりも前)にResources.Loadでロードした」という意味ですか? いずれにせよ、「(GameObject)Resources.Load」だけでは具体的な内容が分からないので、「ロードしてから表示するまで」の内容(特にコード)を全て示していただかないと、回答することは難しいです。
release832555

2020/09/27 20:12 編集

既に配置しているというのは下記のソースの意味です シーン開始時にResources.Loadでロードしたという意味になります void Start () { GameObject obj = (GameObject)Resources.Load ("StageData"); Instantiate(obj, new Vector3(0.0f, 0.0f, 0.0f), Quaternion.identity); } プレハブデータの内容ですが、私が以前回答したスレッドにある画像を見ていただければ内容が分かります https://teratail.com/questions/294445 画像のように1つのプレハブに無数のプレハブをつっこんでおります(数にして100から200個の人型メッシュ&パーティクル) 非常にプレハブの数が多いのでそれも1つの要因かと思っております
fiveHundred

2020/09/27 22:25

了解しました。 私にはいい方法が思いつきませんが、負荷と容量が一致するとは限らない(例えばプレハブ内に動作の重いスクリプトがある、など)ので、プロファイラーを使って状況を確認するのも一つの手だと思います。 https://docs.unity3d.com/ja/2018.4/Manual/Profiler.html
release832555

2020/09/28 10:25 編集

アドバイスありがとうございます 追記しました プロファイラーで調査した結果Gfx.WaitForPresentがボトルネックになっていることがわかりました Gfx.WaitForPresentについて調べたところ下記の項目をチェックするのが良いとされていたので 修正しましたがいまだうまくいきません ポストプロセッサをOFF QualitySettings.vSyncCount = 0; メッシュのシェーダをSTANDARDにする
guest

回答1

0

どういったゲームなのかはわかりませんが、ゲームなら大体ステージ開始時にフェードアウト演出が入ってると思います
初回だけ重いのでしたらフェードアウトの際にそのパーティクルを作成すればいいのではないでしょうか
一瞬固まっても画面は真っ暗なのでプレイヤーが気が付くことはないです

根本的な解決ではないですが、どうしても重いのが解決しないまま時間が過ぎるぐらいならそういう方法でもいいと思います

投稿2020/10/24 13:55

lazh

総合スコア300

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

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

release832555

2020/10/24 17:32

成程 そういう手もありますね 回答ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問