Конгер Д.
Физика для разработчиков компьютерных игр
стр. 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, то оператор присваивания уменьшает значение счетчика ссылок в объекте-получателе. Это необходимо сделать, поскольку после присваивания объект-получатель будет обращаться к другим данным — к тем же, к которым обращается объект-источник.








Новости
Аниме-трейлер Heroes of the Storm посвящён механическим обликам героев
Blizzard выпустила обещанные вместе с появлением в Heroes of the Storm огнемётчика Блэйза новые легендарные механизированные облики нескольких героев: Тираэля, Регара, Абатура и Дехаки.
45-минутная запись геймплея Metal Gear Survive
Японское подразделение IGN представило публике 45-минутную запись геймплея Metal Gear Survive – последней части знаменитой серии, а также первой, в создании которой не принимал участие Хидео Кодзима.