BlenderとUnityで作ったものをVR(Meta Quest/Oculus Link)で動かします

ブログの女の子を作る #39 オブジェクトの頂点数を減らしてUnityの負荷を下げる【Unity】

 
前回の記事では、テクスチャベイクやマテリアル共有でマテリアル数を減らすことで、Unityでキャラクターを表示する時の負荷を下げることができました。
 
テクスチャベイクをやってて思ったのは、「テクスチャが1枚になったので、もうチェック柄のための余分なメッシュ分割は必要ないのでは?」ということ。頂点数が多いほど描画負荷も上がりますので、削除した方が良さそうです。
 
そんな目でこれまでに作ったオブジェクトを見てみると、チェック柄のスカート以外にも無駄な頂点があることに気づきました。この記事では、簡単にできる範囲で頂点を削除して、キャラクターの描画負荷を下げていきます。
 
作業の結果、頂点数が2/3になってFPSを20上げることができました!かなり効果がありましたよ。



(1) 作業前の頂点数を確認しておく

いまのUnityでは、1体のキャラクターの服装を変えて、複数体を同時に表示しています。
 
キャラクターの「」や「髪の毛」の頂点数は同じですが、服装によって頂点数が違うので、それぞれの服を着た状態で頂点数を計っておきましょう。
 

UnityでTrisとVertsの値を下げたい

UnityのStatisticsでは、様々な情報を確認することができます。今回の頂点削減に関係するのは、「Tris:描画する三角形の数」と「Verts:頂点の数」です。
 
Unityの公式サイトでも、この2つの値が「グラフィックスパフォーマンスの最適化 では特に重要です。」と書いてありました。
 
値が小さいほど負荷が下がりますが、比較するものが無いので、これから計る値が多いのか少ないのか分かりません。
 
そこでネットを調べてみると、VRChatでのアップロード制限が「ポリゴン数7万」となってました。VRChatを使う予定はありませんが、VRChatはたくさんのキャラが同じステージで動くアプリケーションですので、一つの参考値になりそうです。ポリゴン数=Trisとして比較してみました。
 

1. 吊りスカート

・Tris: 237.0k
・Verts: 158.8k
吊り紐部分があるので頂点数が多いかと思ってましたが、そこそこでした。
 

2. チェック柄の青色スカート

・Tris: 218.9k
・Verts: 148.1k
スカートの中では一番頂点数が少ないです。チェック柄を作った際、メッシュ分割が少なかったからでしょうね。
 

3. チェック柄の赤色スカート

・Tris: 271.3k
・Verts: 175.4k
一番頂点数が多いスカートでした。ポリゴン数も27万とかなり多い。積極的に少なくしたい。
 

4. チェック柄の灰色スカート

・Tris: 247.5k
・Verts: 163.5k
頂点数はやや多め。
 

5. 長めのスカート

・Tris: 237.7k
・Verts: 166.2k
 
スカートが長くても頂点数はそこそこでした。
 

6. ワンピース

・Tris: 246.5k
・Verts: 182.8k
スカート部分のメッシュ数は少ないですが、リボンが2つあるので頂点数が多くなってます。
 

(2) チェック柄の青色スカートの頂点を減らす ※1/10になった

まずは、チェック柄の青色スカートの頂点を減らしていきます。
 

作業前の状態

作業前の状態です。
オブジェクトを選択して編集モードにすると、Blender画面の右下に頂点数などが表示されるので、これを確認しておきます。
 
・頂点数:5,246
・辺:10,393
・面:5,146
・三角面:10,281 ※すべての面を「三角」とした場合の数
 
スカートだけで頂点数が五千超えてますね
 

余分な頂点を削除していく

できるだけ、スカートの形が変わらないよう注意しながら、余分な頂点を削除していきます。
 
面の形は変えたくありませんので、実際には「頂点を削除」ではなく「頂点を溶解」を使います。
 
で、溶解してみたんですが、こんな形になってしまいました。。。
これはおかしい。。。
 

「限定的溶解」を使う

いろいろ試したところ、「メッシュ – クリーンアップ – 限定的溶解」を使うのが良さそうです。
 
良い感じに頂点が無くなってますね。
最大角度」の数値を変えると、溶解する頂点の範囲が変わるので、場所によって値を変えるのが良さそうです。
 
まだ作業途中ですが、これだけでもかなり頂点数が減りました!
いまの頂点数が 1,684 なので、1/3になってますね。もう少し減らせそうです。
 
更に、余分な頂点を「頂点を溶解」で削除していきます。
場所によって、どの「溶解」機能を使うかがポイントのようです。
 
たまに辺が消えてるところがあったりします。
そんな時は、ナイフツールで辺を増やしておきましょう。
 

頂点数が1/10になった!

作業が完了しました。
・頂点数:5,246 → 55191%減った
・辺:10,393 → 1,051
・面:5,146 → 500
・三角面:10,281 → 1,002
 
頂点数が91%減って、1/10になりました!
 
想像してた以上に頂点数を減らすことができました。かなり無駄な頂点があったようですね。
 

Unityで動かしてみる

頂点が減っても、Unity上での見た目や挙動がおかしければ意味がありません。
 
Unity側にインポートし直して確認してみます。
オブジェクトの頂点数が変わるので、Magica Clothの再設定が必要でした。
 
動かしてみたところ、まったく問題ありません!
これまでと同じようにスカートが滑らかに動いてくれました。良かった。。。
 


(3) チェック柄の赤色スカートの頂点を減らす ※1/10になった

同じようにして、他のスカートの頂点も減らしていきます。
 

作業前の状態

作業前の状態です。
・頂点数:5,846
・辺:11,593
・面:5,746
・三角面:11,481
 

「デシメート」モディファイアーを試してみる

限定的溶解」が意外と面倒だったので、別の方法がないか探したところ、「デシメート」モディファイアーを使う方法が見つかりました。
decimateは「間引き」という意味ですね。
 
モードは「平面」、角度制限を「10°」で実行してみましたが、スカートのチェック柄が歪んでしまいました。
頂点数は「586」に減ったので、かなり効果はありましたが。。。
 
別のモードで試してみましょう。モードを「束ねる」、比率を「0.1000」で実行してみます。
テクスチャの歪みは無さそうです。
 
頂点数も「638」と良い感じでしたが、編集モードで確認してみると、頂点の位置がすごいことに。
オブジェクトの形が変わらないように頂点を間引いてくれたのは良いんですが、もう少し規則正しい位置になって欲しかった。
 
やはりスカートは「限定的溶解」で地道に作業することにしましょう。
 

頂点数が1/10になった

作業完了です。
・頂点数:5,846 → 59090%減った
・辺:11,593 → 1,131
・面:5,746 → 541
・三角面:11,481 → 1,080
 
青いスカートとほぼ同じく、頂点数が90%減って、1/10になりました。かなりの効果ですね。
 

(4) チェック柄の灰色スカートの頂点を減らす ※3/5になった

どんどんやっていきましょう。
 
だいぶん操作にも慣れてきたので、なんか楽しくなってきましたよ。
 
・頂点数:3,465 → 1,41759%減った
・辺:6,795 → 2,690
・面:3,329 → 1,272
・三角面:6,719 → 2,661
 
削減率は59%なので、3/5ですね。
 
もっと減らすことができそうなんですが、頂点を溶解するとどうしてもテクスチャが歪んでしまうので、これくらいで削減を止めてます。
何か良い方法があればよいのですが。
 


(5) 長めのスカートの頂点を減らす ※1/4になった

長めのスカートです。
 
頂点が集まってるところは「マージ」で1点に結合するのも良いですね。
 
作業完了です。
 
・頂点数:2,479 → 60376%減った
・辺:4,882 → 1,162
・面:2,398 → 559
・三角面:4,769 → 1,106
 
 
削減率は76%なので、1/4になりました。。スカートの形によって、削減率はおおきく変わるようです。
 

(6) ワンピースの頂点を減らす ※1/3になった

ワンピースは、スカートとリボンが2つあります。合わせて作業しておきます。
 
[スカート]
 
・頂点数:2,186 → 95257%減った
・辺:4,272 → 1,823
・面:2,086 → 871
・三角面:4,179 → 1,749
 
[リボンその1]
・頂点数:1,272 → 28078%減った
・辺:2,541 → 407
・面:1,272 → 134
・三角面:2,542 → 546
 
[リボンその2]
・頂点数:2,088 → 44279%減った
・辺:4,158 → 642
・面:2,080 → 213
・三角面:4,160 → 858
 
合計すると、
・頂点数:5,546 → 1,67470%減った
になりました。ほぼ1/3ですね。
 


(7) 吊りスカートの頂点を減らす ※1/4になった

吊りスカートです。
 
吊り紐部分の頂点もまとめてしまいましょう。
・頂点数:2,269 → 76267%減った
・辺:4,402 → 1,426
・面:2,132 → 662
・三角面:4,266 → 1,328
 
共用のリボンもやっておきます。
 
今回は「デシメート」モディファイアーを使ってみました。リボンの場合、この機能でも頂点の位置に違和感はありませんでした。スカートとは違って複雑な形をしてるからですね。
・頂点数:2,088 → 41080%減った
・辺:4,158 → 1,204
・面:2,080 → 804
・三角面:4,160 → 804
 
合計すると、
・頂点数:4,357 → 1,17273%減った
になりました。1/4ですね。
 

(8) 髪飾りの頂点を減らす ※1/3になった

髪飾りには厚みを付けてましたが、これを止めて1枚のメッシュにします。
それだけで頂点数が半分になります。
 
見た目もそんなに変わらないようですね。
・頂点数:2,332 → 70970%減った
・辺:4,304 → 1,085
・面:1,965 → 388
・三角面:4,566 → 888
 
削減率は70%なので、ほぼ1/3ですね。
 


(9) 髪の毛の頂点を減らす ※1/2になった

髪の毛です。左半分だけを頂点削除した状態です。
頂点削除したのはツインテール部分だけ、頭の部分はそのままにしました。これ以上減らすと、頭がカクカクしそうでしたので。
 
できるだけ滑らさが残るよう注意しながら作業していきます。
・頂点数:5,426 → 3,06644%減った
・辺:10,745 → 5,995
・面:5,350 → 2,954
・三角面:10,590 → 5,856
 
削減率は44%なので、ほぼ1/2です。やはり曲面が多いと削減は難しい。
 
ちなみにですが、3Dモデルで体に関係するオブジェクトのうち、頂点削除したのはこの「髪の毛」だけです。本当は「」オブジェクトの頂点も削除したかったんですが、シェイプキーがおかしくなるので対象外にしてます。
 

(10) 靴の頂点を減らす ※1/2になった

最後のオブジェクトは「」です。
・頂点数:2,196 → 1,14148%減った
・辺:4,412 → 2,095
・面:2,209 → 958
・三角面:4,349 → 2,073
 
削減率は48%なので、1/2になりました。意外に余分な頂点が多かった。
 


(11) 頂点数が2/3になってFPSが20上がった!

これで一通りの作業が完了しました。
 
Unity側で、キャラクターにそれぞれの服を着せた状態で頂点数と負荷を確認してみましょう。
 

1. 吊りスカート

・Tris: 237.0k → 158.7k33%減った
・Verts: 158.8k → 110.5k30%減った
 
キャラクター単位で見た場合、頂点数が30%減って、2/3になりました!
ポリゴン数は15.8万、VRChatの制限「ポリゴン数7万」の2倍強にまで下がってます。
 
FPSは時間ごとに変わるので計りにくいのですが、ある瞬間を見ると「445.3FPS → 522.4FPS」と15%向上してました。結構上がってますね。
 
頂点数が減る=描画負荷が下がる=FPSが上がる」という感じです。
 

2. チェック柄の青色スカート

・Tris: 218.9k → 154.4k(29%減った)
・Verts: 148.1k → 107.0k28%減った
 
頂点数が28%減りました。
 

3. チェック柄の赤色スカート

・Tris: 271.3k → 154.8k(43%減った)
・Verts: 175.4k → 108.8k38%減った
 
頂点数が38%減りました。余分な頂点がかなり減ってます。
 

4. チェック柄の灰色スカート

・Tris: 247.5k → 162.7k(34%減った)
・Verts: 163.5k → 112.1k32%減った
 
頂点数が32%減りました。
 

5. 長めのスカート

・Tris: 237.7k → 154.9k(35%減った)
・Verts: 166.2k → 107.3k36%減った
 
頂点数が36%減りました。
 

6. ワンピース

・Tris: 246.5k → 162.0k(34%減った)
・Verts: 182.8k → 121.9k33%減った
 
頂点数が33%減りました。
どのキャラクターでも、頂点数が11~12万くらいに減ったようです。
 

頂点数が2/3になった!

1キャラ平均で見てみると、34%頂点削除できたことになります。頂点数が2/3になったので、かなりの削減ではないでしょうか。
 
もっと削減できそうな個所はありますが、今回はできるだけ3Dモデルの形を変えず、簡単にできる個所をターゲットにしましたので、まずはこれくらいで十分でしょう。
 

「背景あり+10人同時」で20FPS上がった

次に、Terrainや建物を表示し、キャラクターを10人動かした状態でFPSを計ってみます。
前回の記事でやった「テクスチャベイクによるマテリアル統合とマテリアルの共通化」と今回の「頂点削除」の結果になります。
 
FPSを確認してみると、60~65FPSくらい出るようになってました!
 
これまでは40~45FPSくらいだったことを考えると、20FPSほど改善したことになります。
思った以上に効果があってうれしい。
 

まとめ 

3Dモデルの頂点数を減らすことで、描画負荷を下げることができました。
 
Blenderでモデリングしてる時は、頂点数はあまり考えてませんでしたが、かなり負荷に影響があることが分かりました。
これからモデリングする時は、無駄な頂点はできるだけ作らないよう注意したいと思います。
 
スポンサーリンク

コメント

  • トラックバックは利用できません。

  • コメント (0)

  1. この記事へのコメントはありません。

ブログの女の子を作る #38 テクスチャベイクとマテリアル共有でUnityの負荷を下げる【Unity】

ブログの女の子を作る #40 キャラが見えない時はMagicaClothを止めてUnityの負荷を下げる【Unity】


最近のコメント

だーしゅ
IT関係のお仕事してます。
3Dモデルの女の子は「ブログノ・スージー」。VRは楽しいですね。

[当ブログについて]