/// <summary> /// 更新処理 /// デバッグにて1フレームあたりの餌やり0.09ms、計算自体は33msとなっている /// </summary> void Update() { //自分が死んだときに発生する粒子は、移流の前でないと見た目がしょぼいことになる if (((ucomp.deathcounter > 2) & (ucomp.deathcounter < 19)) & (ucomp.deathcounter % 2 == 1)) { if (ucomp.deathcounter == 3) { SE.aS.PlayOneShot(SE.exp0); } dtprtcomp.ExpRYS(ucomp.death_posx, ucomp.death_posy); } //ここで壁mapping CopyBufferToBuffer_f(kabeP, kabePori);//壁初期値をまず設定 //すべての壁objをmapping、ufo含む AnotherObj(); //マッピング情報からkabe情報を生成 bulletsComputeShader.Dispatch(kernelkabemapping, 1, Const.CO.WY, 1); //CFD解析本編 for (int loop = 0; loop < Const.CO.CFDFRAME_PAR_GAMEFRAME; loop++) { CopyBufferToBuffer_f(YU, YUN); CopyBufferToBuffer_f(YV, YVN); //veloc//ブロッキングモードoff bulletsComputeShader.Dispatch(kernelveloc, 1, Const.CO.WY, 1); CopyBufferToBuffer_f(GXd0, GXU); CopyBufferToBuffer_f(GYd0, GYU); CopyBufferToBuffer_f(GXd1, GXV); CopyBufferToBuffer_f(GYd1, GYV); CopyBufferToBuffer_f(GXd2, GXE); CopyBufferToBuffer_f(GYd2, GYE); //cip移流//ブロッキングモードoff bulletsComputeShader.Dispatch(kerneldcip0, 1, Const.CO.WY, 1); bulletsComputeShader.Dispatch(kerneldcip1, 1, Const.CO.WY, 1); bulletsComputeShader.Dispatch(kerneldcip2, 1, Const.CO.WY, 1); //過剰な渦度平滑化 //bulletsComputeShader.Dispatch(kernelVorticityReduce, 1, Const.CO.WY, 1); CopyBufferToBuffer_f(YU, YUN); //これはいる!!しかしなぜなのかはわからない CopyBufferToBuffer_f(YV, YVN); //これはいる!!しかしなぜなのかはわからない CopyBufferYE_YEN(); //YE←YEN//これはただのコピーではない。熱量減量、噴射時マッピング //粘性//ブロッキングモードoff //CopyBufferToBuffer_f(YU, YUN); //CopyBufferToBuffer_f(YV, YVN);//もしかしたらnewgradのためいるのかもしれない //CopyBufferToBuffer_f(GXd0, YUN); //CopyBufferToBuffer_f(GYd0, YVN); //bulletsComputeShader.Dispatch(kernelnensei0, 1, Const.CO.WY, 1); //bulletsComputeShader.Dispatch(kernelnensei1, 1, Const.CO.WY, 1); //DIV//ブロッキングモードoff bulletsComputeShader.Dispatch(kerneldiv, 1, Const.CO.WY, 1); //pressure//ブロッキングモードoff for (int i = 0; i < (refer.POISSONLOOPNUM + BoolToInt(stgmngrcomp.fadeinflg < 2 && loop == 0) * 1000); i++) { bulletsComputeShader.Dispatch(kernelpressure0, Const.CO.WX * Const.CO.WY / 128 / 2, 1, 1); bulletsComputeShader.Dispatch(kernelpressure1, Const.CO.WX * Const.CO.WY / 128 / 2, 1, 1); } //ufoのうける外力 //UFOのうける外力計算。1スレッドで144ループしてもらう。リダクション面倒くさいしどうせメモリ律速になるので・・ bulletsComputeShader.SetFloat("OBJ0POSX", ucomp.ufo_pos.x); bulletsComputeShader.SetFloat("OBJ0POSY", ucomp.ufo_pos.y); bulletsComputeShader.Dispatch(kernelufopressure, 1, 1, 1); //rhs//ブロッキングモードoff bulletsComputeShader.Dispatch(kernelrhs, 1, Const.CO.WY, 1); //newgrad//ブロッキングモードoff bulletsComputeShader.Dispatch(kernelnewgrad, 1, Const.CO.WY, 1); bulletsComputeShader.Dispatch(kernelnewgrad2, 1, Const.CO.WY, 1); //粒子移流ブロッキングモードoff//一定フレームで更新 if (loop % refer.RYRATIO == refer.RYRATIO - 1) { dtprtcomp.UpdateOFST(); //粒子場所一部初期化ブロッキングモードoff if ((Input.GetButton("Jump")) & (stgmngrcomp.keyflg > 0)) { //粒子場所、噴射している場合赤い粒子発生ブロッキングモードoff NozzleFire(); } //粒子移動処理ブロッキングモードoff bulletsComputeShader.Dispatch(kernelryuusi, dtprtcomp.RYS.count / 64, 1, 1); } } //爆発判定ブロッキングモードoff bulletsComputeShader.Dispatch(kernelexpkabe, 1, Const.CO.WY, 1); //あとのブロッキングモードonになる処理は都合によりon Renderingで cnt++; extf *= 0.96f; }