Конгер Д.
Физика для разработчиков компьютерных игр
стр. 156

Создавая объект класса d3d_mesh, программа вызывает конструктор этого класса. Этот конструктор приведен в строках 1-6 листинга 6.6. Все, что делает конструктор - создает объект класса mesh_data и сохраняет его адрес в элементе данных meshData. Как уже говорилось ранее, конструктор класса mesh_data инициализирует все элементы данных и присваивает элементу referenceCount значение 1. Затем программа может загружать и отображать модель.

П реду п режден ие

Чтобы сконцентрироваться на подсчете ссылок и рендеринге моделей, я не добавил в конструктор класса d3d_mesh никаких механизмов обнаружения и обработки ошибок. Никогда не поступайте так в реальных играх -это почти наверняка приведет к неработоспособности этих игр. В последующих главах мы добавим обработку ошибок в конструктор.

Конструктор копирования и оператор присваивания позволят использовать одну и ту же модель нескольким объектам одновременно. Конструктор копирования прост; он создает новый объект, и нет вероятности того, что создаваемый объект уже связан с какой-то моделью. Поэтому конструктор копирования просто помещает в указатель meshData в создаваемом объекте адрес из такого же указателя в исходном объекте. При этом нужно увеличить значение в элементе referenceCount, поскольку к данным начинает обращаться еще один объект.

Предположим, что программа объявляет три объекта класса d3d_mesh, названные meshl, mesh2 и mesh3. Теперь представим, что в объект meshl загружена модель. После этого выполняется такой оператор:

mesh3 = mesh2 = meshl;

Для выполнения этого оператора вызывается оператор присваивания класса d3d_mesh. Код этого оператора приведен в строках 15-38 листинга 6.6. Задача, стоящая перед оператором, сложнее, чем стоящая перед конструктором копирования. Во-первых, может оказаться, что объект-источник и объект-получатель — это один и тот же объект. Проще говоря, программа может содержать оператор вроде

meshl = meshl;

Да, таких операторов быть не должно, но, тем не менее, они встречаются. Оператор if в строке 19 листинга 6.6 предотвращает выполнение оператором присваивания всех действий, если объект-источник и объект-получатель уже обращаются к одному и тому же объекту класса mesh_data.

Если объект-источник и объект-получатель обращаются к разным объектам класса mesh_data, то оператор присваивания уменьшает значение счетчика ссылок в объекте-получателе. Это необходимо сделать, поскольку после присваивания объект-получатель будет обращаться к другим данным — к тем же, к которым обращается объект-источник.








Новости
В PUBG вышла новая карта «Санок»
Bluehole не один месяц тестировала третью карту для PUBG, и сегодня тропическая миниатюрная карта «Санок» наконец-то вышла на общих серверах.
В Warface добавили режим «Королевская битва 2.0»
В Warface разработчики добавили режим «Королевская битва 2.0». Старая версия доработана, количество игроков увеличено с 16 до 32.