Вторник, 25 Июня 2019, 17:36

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Параметры объекта (Элементы массива или переменные-члены класса?)
Параметры объекта
SilverOverlordДата: Суббота, 30 Марта 2013, 14:35 | Сообщение # 1
был не раз
Сейчас нет на сайте
Делаю то, что необходимо в любой игре - параметры объектов.
То есть есть, например, человек (щенок, инопланетянин, Уроборос). У него есть какие-то параметры (жизни, скорость...).. У меня есть два варианта реализовать это:
1) Банальный:
Код

class Human
{
     float HP;
     float speed;
     ...
};

И обращение ко всему этому настолько же банально:
Код

hum.HP-=d;
speed=5;

Но у этого варианта есть некоторые геммороички для меня, не буду их описывать.
2) Есть у меня альтернативный вариант, в котором этих геммороичек нет. Но я боюсь, что он может ударить по быстродействию:
Код

class Human
{
     float params[NUMBER_OF_PARAMS];
};

И обращение ко всему этому:
Код

hum.params[PARAM_HP]-=d;
hum.params[PARAM_SPEED]=5;


Насколько этот вариант убивает быстродействие?
DemerionДата: Суббота, 30 Марта 2013, 15:04 | Сообщение # 2
был не раз
Сейчас нет на сайте
Цитата (SilverOverlord)
Насколько этот вариант убивает быстродействие?

Так, возможно, даже быстрее будет.
SilverOverlordДата: Суббота, 30 Марта 2013, 15:06 | Сообщение # 3
был не раз
Сейчас нет на сайте
Почему же?
Обращение к переменной-члену - это "найти объект в памяти", "отыскать в нём переменную".
Обращение к элементу массива-члена - это "найти объект в памяти", "отыскать в нём массив", "взять из него элемент".
DemerionДата: Суббота, 30 Марта 2013, 15:08 | Сообщение # 4
был не раз
Сейчас нет на сайте
Цитата (SilverOverlord)
Почему же?
Обращение к переменной-члену - это "найти объект в памяти", "отыскать в нём переменную".
Обращение к элементу массива-члена - это "найти объект в памяти", "отыскать в нём массив", "взять из него элемент".

ха-ха... dry
SilverOverlordДата: Суббота, 30 Марта 2013, 15:11 | Сообщение # 5
был не раз
Сейчас нет на сайте
Выражайтесь конкретнее.
UndeadДата: Суббота, 30 Марта 2013, 15:36 | Сообщение # 6
NeoAxis User
Сейчас нет на сайте
SilverOverlord, Второй вариант ужасен. Используй первый.
Цитата (SilverOverlord)
есть некоторые геммороички для меня

Какие?
У Кармака всё норм с таким способом biggrin


Вcем зла.
SilverOverlordДата: Суббота, 30 Марта 2013, 15:42 | Сообщение # 7
был не раз
Сейчас нет на сайте
Не буду описывать их, это связано с некоторыми страшными системами...
UndeadДата: Суббота, 30 Марта 2013, 15:47 | Сообщение # 8
NeoAxis User
Сейчас нет на сайте
Цитата (SilverOverlord)
Не буду описывать их, это связано с некоторыми страшными системами...

Да ладно. Мог бы и показать.
А вобще сачай ID Tech 4(doom 3 engine), да посмотри, как там устроено.


Вcем зла.
SilverOverlordДата: Суббота, 30 Марта 2013, 15:48 | Сообщение # 9
был не раз
Сейчас нет на сайте
Лень качать, можно это описать в двух словах?
UndeadДата: Суббота, 30 Марта 2013, 15:54 | Сообщение # 10
NeoAxis User
Сейчас нет на сайте
Цитата (SilverOverlord)
Лень

С этим в геймдев нельзя
Цитата (SilverOverlord)
можно это описать в двух словах

Нет.


Вcем зла.
SilverOverlordДата: Суббота, 30 Марта 2013, 15:59 | Сообщение # 11
был не раз
Сейчас нет на сайте
Переформулирую свой пост:
Я не вижу смысла тратить время на то, чтобы разбираться в этом. Насколько я понял, вы в этом разбираетесь. Не могли бы вы описать мне, в чём суть этого.
ArchidoДата: Суббота, 30 Марта 2013, 16:06 | Сообщение # 12
Сэнсэй
Сейчас нет на сайте
Цитата (SilverOverlord)
Насколько этот вариант убивает быстродействие?

В первом случае обращаемся к памяти [адрес объекта + положение параметра в классе], во втором [адрес объекта + Idx в массиве]. Если во втором варианте будет больше чем один параметр, то к вычислению адреса добавится еще одно сложение (будет их два, хотя если индекс массива известен на этапе компиляции - то одно сложение и останется), что современные процессоры даже не заметят (с помощью LEA инструкции можно выполнить все это за один такт).

Так, что без разницы. Но первый вариант человечнее smile


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)

Сообщение отредактировал Archido - Суббота, 30 Марта 2013, 16:08
UndeadДата: Суббота, 30 Марта 2013, 16:07 | Сообщение # 13
NeoAxis User
Сейчас нет на сайте
Цитата (SilverOverlord)
Я не вижу смысла тратить время на то, чтобы разбираться в этом.

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


Вcем зла.
SmalltalkДата: Суббота, 30 Марта 2013, 16:49 | Сообщение # 14
был не раз
Сейчас нет на сайте
Цитата
У Кармака всё норм с таким способом

Код
class idInventory {
public:
  int      maxHealth;
  int      weapons;
  int      powerups;
  int      armor;
  int      maxarmor;
  int      ammo[ AMMO_NUMTYPES ];
  int      clip[ MAX_WEAPONS ];
  int      powerupEndTime[ MAX_POWERUPS ];

#ifdef _D3XP
  RechargeAmmo_t   rechargeAmmo[ AMMO_NUMTYPES ];
#endif

и так далее...
SilverOverlordДата: Суббота, 30 Марта 2013, 19:39 | Сообщение # 15
был не раз
Сейчас нет на сайте
Это собственно и есть первый способ.
Попробую описать вам, что за "страшные системы" я хотел сделать, для которых удобен второй.
Некоторые параметры (как сила атаки, скорость, защита и т.п.) могут меняться под действием разных факторов, как, например, ношение брони, оружия, различные заклинания...
Я хочу это реализовать так: к каждому параметру, который может так изменяться, пристраивается массив модификаторов. Модификатор представляет из себя структуру типа "+4 к этому параметру". При этом итоговое значение параметра есть начальное значение плюс сочетание модификаторов.
И если параметры лежат в массиве, пристраивать к ним модификаторы удобнее.
OpenGOOДата: Суббота, 30 Марта 2013, 22:18 | Сообщение # 16
почти ветеран
Сейчас нет на сайте
В общем, протестировал оба варианта вот результат в сек.

Первый проход

Test1 6.343
Test2 6.344
100.016%

Второй проход

Test1 6.343
Test2 6.328
99.7635%

1 000 000 объектов прогонял по 1000 раз VC 2010 Release -O2 WinXP SP3 2x1.66 512MB

Это 1000 объектов прогонял по 1 000 000 раз

Test1 1.843
Test2 1.766
95.822 %

Test1 1.828
Test2 1.781
97.4289 %


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.1772]


Сообщение отредактировал OpenGOO - Суббота, 30 Марта 2013, 23:15
НохчиДата: Вторник, 02 Апреля 2013, 15:57 | Сообщение # 17
заслуженный участник
Сейчас нет на сайте
Второй вариант - изврат и убожество. Во-первых, все параметры должны быть одного типа, а во-вторых при удалении и добавлении параметров будет геморрой.

Многие вопросы по Windows отпадут, если посмотреть тут
Форум игроделов » Программирование » C/C++ » Параметры объекта (Элементы массива или переменные-члены класса?)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2019 Рейтинг