しゅみぷろ読者になるしゅみぷろプログラミングとかこの広告は、90日以上更新していないブログに表示しています。2016-09-22WorldSpaceからUV算出するののパフォーマンスチューニングUnityTexturePaintはじめにesprog.hatenablog.com以前紹介した記事で、任意のワールド座標上の点からオブジェクト表面のUVを算出する手順を紹介しました。このまま使ったのではあまりパフォーマンスがよくないため、今回はこれを高速化しよう、というお話。以前は遅い原因を「メッシュの持つすべての三角形平面について調査している」ためだと書きました。頂点数が増えれば増えるほど、単純で線形的な探索ではボロが出ます。これを解決するために空間分割を行うべきだと思っています。プロファイラーで色々調べてみると、CG.Collectが頻発しているため、処理が重いということも発覚しました。今回はこの部分を修正してパフォーマンスを計測しました。そこまで複雑なモデルじゃなければ空間分割するまでもないくらいにはパフォーマンスが改善されました。GC.Collectが頻発する原因Mesh.verticesのgetterが呼び出してるGetAllocArrayFromChannelImpl、呼び出し回数が多いとGC.Collect頻発する。2016ちなみにtrianglesでも。2016原因はツイートの通り。Unityのフォーラムでも書かれていました。forum.unity3d.com要するに、プロパティのgetterで配列を生成して返しているため、頻繁にgetterを呼び出すとその度に配列作られるぞ、と。話は簡単で、頻繁に呼び出さない。以前と比べて、ただ変数を使いまわすようにしたのと、Meshの一部プロパティ呼び出し回数を減らしただけです。}}パフォーマンスの変化Unity標準のSphere(頂点数526)での比較。改善前はこんな感じ改善後です。並べると一目瞭然です。原因調べたらかなり楽にパフォーマンス改善できてよかった。約27000頂点で試したところ、そこまでパフォーマンスは悪くないような気がしました。空間分割にかかる初期コストを考えたらあまり必要なさそうな気がしてきました。あと出来るのは並列処理にして少しでも速くする・・・とか?追記バグ見つけました。