ComputeShaderでモブを動かす【その7:if文削減で高速化/イマイチ】Unity3DUnityComputeShader経緯コンピュートシェーダー(ComputeShader)を学ぶため、自動車を動かす交通シミュレーターもどきを作ってみようと思いました。個々の自動車がそれぞれ衝突を回避しつつ適切な経路で目的地に移動できるようになるのが目標です。前々回(その5)にて、ごく単純な衝突回避はできましたが、時々カクつくのが気になりました。そこで、前回は二次元スレッド化を試してみましたが、思うような効果は得られませんでした。今回はコードの改良でパフォーマンス向上が出来ないか試してみました。◀【その6:二次元スレッド・複カーネル化/効果なし】if文削減で効率化?Shader書くときは、「if文などの制御文を使うと遅くなる」ってよく聞くのですが、衝突判定では気軽に多用してました。if文を減らしたら高速化できるかもしれないと思ってやってみました。なる式をどんどん掛け算していくことにします。carD1;}悔しいけど、力不足で最後のif文は削れませんでした。本当なら下記のようにして最後のif文もなくせる目論見だったんですが、判定結果がおかしくなって意図通りに動かなくなりました。if文を削っても総計算量が増えたらあんまり意味ないかも・・・と思わないでもないですが、カクつく原因であるGPU負荷の局所ピークを平滑化できれば、平均的な負荷が多少あがっても意味はあるのではないかと思いました。気持ち、GPUトゲトゲが減ったように見えなくもないが、誤差の範囲と言われても仕方がないレベルです。それと、時々現れる大きなピークは結局消せなくて、見た目にも時々カクっとなるのは改善できませんでした。スキップさせてみました。いうべきか、平均的に負荷は落ちたものの、時々発生する大きなピークはなくなりませんでした。カクつきに関しては、どうやらシェーダーのコード以前に、もっと根本的なところで負荷がかかってるようです。振り返ってみれば、その3の頃からGPU負荷の局所ピークは存在していたようです。なんなんですかね、これ?まとめ・感想パフォーマンス向上を期待して、コンピュートシェーダ中のif文を減らしてみた(8→1)。目立った効果はなかった。if文は増えても計算量は増えたからかも?カクつきの原因のGPUピークはコンピュートシェーダ以外の原因の可能性が高そう(だが原因不明)。(ということは、そこまで無茶なコードを書いてたわけではなかったようだ)カクつきがコンピュートシェーダのせいじゃないなら、ひとまず追及は置いておいて、次は車線変更とかできるようにしてみたいですね。おまけ(うまく動かないコード周辺のダイジェスト)何かお気づきの点があればコメントいただければ幸いです。カーネルは以下の順序で実行されます。requestStockLike1@Shinoda_NaokiFollow株式会社テクロス京都を拠点にソーシャルゲームの開発・運用、その他システム開発を行っています。upLoginユーザーは見つかりませんでした。