あーさん日記

https://akkera102.sakura.ne.jp/gbadev/ の中の人

終末移植19

オープニング処理以外終わりました・・・。4ヒロインとも全てエンディングOK。超がんばりすぎて体にダメージデカすぎ問題です、もういやすぎ。うーん、アイスでも食べて元気になろう・・・。オプションに既読無視フラグつけました。初回でも早くクリアできると思います。


アルファブレンド最適化もいい感じです。chatgptさんに聞いたらアンローリングなる最適化方法があるそうで、実際に試したらVBLANK単位(!)で93から86に変わりました。8ですよ!!8フレームも!!!奥さん、こりゃすげーぜ、ふははは。ループを変えるだけでこんなにも変わるんですねー。

IWRAM_CODE void Mode3VramEffCls(s32 cnt, u8* pEff)
{
	u16* pSrc = Mode3.buf + (Mode3.idx ^ 1) * MODE3_MAX_SCN_SIZE;
	u16* pDst = Mode3.buf + (Mode3.idx    ) * MODE3_MAX_SCN_SIZE;
	u16* pVrm = ((u16*)VRAM) + ((240 - 212) / 2);

	pEff += 212 * 160 * cnt;

	s32 x, y;
	s32 i;

	// 4ピクセル単位アンローリング
	// 渦巻CLSで VBLANK 93(type2) -> 86(type1)に軽減
	for(y=0; y<160; y++)
	{
// type1
		for(x=0; x<212; x+=4)
		{
			for(i=0; i<4; i++)
			{
				u32 eff = pEff[x+i];

				if(eff == 0)
				{
					pVrm[x+i] = pDst[x+i];
				}
				else if(eff == 0x1F)
				{
					pVrm[x+i] = pSrc[x+i];
				}
				else
				{
					u32 src = pSrc[x+i];
					u32 dst = pDst[x+i];

					u32 rbSrc = src & 0x7c1f;
					u32  gSrc = src & 0x03e0;
					u32 rbDst = dst & 0x7c1f;
					u32  gDst = dst & 0x03e0;

					u32 rb = rbDst + (((rbSrc - rbDst) * eff) >> 5);
					u32 g  =  gDst + ((( gSrc -  gDst) * eff) >> 5);

					pVrm[x+i] = (rb & 0x7c1f) | (g & 0x03e0);
				}
			}
		}
		pSrc += 212;
		pDst += 212;
		pVrm += 240;
		pEff += 212;
	}
// type1 ここまで

/*
// type2
		for(x=0; x<212; x++)
		{
			u32 eff = pEff[x];

			if(eff == 0)
			{
				pVrm[x] = pDst[x];
			}
			else if(eff == 0x1F)
			{
				pVrm[x] = pSrc[x];
			}
			else
			{
				u32 src = pSrc[x];
				u32 dst = pDst[x];

				u32 rbSrc = src & 0x7c1f;
				u32  gSrc = src & 0x03e0;
				u32 rbDst = dst & 0x7c1f;
				u32  gDst = dst & 0x03e0;

				u32 rb = rbDst + (((rbSrc - rbDst) * eff) >> 5);
				u32 g  =  gDst + ((( gSrc -  gDst) * eff) >> 5);

				pVrm[x] = (rb & 0x7c1f) | (g & 0x03e0);
			}
		}

		pSrc += 212;
		pDst += 212;
		pVrm += 240;
		pEff += 212;
	}
// type2 ここまで
*/
}