» Фантастика » » Читать онлайн
Страница 225 из 245 Настройки

Там, в прохладном полумраке, на экране нас уже дожидался плоский мир первой версии «Майнкрафта». Правда, пока что абсолютно серый, без текстур, без привычного интерфейса, без солнца на небе, вообще всего лишнего и размером 100 на 100.

— Это было сложно, но я сделал, как ты просил. — Коул с тяжелым вздохом рухнул в свое рабочее кресло.

— Ну, давай посмотрим. — Я навис над столом.

По привычке хотел было взяться за мышку, чтобы покрутить камеру, но, вовремя одумался.

— Да можно-можно, я с ней поговорил, она больше не будет кусаться. — С набитым ртом хохотнул парень.

— Ну, спасибо, ваше костейшейство, что соизволили дать доступ к периферии...

Недовольно бурча под нос, я все же с легкой опаской опустил ладонь на теплый пластик мыши. Никакого удара током не последовало. Сдвинул девайс вбок, прокручивая камеру. Мир на экране послушно крутанулся вслед за моим движением.

Хмыкнув, я потыкал клавиши на клавиатуре, заставляя камеру сделать пару шагов. Привычного покачивания от ходьбы, естественно, пока не было, но зато исправно работали прыжки и гравитация.

— Неплохо. А разрушение блоков ты уже прикрутил?

— Обижаешь. Я бы тогда не звал на тест. Правда, сделать адекватное хранение блоков в памяти мира было той еще задачкой. Пришлось повозиться со словарями и мировыми координатами. Но зато я бонусом реализовал базовую систему инвентаря. Попробуй сломать блок. Я тут уже поигрался немного, и это реально круто. Зря я сомневался. Тут же считай безграничный потенциал!

Я молча зажал левую клавишу мышки, направив прицел-крестик прямо себе под ноги. Серый блок моментально исчез, а в нижнем левом углу нолик сменился на единичку. Слегка повернув камеру, я вдавил правую кнопку мыши, и серый куб из инвентаря с легким щелчком разместился на поле, ломая идеальную гладь игрового мира.

— Нормально… А как ты, говоришь, сделал хранение этих блоков?

— Через привязку к координатам. — Охотно повторил Коул. — Игра постоянно проверяет координаты, и если они не заняты, ставит туда отдельный меш…

Я, уже внутренне готовясь к худшему, кликнул по скрипту «БлокСпавнер», быстро пробежался глазами по строкам кода и выдал долгий, удивленный присвист.

— Коул, ну ты, конечно, балбес. — Укоризненно покачал я головой. — Ты ТЗ вообще читал?

— Ну да…

— Так а какого хрена у тебя каждый отдельный блок хранится в сцене как самостоятельный Гейм обджект?! А не как перечень байтов в матрице чанка?

— Я подумал, что так будет проще и быстрее сделать. — Паренек виновато отвел глаза.

Я задумчиво воткнул вилку в мясо и откусил смачный кусок. Билд был бесспорно рабочим. Но существовала одна ма-а-аленькая, критическая проблемка. Счетчик игровых объектов в сцене, даже с учетом крошечного плоского мира размером сто на сто блоков и всего на три в глубину, показывал гордые тридцать тысяч единиц. Надо ли объяснять, сколько сил у движка на обработку каждого такого кубика? Обычный пользовательский комп уже давно бы задохнулся. Но поскольку у Коула под столом стоял буквально Святой Грааль от мира вычислительной техники, он даже легкой просадки не ощутил.

— Производительность, да? — Смекнул Коул, проследив за моим взглядом. — Я дебил.

— Даже спорить не буду. — Усмехнулся я. — Я именно поэтому и расписал тебе в документе систему оптимизации. Чтобы в нашу игру смогли поиграть обычные школьники на папиных ноутбуках, а не только ты один.

Разумеется, систему хранения блоков пришлось переделывать. Потому что стоило нам попытаться запустить билд Коула на моем рабочем ПК, как игра моментально превратилась в пошаговое слайд-шоу, заставляя кулеры видеокарты взреветь.

Поэтому на следующий день, созвонившись в ТимСпик для удобства, мы принялись пошагово реализовывать правильную систему хранения через трехмерный массив с использованием палитры чанков.

Первым делом мы ушли от отдельных игровых объектов для каждого блока. Вместо этого ввели систему перечисления типов блоков:

public enum BlockType : byte

{

Воздух = 0,

Трава = 1,

Земля = 2,

Камень = 3,

Дерево = 4,

Листва = 5,

Песок = 6,

Вода = 7

}

Теперь каждый блок, когда мы его добавим в игру, будет иметь только свой числовой ID. Эдакая пиксельная антиутопия — никаких имен, только порядковые номера.

Но шутки в сторону! Такая строгая система позволяла сжать блок до размеров одного байта в памяти. В масштабах бесконечного мира это колоссальная экономия.

Дальше мы логически поделили мир на чанки. Этакие вертикальные столбики размером 16 на 16 блоков в ширину и 256 в высоту. Затем уже их разрезали на секции (сабчанки) высотой по 16 блоков, получив кубы 16 на 16 на 16. Вот как раз эти огромные сборные блоки и стали игровыми объектами. Грубо говоря, мы запихнули 4096 блоков в один игровой объект. Вкупе с байтовым способом хранения блоков, вышла некислая такая оптимизация. Стоит снять шляпу перед Нотчем за то, что он в свое время дошел до такого способа.