Параметры объекта
|
|
SilverOverlord | Дата: Суббота, 30 Марта 2013, 14:35 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Делаю то, что необходимо в любой игре - параметры объектов. То есть есть, например, человек (щенок, инопланетянин, Уроборос). У него есть какие-то параметры (жизни, скорость...).. У меня есть два варианта реализовать это: 1) Банальный: Код class Human { float HP; float speed; ... }; И обращение ко всему этому настолько же банально: Но у этого варианта есть некоторые геммороички для меня, не буду их описывать. 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) Почему же? Обращение к переменной-члену - это "найти объект в памяти", "отыскать в нём переменную". Обращение к элементу массива-члена - это "найти объект в памяти", "отыскать в нём массив", "взять из него элемент". ха-ха...
|
|
| |
SilverOverlord | Дата: Суббота, 30 Марта 2013, 15:11 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Выражайтесь конкретнее.
|
|
| |
Undead | Дата: Суббота, 30 Марта 2013, 15:36 | Сообщение # 6 |
NeoAxis User
Сейчас нет на сайте
| SilverOverlord, Второй вариант ужасен. Используй первый. Цитата (SilverOverlord) есть некоторые геммороички для меня Какие? У Кармака всё норм с таким способом
В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 инструкции можно выполнить все это за один такт).
Так, что без разницы. Но первый вариант человечнее
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.9999]
Сообщение отредактировал OpenGOO - Суббота, 30 Марта 2013, 23:15 |
|
| |
Нохчи | Дата: Вторник, 02 Апреля 2013, 15:57 | Сообщение # 17 |
заслуженный участник
Сейчас нет на сайте
| Второй вариант - изврат и убожество. Во-первых, все параметры должны быть одного типа, а во-вторых при удалении и добавлении параметров будет геморрой.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |