Четверг, 16 Августа 2018, 11:49

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [309]
Статьи об общих понятиях связанных с созданием игр.
Программирование [69]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [123]
Статьи о программах для создания игр, уроки и описания.
Софт [27]
Различные программы, в том числе в помощь игроделам.
2D-графика [11]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [10]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [4]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [81]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [63]
Статьи, которые не вошли в определённые разделы.
Наш опрос
Что в своих играх используете от стороннего производителя?
Всего ответов: 9313
Главная » Статьи » Программирование

С++. Работа с памятью
Здравствуйте! Одна из основополагающих в разработке игр - это оптимизация, и если вы разрабатываете более-менее крупный проект, вы должны о ней задуматься. Сегодня мы рассмотрим один из способов оптимизации - динамическое выделение памяти.

Нужно понимать, что каждая переменная занимает какой-то объем памяти, в зависимости от ее типа. Ниже представлены основные типы переменных, диапазон их значений и занимаемая память.

ТИП | ДИАПАЗОН | ПАМЯТЬ(БАЙТ)

bool | 0 - 255 | 1
char | 0 - 255 | 1
short int | -32 768 - 32 767 | 2
unsigned short int | 0 - 65 535 | 2
int | -2 147 483 648 - 2 147 483 647 | 4
unsigned int | 0 - 4 294 967 295 | 4
long int | -2 147 483 648 - 2 147 483 647 | 4
float | -2 147 483 648.0 - 2 147 483 647.0 | 4
long float | -9 223 372 036 854 775 808 .0 - 9 223 372 036 854 775 807.0 | 8
double | -9 223 372 036 854 775 808 .0 / 9 223 372 036 854 775 807.0 | 8




И так, выше мы ознакомились с диапазоном значений переменных и занимаемую ими память. Но как же нам с этой памятью работать? В этом нам помогут указатели, а так же операторы new и delete. Для начала, что же такое указатели? Указатель - это переменная, значением которого является адрес ячейки памяти. Как известно, у каждой переменной есть свой индивидуальный адрес памяти, которую она занимает. взять этот адрес мы можем при помощи оператора взятия адреса '&'. Для наглядности, рассмотрим код ниже.

Работа с памятью


Мы создали целочисленную переменную и инициализировали ее. Далее, в первой строке консоли мы вывели ее значение(10), а затем и адрес(0018FCB8).




Теперь, когда мы мы знакомы с адресами памяти и указателями, научимся их использовать во благо игростроя. Для чего же они в нем используются? Для примера, возьмем такую игру, как GTA. Все мы наверняка в нее играли, да и пример получится очень наглядным.
Если стоять на одном месте, то NPC будут проходить мимо главного героя, и, отойдя на определенную дистанцию, исчезнут(выгрузятся). Если бы они просто выгружались, тогда оптимизацией это служило бы слабой, так как у нас остались переменные от них, которые занимают какую-то память. Поэтому, эту память нужно динамически создавать и очищать.
Рассмотрим код ниже.

Работа с памятью


В нем есть создание переменной с выделенной под нее память(int *a = new int();), инициализировали ее(*a = 10;), использовали(cout << "*a = " << *a << endl;) и удалили(delete a;). Таким образом, использовав переменную и потеряв в ней надобность, мы удалили ее и очистили память для новых переменных. Аналогичным образом работает и вышеприведенный случай с GTA: создается некая переменная(-ые) или массив с информацией о NPC(появление NPC в радиусе действия), она(-и) используется(взаимодействие с игроком) и удаляются(после того, как NPC умер и исчез/вышел за радиус действия/...).

На этом все, надеюсь, эта статья была кому-то полезна и интересна(если так, то мы можем продолжить разбирать эту и схожие темы).

Категория: Программирование | Добавил: AO (02 Июня 2016)
Просмотров: 1835 | Комментарии: 4 | Рейтинг: 2.3/3 |
Теги: ОЗУ, Память, Код, GTA, Работа с памятью, Разработка игр, оптимизация, Программирование, ЯП, C++
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «С++. Работа с памятью», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 4
+0-
4 Dyzzet   (23 Июня 2016 08:01)
Рецензия

Общий уровень низкий. Отмечу ошибки и опечатки при небольшом объёме материала. Автор не владеет терминологией («память нужно... создавать»). Код и результаты работы отображены на снимке экрана, что затрудняет чтение. (Второй снимок дублирует первый, это ошибка.)

«Один из способов оптимизации — динамическое выделение памяти».
Сперва надо договориться о том, что оптимизируем. Динамическое выделение памяти имеет свои недостатки и достоинства. Критерий не озвучен! Дальше смысла нет что-то обсуждать.

«Представлены основные типы переменных, диапазон их значений и занимаемая память».
Неверно. В C++ эти значения зависят от конкретной платформы.

Но как же нам с этой памятью работать? В этом нам помогут указатели...
Совсем не обязательно!

Непонятно откуда взялся пример про ГТА, в чём автор позже признаётся: «На самом деле я понятия не имею, каким образом NPC и их память реализованы в GTA, но вышеуказанный способ вполне мог сгодиться для этого».

Резюме: много фактических ошибок, ошибки в терминах, несвязное изложение, отсутствие доказательной базы.

+1-
3 Lertmind   (16 Июня 2016 23:50)
Lertmind
Цитата
Сегодня мы рассмотрим один из способов оптимизации - динамическое выделение памяти.
Динамическое выделение памяти к оптимизации не имеет никакого отношения.
Наоборот, ради оптимизации избегают частого использования new/delete:
* Есть шаблон/паттерн программирования/проектирования Объектный пул (Object pool), где память выделяется заранее, потому что постоянные выделения памяти в кучи (new/delete) ухудшают производительность.
* Иногда очередь реализуют не через список узлов в куче (связанный список), а через массив, пример: http://gameprogrammingpatterns.com/event-queue.html#a-ring-buffer.
Также замечу, что надо избегать явного использования new/delete и использовать только в низкоуровневом коде, в обычном коде используют умные указатели. Ссылка по теме https://habrahabr.ru/company/aligntechnology/blog/283352/.

+1-
1 LP   (04 Июня 2016 20:18)
LPДумаю на теме указателей и операций new, delete стоит останавливаться более подробно. А пример с НПС хорош)

+0-
2 AO   (05 Июня 2016 11:34)
AOОбязательно более подробно ее рассмотрим, еще статьи по этой теме будут smile

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • Linderdaum
  • J.U.R.P.E.
  • Shoot 'Em Up Kit
  • ReMooD
  • Doom Classic iOS
  • HiAsm
  • EDGE
  • Castle Game Engine
  • Defold
  • Аперо
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2018 Рейтинг