はじめましてエンジニアの東野です。
技術的な内容をお伝えするブログを始めます。
エンジニアチームのメンバーで不定期更新にはなりますが、ご一読いただければ幸いです。
今回は個人的に必要と感じたツールの紹介をしたいと思います。
データ局所化を意識するとデータのメモリ配置が気になってきます。
classとstructでどう配置が変わるのかイメージしにくい所もあるかと思います。
そこでUnityでメモリ位置を表示するツールを作成しました。
Gitリポジトリ
データ局所化とは
プログラムが頻繁にアクセスするデータを連続するメモリに配置して、
CPUのキャッシュメモリの利用効率を高め、全体のパフォーマンスを向上させるテクニックです。
この様なコードがあった場合に、
public class TestClassA
{
public uint m_valueA = 0xDEADBEEF;
public TestClassB m_classB = new TestClassB();
public TestClassC m_classC = new TestClassC();
}
public class TestClassB
{
public uint m_valueB = 0xDEADBEEF;
}
public class TestClassC
{
public uint m_valueC = 0xDEADBEEF;
}
public struct TestStructA
{
public uint m_valueA;
public TestStructB m_structB;
public TestStructC m_structC;
}
public struct TestStructB
{
public uint m_valueB;
}
public struct TestStructC
{
public uint m_valueC;
}
TestClassA m_classInstance = new TestClassA();
TestStructA m_structInstance = new TestStructA()
{
m_valueA = 0xDEADBEEF,
m_structB = new TestStructB { m_valueB = 0xDEADBEEF },
m_structC = new TestStructC() { m_valueC = 0xDEADBEEF },
};
classでは参照毎に離れたメモリに配置されているのに対し、
structでは連続したメモリに配置されているのが分かります。
注意点として、unsafeを多用しているため想定外のケースではエディタごと終了してしまいます。
クラス設計の際に参考にしてもらえたらと思います。