Прежде всего, если вы действительно хотите сэкономить память, не используйте структуру или класс.
byte[,,] blockTypes = new byte[16, 256, 16];
BlockMetaData[,,] blockMetadata = new BlockMetaData[16, 256, 16];
Вы хотите плотно упаковать похожие вещи в память . Вы никогда не хотите помещать байт рядом со ссылкой в структуре, если можете избежать этого; такая структура будет тратить три-семь байтов автоматически. Ссылки должны быть выровнены по словам в .NET.
Во-вторых, я предполагаю, что вы строите здесь систему вокселей. Может быть лучший способ представления вокселей, чем трехмерный массив, в зависимости от их распределения. Если вы собираетесь делать поистине огромное количество этих вещей, то храните их в неизменном октрее . Используя свойства persistence неизменяемого октри, вы можете создавать кубические структуры с квадриллионами вокселей в них, пока представляемая вами вселенная является "комковатой". То есть во всем мире существуют большие области сходства. Вы тратите немного больше времени на доступ и изменение элементов, но у вас есть способ, с которым больше элементов работает.
В-третьих, «идентификатор» - это действительно плохой способ представить понятие «тип». Когда я вижу «ID», я предполагаю, что число уникально идентифицирует элемент, а не описывает его. Попробуйте сменить имя на что-то менее запутанное.
В-четвертых, сколько элементов имеют метаданные? Вы, вероятно, можете сделать намного лучше, чем массив ссылок, если количество элементов с метаданными мало по сравнению с общим количеством элементов. Рассмотрим подход с разреженными массивами; разреженные массивы намного более компактны.