Colliderを使って気体分子の運動を作ってみたのですが、シーン内に存在するRigidbodyの数が多くなった時、急激に物理演算の時間が長くなり、フレームレートが驚異の1FPSまで落ちました。Colliderを使った衝突の例として、単原子の気体分子が狭い空間を飛び回る様子を表現してみます。時間経過で気体分子を生成するスクリプトなども公開しています。Rigidbodyの衝突検知モードについてもパフォーマンス面で発見がありました。Detection)を『ContinuousDynamic』にしていたこと。そこでオブジェクトの個数の観点から、衝突検知モードの各設定のパフォーマンスを確認してみたいなぁと。具体的には、時間経過でオブジェクトをどんどんインスタンス化していき、特定のFPSを下回った時の個数をモード毎に比較します。i7)を使用してエディタ上で確認します。衝突検知モードについて各衝突検知モードの動作については下の記事をご覧あれ。Detection(衝突の検知)について、値を変えると物体の運動がどのように変化するのかを実験しています。Detectionの設定はどうかによって衝突を検知できるかどうかが...衝突検知モードは3つ存在します。Descrete離散的に衝突を検知します。FixedUpdateが呼ばれたタイミングで衝突を確認するため、そのときにColliderが重なっていないのであれば衝突したと見なされません。進路上にオブジェクトがいるかどうかを計算しないのでパフォーマンス的には軽いです。今回のケースだと壁をどんどこすり抜けそうな予感。ContinuousこのRigidbodyを持ったオブジェクトの進路上に、Rigidbodyを持っておらず、かつColliderを持つオブジェクトがあれば、FixedUpdateの間であっても連続的に衝突を検知するモード。今回の例だと、壁との衝突までは検知してくれます。動き回る気体分子同士の衝突までは計算してくれません。FixedUpdateが呼ばれたタイミングで運よく位置が重なっていれば離散的に衝突が発生するので、全く衝突が発生しないわけじゃないです。Detectionが『Continuous』または『ContinuousDynamic』であれば連続的に衝突を検知してくれるモード。気体分子が高速で飛び回っていても、壁との衝突や気体分子同士の衝突を検知してくれます。計算量はえげつないことに。狭い空間内で気体分子をPrefabからインスタンス化していきます。インスタンス化のペースは0.5秒に1個です。気体分子はインスタンス化された際ランダムに力を与えられ、空間内を飛び回ります。Detection)によってパフォーマンスがどの程度変化するのかを確認します。今回はフレームレートを基準として、以下のフレームレートを下回った時のオブジェクト数を比較。1.000s処理時間の確認ですが、テラシュールブログさんにプロファイラから処理時間を取得する方法が分かりやすく書かれた記事があったので、それを参考にさせてもらいます。テラシュー...http://tsubakit1.hateblo.jp/entry/2017/11/04/232336プロファイラーに表示されるようなCPUの処理時間をスクリプトで取得する方法についてです。画...物理演算の処理時間を確認するため、プロファイラから『Physics.Processing』を引っこ抜いて処理時間を確認します。計測用スクリプトフレーム内の処理時間を確認するため、以下のスクリプトを作成。Gist.fpsBasesでintの配列を作り、基準となるフレームレートを並べました。その数に応じて、boolの辞書を作っています。fpsとbool値を対応させておくとforeachで一気に確認できるので楽ちんです。毎フレームforeachが呼ばれるのはご愛嬌。プロファイラの値を見るために、Recorderへの参照を取っています。物理演算の処理時間を確認するため、『Physics.Processing』のラベルを対象にGetしています。プロファイラー』にあるPhysicsマーカーの項目を見てもらうといいかも。Update()の中では、最初にフレームカウントを確認しています。いうのは、ゲーム実行を開始した直後は処理が立て込んでいて、オブジェクトが生成されていないのにメッセージが出力されちゃうためです。メッセージは基準値を下回った初回のみ出力するようにしているので、1フレーム目でメッセージが出力されて、あとは何も出ません、とかだと実験になりませんもんね。10フレームくらい待ってから処理時間を確認開始です。その後に、前回のフレームの処理時間を取得し、それを秒に変換しています。この処理時間とFPSの各基準値を比較して、基準値を超えていればメッセージを出力します。メッセージ内ではフレームカウントとオブジェクト数を出力しています。ここで掲載したのは処理時間のカウント用スクリプトで、オブジェクトの生成用スクリプトは以下の記事に掲載しています。Colliderを使った衝突の例として、単原子の気体分子が狭い空間を飛び回る様子を表現してみます。時間経過で気体分子を生成するスクリプトなども公開しています。Rigidbodyの衝突検知モードについてもパフォーマンス面で発見がありました。『Discrete』、『Continuous』、『ContinuousDynamic』の順番で結果を記載します。結論から言うと、フレームレートは30FPSまで下がらず、メッセージが表示されませんでした。パフォーマンス面でアドバンテージがあるだけのことはあります。実はいっぱい飛び出してる......が、狭い空間に閉じ込めた気体分子オブジェクトたちは、簡単に壁をすり抜けて遥か彼方へと旅立ちました。FixedUpdateが呼ばれたタイミングで壁の厚さの範囲内にいないと衝突扱いにならないので、高速で動く気体分子はすり抜けやすいんです。フレームレート「は」安定Profilerを見ると、処理時間は1.5ms程度、ピークで4.8ms程度でした。他のRenderingやUIの方が大きいくらい。物理演算の処理はやっぱり軽いです。壁との衝突をバッチリ行ってくれるモード。処理時間が基準値を超えた時のコンソール出力です。最終的に5FPSまでしか到達しませんでした。基準値を越えると一気に処理時間が増加しています。このまま1FPSを割るところまで行くかとも思いましたが、そこまでは行かずでした。続いてProfilerを見ると、ピークは271ms程度。......ピークを観測できたということは、処理時間が増加を続けるのではなく、減少したことを意味します。画面の更新が鈍くなっても見守っていた結果、なんと処理時間が減ってきたんです。なんか下がってる?ゲーム画面を見ると、オブジェクトのカウントは増えているのに、箱の中身が少ないような......。思って『Hierarchy』ウィンドウからオブジェクトのTransformを確認すると、Positionにe+10の文字が。10の10乗メートル先ってあんた。箱の中を飛び出して火星あたりまで飛んでいったようです。箱の中のオブジェクトが減った結果、進路上にStaticなColliderが存在するオブジェクトが減少。その結果計算量が減り、最終的に処理時間が減少したみたい。思ってましたが、負荷かかり過ぎるとすり抜けてますね。壁との衝突も検知するし、Rigidbodyをアタッチしたオブジェクト同士の衝突も検知します。コンソールへの出力は以下のようになりました。見事に1FPSまで到達して満足です。30FPSを下回るまでのオブジェクト数も『Continuous』より少し早いですね。1FPSまで落ちましたProfilerでは、以下のようになっていました。ピークは1096msで見事に1FPSを割っています。悪夢めいた重さ177個のオブジェクト毎に、進路上のStaticなColliderと、DynamicなColliderを計算しているため、地獄のような計算量が発生することに。衝突検知の観点では一番優秀なモードですが、パフォーマンスはトレードオフです。今回のケースでは狭い箱の中で衝突をさせていることから、過度に計算量が上がっているようにも見えます。進路上に他のオブジェクトがなければ多分計算もそんなに多くならないはず。障害物の少ない屋外とかならここまで重くはならないと思います。『Continuous』と同じようにしばらく放置してみたら、だんだんと処理時間が減ってきました。箱の中のオブジェクトが減ってきたんだろうなーとTransformを見てみたら案の定ここではないどこかにいました。彼方に箱の中を見れば、気体分子は13個しかいません。残りの1139個は箱の外に旅立ちました。少なすぎ!1FPSまで下がった後に処理時間は回復したものの、『ContinuousDynamic』の機能は失われたと言ってもいいくらい衝突を検知してませんね。処理時間が増え始めると一気に不安定になるので、そうなる前にオブジェクトの数を減らす必要があるかもしれません。実験結果のまとめ表にまとめると以下のようになります。数字は、フレームレート基準値を下回った時のオブジェクト数です。177今回のように、特に狭い空間にRigidbodyが密集していると計算量が多くなりますね。負荷がかかり過ぎると、『Continuous』や『ContinuousDynamic』であっても壁をすり抜けていき、本来の役目を果たせていませんでした。今回使用した大きさが1のSphereオブジェクトだと、150を超えたら危険水位、くらいの感覚でしょうか。『ContinuousDynamic』を使う場合は、オブジェクト数の管理が大事ですね。今回のまとめ衝突検知モードの違いによって、パフォーマンスにどのような影響が出るのか実験を行いました。『ContinuousDynamic』はマニュアルにも書かれている通りの重い処理なので、Profilerはよく見ておかないといけないかも。パフォーマンスと衝突検知の正確さはトレードオフ。ゲームプレイ時のストレスを考えるなら、衝突検知の正確さはある程度犠牲にするのもやむなしかなぁ。ゲーム開発の攻略チャートを作りました!「ゲームを作ってみたいけど、何から手を付けていいか分からない!」そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。投稿一覧Unityを使ってアプリを作ったり、Assetを作ったりしてる個人開発者。Unity全般ネタとAsset開発の情報を扱っています。Asset開発は日本語の情報が少ないのよね。ことで些細なネタでも情報を蓄積するのが目的です。2018.05.16UnityのRigidbodyで設定できるInterpolate(補間)について、値を変えると物体の運動がどのように変化するのかを実験しています。2018.06.04UnityでRigidbodyのAddForceやAddTorqueを使う際に指定するForceModeについて、その4種類の動きを観察しています。2018.05.12UnityのRigidbodyで設定できるMass(質量)について、値を変えると物体の運動がどのように変化するのかを実験しています。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。todoUnityのアセットを作ったり、スマホ向けのアプリを作っています。このブログではUnity初心者に向けたチュートリアルやテクニックを放出しています。詳しいプロフィールはこちら。お仕事の相談や現在提供中のサービスについては、こちらの『サービス内容』のページをご覧ください。Explorers_todoオンライントレーニングのサイトをオープン!エクスプラボを運営しているtodoが、より集中的にゲーム作りについて学べるオンライントレーニングのサイトをオープンしました。エクスプラボのトレーニングルーム』です。勉強したことの進捗も表示できるようになっているので、どれだけ頑張ったのかが分かるようになっています。ゲーム開発の攻略チャート』というe-bookをプレゼントしています。メルマガではゲーム開発のテクニックを中心に役立つ情報をお届けします。詳しくはこちら!お仕事の依頼はこちら!ゲーム開発のサポートも可能!エクスプラボではゲーム開発のサポートのサービスも行なっています。いう場合にオススメのプランです。詳細はこちら!もちろん、普通に開発依頼をいただいてもお手伝いします。その場合はお問い合わせへ。【Unity】ポストプロセシングを使って簡単にプロっぽいゲーム画面を作るゲームの作り方を学べるオンライン講座のサイトをオープンしました!RANKING【Unity】Mathfの切り上げ、切り捨て、偶数丸め。使い分けが大事よねMathf【Unity】ゲームといえばランダム要素。(12)作ったアプリ空とにゃんこと風船と癒し系縦スクロール避けゲーの『空とにゃんこと風船と』(TODOWORKS名義でリリース)気軽に遊べるスマートフォン向けアプリです。ボクセルアートで彩られるどこかレトロ、でも新しい世界で癒されてみませんか?ぼく、猫ですって!タップ系RPG『ぼく、猫ですって!』(TODOWORKS名義でリリース)気軽に遊べるスマホRPG。