
予めキャッシュはするけどどこかのタイミングでは生成しないといけません。
試しに実験してみて、15万個程度のCubeの生成は1~2秒、20万個前後だと画像のようなエラーが出たり、
2~3分待っても止まったまま、なんてことにもなりました。
モバイルの場合は性能の違いでもっと限界の個数が少なかったり、
複雑なGameObjectの場合はさらに時間がかかったりしますか?
また、その解決策は何かありますか?
使用したコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using UnityEngine; using System.Collections; public class InstantiateTest : MonoBehaviour { public GameObject cPref; // Use this for initialization void Start () { float check_time;// = Time.realtimeSinceStartup; for (int k = 0; k < 15; k++) { check_time = Time.realtimeSinceStartup; for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { Instantiate (cPref, new Vector3 (i * 6.0F, j * 6.0F, k * 10F), Quaternion.identity); } } check_time = Time.realtimeSinceStartup - check_time; Debug.Log ("check time Cube : x" + k + " ten thousand :" + check_time.ToString ("0.00000")); } } // Update is called once per frame void Update () { } } |
エラーログを見ると物理エンジンが関係してそうです。
コライダー抜きで描画だけならdrawmesh関数の方が高速です。
15万とか20万とかいう数字を見直すことを考えるべきでしょう。
PCに比べてモバイルは限界が低いので、ターゲットによっては現実的な数字ではありません。
実際にどんな感じなのかはAndroid向けにビルドをしてみるとわかるかと思います。
解決策は、そのオブジェクトが瞬間的に全部必要なのか、順番に15万必要なのかによっても変わると思います。
解決策は、そのオブジェクトが瞬間的に全部必要なのか、順番に15万必要なのかによっても変わると思います。
個人的には上記のオブジェクトのキャッシュの方法が知りたいです
キャッシュする方法は、いわゆるオブジェクトプーリングです。
オブジェクトをの破棄と生成を毎回繰り返すのではなく、破棄の代わりに非アクティブにしておいて
適当なコンテナ(StackでもListでも配列でも)に入れておきます。
生成のタイミングでそのコンテナにオブジェクトがあればそれを再利用、無ければ新規に生成といった感じです。