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

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

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

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

Q&A

解決済

2回答

2455閲覧

UnityでSetActiveが遅い

yrema

総合スコア286

Unity

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

0グッド

0クリップ

投稿2019/02/09 06:01

Unityで48*48pxのスプライトをタイルとして敷き詰めて地面のマップとしています。
初期設定ではすべてのタイルはSetActive(false)していますが、
スクロールするとカメラの外側+3タイル分より内部はタイルが見えるようにSetActive(true)しています。

しかしながらSetActive(true)が負荷があるのか、スクロールがカクつくという影響を及ぼしています。
何かお知恵を拝借いただけないでしょうか。よろしくお願いいたします。

◆環境
Unity2017 3.1f1
Windowx10

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

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

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

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

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

sakura_hana

2019/02/09 11:37

オブジェクトの量によってはどんなコードにしても発生し得ると思いますが、SetActiveをコメントアウトする等して、本当にSetActiveが原因か確認してください。(個人的にはSetActiveもさることながら「SetActiveするオブジェクトの判別と取得」も怪しいと思います) また、Unityのタイルマップ機能は使っているのか、タイルはそのサイズでないといけないのか、スクリプトではなくUnityのオクルージョンカリング機能は使用出来ないのかなど検討の余地は色々あります。「unity 軽量化」などで検索し、自分で試した内容を記載してください。
yrema

2019/02/09 13:15

ありがうございます。参考にさせていただきます。「SetActiveするオブジェクトの判別と取得」が遅いのはご指摘の通りですが、SetActiveをコメントアウトすると早くなったのでここで質問させていただいた限りです。
sakura_hana

2019/02/10 04:49

何も書かれていないと「検証の結果SetActiveが原因と分かっている」のか「何も検証していないがSetActiveが原因ではないかと思っている」のか回答者には判断が付きません。二度手間を避ける為にも具体的な記載をお願いします。 また、SetActiveが遅いのなら「SetActiveしないようにする」が第一の対策案になります。オブジェクトはオンのままではいけないのか、オンのまま動作させて重いならばその本当の原因はどこなのか等、考える余地は色々あります。既に確認済みかもしれませんが「unity プロファイラ」で検索するとプロファイラを用いた確認方法が出ますので、そちらも参考にしてください。
yrema

2019/02/10 15:12

お返事ありがとうございます。最初にご指摘いただいた通り、「SetActiveするオブジェクトの判別と取得」が問題でその処理がUpdate()を通るごとに呼ばれているのが原因だったようです。いろいろ教えてくださったのでベストアンサーにしたいのですが「回答」としていただけないでしょうか?
guest

回答2

0

ベストアンサー

「質問への修正」を元にした回答です。

オブジェクトの量によってはどんなコードにしても発生し得ると思いますが、SetActiveをコメントアウトする等して、本当にSetActiveが原因か確認してください。
(個人的にはSetActiveもさることながら「SetActiveするオブジェクトの判別と取得」も怪しいと思います)

→「SetActiveするオブジェクトの判別と取得」が原因だったそうです。
Updateは毎フレーム実行されるので、重い処理をやると高負荷になります。
ですがスクロールに合わせるならUpdateでやらないといけないかもしれません。
その場合は「本当に毎フレーム実行が必要なのか?(数フレーム毎ではダメか?)」「処理内容の負荷を下げられないか?」「ジョブシステムではどうか?」などの対策が検討出来ます。

その他の確認点です。(同じ問題にぶつかっている人へ)

  • Unityのタイルマップ機能は使えないのか
  • タイルはそのサイズでないといけないのか(タイルサイズを大きくする=オブジェクト数が減る=処理の回数が減る=負荷削減)
  • スクリプトではなくUnityのオクルージョンカリング機能は使用出来ないのか
  • オブジェクトはオンのままではいけないのか(本当にSetActiveしなくてはならないのか)
  • オンのまま動作させて重いならばその本当の原因はどこなのか(本当にSetActiveで解決するのか)

投稿2019/02/11 06:37

sakura_hana

総合スコア11427

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

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

yrema

2019/02/11 13:15

どうもありがとうございます。
guest

0

画面外のポリゴンは描画処理に入らないので、SetActiveで切り替えをしなくても、普通重くならないはずなので、isActiveの切り替えを無くすのが無難だと思います。

GameObject数が多すぎて重いのであれば、マップのスプライト管理部分が全部作り直しになりますが、TileMapを使ってみるという方法もあります。

投稿2019/02/10 12:20

bochan2

総合スコア2050

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

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

yrema

2019/02/10 15:13

回答ありがとうございます。ある程度作ってからTileMapの存在を知ったので、作り直しを恐れて手が出てませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問