Unityで三角関数のテーブル化

UnityでSTGの敵弾発射処理を作ろうとした際に、レガシーな技術である「三角関数のテーブル化」は今でも高速化の手段として有効なのか?という疑問が沸き、それを検証すべく作ったものです。
当方の環境だとMathfの関数を普通に呼ぶのに比べて約60%程度の処理時間で済むみたいです。もちろん環境によって差はあると思いますが、ある程度目的に適ったものが出来たと思います。
(入力パラメータや戻り値の関係で、Mathfの関数からそのまま置き換えられるようにはなっていないのでご留意を。)

コードでは1周の分周比(roundDivision)を1024にしています。ここを細かくすればもっと精度を上げることができますが、テーブルに要するメモリが倍増していくので、2Dゲームに使う程度であればこの辺までで十分かな、と思います。

Atan2のテーブル化の考え方がわからなかったのですが、ここのページが参考になりました。
https://mitoshiropj.blogspot.com/2013/08/blog-post_9340.html
コードもここに掲載されているものをベースに、必要な修正、カスタマイズを加えたものです。

UnityでSTGの敵弾発射処理を作ろうとした際に、レガシーな技術である「三角関数のテーブル化」は今でも高速化の手段として有効なのか?という疑問が沸き、それを検証すべく作ったものです。
当方の環境だとMathfの関数を普通に呼ぶのに比べて約60%程度の処理時間で済むみたいです。もちろん環境によって差はあると思いますが、ある程度目的に適ったものが出来たと思います。
(入力パラメータや戻り値の関係で、Mathfの関数からそのまま置き換えられるようにはなっていないのでご留意を。)

コードでは1周の分周比(roundDivision)を1024にしています。ここを細かくすればもっと精度を上げることができますが、テーブルに要するメモリが倍増していくので、2Dゲームに使う程度であればこの辺までで十分かな、と思います。

Atan2のテーブル化の考え方がわからなかったのですが、ここのページが参考になりました。
https://mitoshiropj.blogspot.com/2013/08/blog-post_9340.html
コードもここに掲載されているものをベースに、必要な修正、カスタマイズを加えたものです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//
public class DeltaFunc : MonoBehaviour
{
private float[] sinTable; //
public const int roundDivision = 1024; // 360°
private const int roundDiv3_4 = roundDivision * 3 / 4;
private const int roundDiv1_2 = roundDivision / 2;
private const int roundDiv1_4 = roundDivision / 4;
private Vector2 sinCos; // GetSinCosXY
private float[] atanTable; //
private const int atanDevide = roundDiv1_4; // 0-45°
//————————————————————
//
//————————————————————
void Start () {
//Sin090°0(1/4 +1)
sinTable = new float[roundDiv1_4 + 1];
for (int i = 0; i < sinTable.Length; i++)
{
float rad = 360 * i / roundDivision * Mathf.Deg2Rad;
sinTable[i] = Mathf.Sin(rad);
}
//Atan045°atanDevide
atanTable = new float[atanDevide + 1];
for (int i = 0; i <= atanDevide; i++)
{
float r = (float)i / atanDevide;
atanTable[i] = Mathf.Atan(r)* Mathf.Rad2Deg;
}
}
//————————————————————
// SinCos
// roundDivision
// Vector2ysinxcos
//————————————————————
public Vector2 GetSinCos(int direction)
{
// direction0(-1)
if (direction <= roundDiv1_4) // 0°<= <=90°
{
sinCos.y = sinTable[direction];
sinCos.x = sinTable[roundDiv1_4 – direction];
}
else if (direction <= roundDiv1_2) // 90°< <=180°
{
sinCos.y = sinTable[roundDiv1_2 – direction];
sinCos.x = sinTable[direction – roundDiv1_4] * -1;
}
else if (direction <= roundDiv3_4) // 180°< <=270°
{
sinCos.y = sinTable[direction – roundDiv1_2] * -1;
sinCos.x = sinTable[roundDiv3_4 – direction] * -1;
}
else // 270°< <360°
{
sinCos.y = sinTable[roundDivision – direction] * -1;
sinCos.x = sinTable[direction – roundDiv3_4];
}
return sinCos;
}
//————————————————————
//
// dYYdXX
// 0360°atan2
//————————————————————
public float GetAtan2(float dY, float dX)
{
// YX
if (dY == 0 && dX == 0) return 0;
if (dY >= 0) // or
{
if (dX >= 0) //
{
if (dX >= dY) // 0-45°
{
return atanTable[(int)(dY / dX * atanDevide)];
}
else // 45-90°
{
return 90.0f – atanTable[(int)(dX / dY * atanDevide)];
}
}
else //
{
if (dY >= -dX) // 90-135°
{
return 90.0f + atanTable[(int)(-dX / dY * atanDevide)];
}
else // 135-180°
{
return 180.0f – atanTable[(int)(dY / -dX * atanDevide)];
}
}
}
else // or
{
if (dX < 0) //
{
if (-dX >= -dY) // 180-225°
{
return 180.0f + atanTable[(int)(-dY / -dX * atanDevide)];
}
else // 225-270°
{
return 270.0f – atanTable[(int)(-dX / -dY * atanDevide)];
}
}
else //
{
if (-dY >= dX) // 270-315°
{
return 270.0f + atanTable[(int)(dX / -dY * atanDevide)];
}
else // 315-360°
{
return 360.0f – atanTable[(int)(-dY / dX * atanDevide)];
}
}
}
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX