/// <summary> /// レンダリング /// ただのレンダリングではなくすべてのスクリプトのupdateが施行されたフレーム処理最後のプログラムになるので /// 今までGPUに投げていたタスクをCPUに戻すブロッキングをいれる /// ここでCPUはGPU待ちを喰らうので、重いCPU処理はここに到達するまでに行うべき /// </summary> /// 順番は /// OnPreRenderカメラがシーンのレンダリングを開始する前 1回 /// OnRenderObjectすべてのシーンレンダリング終了後 1回 /// OnPostRenderカメラがシーンのレンダリングを終了した後 1回 /// OnRenderImage(Pro only)画面レンダリングが完了し画面画像の処理が可能になった後 1回 /// //有効なものは2つOnRenderObjectかOnGUI void OnRenderObject() { //GPU→CPUなのでブロッキングが発生する。 //まずはufoのほう float[] f2 = new float[2]; UFOE.GetData(f2); extf += ucomp.ExtForce(f2[0], f2[1]);; //外力 f2[0] = 0.0f; f2[1] = 0.0f; UFOE.SetData(f2); //次に爆発のほう RES108.GetData(res); //CPU側で判定check→位置復元、front画像の処理を //と思ったけど不具合あったのでkabePoriを全loadして比較することに if (res[0] != 0) { //elseはそもそも爆発してない kabePori.GetData(kbpori); //kabePoriはすでにカーネル側で更新されている for (int j = 0; j < Const.CO.WX * Const.CO.WY; j++) { if (kbpori[j] != kbp[j]) { int expx = j % Const.CO.WX; int expy = j / Const.CO.WX; frntcomp.DelPixcelTex(expx, expy); kbp[expx + expy * Const.CO.WX] = 255; } } //爆発しているのでapply、ほかRESのリセットも必要 frntcomp.tex.Apply(); FillMem_ui(RES108, 108, 0, 0); SE.Play_exp0(); } //もともと粒子のレンダリング前にブロッキングを↑に挟んだほうが早くなることが実験的にわかっていた //そのごいろいろリファクタして結局変わらないくらいになった。どっちかというとOnpostのほうが早そうだった //bulletsMaterial.renderQueue=4; // レンダリングを開始 //bulletsMaterial.SetPass(0); // 1万個のオブジェクトをレンダリング //Graphics.DrawProcedural(MeshTopology.Points, dtprtcomp.RYS.count); }