[Вопрос] Тип переменной - Player
|
|
FatalBlade | Дата: Среда, 30 Ноября 2011, 02:04:33 | Сообщение # 1 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Переменная типа Player, это всего лишь индекс, целочисленное число, но в ВЕ есть специальный тип переменной Player. Вот 2 примера, дающие в итоге нам пользователям 1 и тот же результат:
Code local unit u = GetTriggerUnit() local integer p = GetPlayerId(GetOwningPlayer(u)) + 1 Здесь переменная р - это целочисленное число. Индекс игрока.
Code local unit u = GetTriggerUnit() local player p = GetOwningPlayer(u) Здесь переменная р - это не индекс игрока а сам игрока. И видимо это не одно и то же.
Я хотел сохранить в Хэш игрока, написав вот так - call SaveInteger(udg_Hash, id, 0, GetOwningPlayer(u)), и он выдал ошибку. Затем я написал вот так - call SaveAgentHandle(udg_Hash, id, 0, GetOwningPlayer(u)), и ошибок не было. Значит переменная типа Игрок сохраняется как Хэндл, а значит она утечна. Да и кроме того обнуляется так же как и все хэндлы - set p = null.
Так значит Игрок = утечка? З.Ы. Я редко пользуюсь переменными типа игрок, в основном только номерами игроков, но всё же интересно.
|
|
|
|
Borodach | Дата: Среда, 30 Ноября 2011, 02:47:56 | Сообщение # 2 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| FatalBlade, ты в целое сохранял игрока, а не его номер. Сохраняется == call SavePlayerHandle(udg_Hash, id, 0, GetOwningPlayer(u)). Читал что игроки безутечны... и обнулять не обязательно
Karamba
|
|
|
|
FatalBlade | Дата: Среда, 30 Ноября 2011, 03:14:47 | Сообщение # 3 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Но как они могут быть безутечны, если это Quote (Borodach) SavePlayerHandle
Сообщение отредактировал FatalBlade - Среда, 30 Ноября 2011, 03:15:14 |
|
|
|
Ty3uK | Дата: Среда, 30 Ноября 2011, 07:22:40 | Сообщение # 4 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Игроки утечны, обнуляй их всегда. Я интересовался у Дуоса и Николаса. Т.к. игрок имеет хэндл- он объект, а объект висит в памяти, пока ты его не обнулишь
|
|
|
|
SirNikolas | Дата: Среда, 30 Ноября 2011, 14:43:00 | Сообщение # 5 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Игрок не имеет хэндла У игроков всегда одинаковые handle'ы, т. к. игроков всегда 0x10 (16) штук. Они ниоткуда не появляются и никуда не исчезают. Однако есть предположение, что из-под необнуленных локалок не освобождается память. Т. о. ты теряешь по четыре байта на каждом вызове функции. Мелочь, но все-таки.
Сообщение отредактировал SirNikolas - Среда, 30 Ноября 2011, 15:01:15 |
|
|
|
Ty3uK | Дата: Среда, 30 Ноября 2011, 14:47:39 | Сообщение # 6 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| SirNikolas, тогда почему же я могу сделать так: Code call SaveBoolean(udg_Hashtable, GetHandleId(Player(7), 0, true)
|
|
|
|
YaNeZnauJass | Дата: Среда, 30 Ноября 2011, 21:00:46 | Сообщение # 7 |
1 уровень
Группа: Пользователи
Сообщений: 15
Награды: 0
Репутация: 15
Блокировки:
| FatalBlade, Все типы наследующиеся от hnadle - утечны
|
|
|
|
FatalBlade | Дата: Среда, 30 Ноября 2011, 21:54:31 | Сообщение # 8 |
10 уровень
Группа: Проверенные
Сообщений: 1523
Награды: 0
Репутация: 439
Блокировки:
| Ясно. Так что лучше юзать, игроков (обнуляя локалки), или индексы игроков?
|
|
|
|
Ty3uK | Дата: Четверг, 01 Декабря 2011, 08:00:36 | Сообщение # 9 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Локалки юзай и не парься, но не забывай их обнулять
|
|
|
|
FkoFF | Дата: Четверг, 01 Декабря 2011, 10:15:11 | Сообщение # 10 |
Группа: Заблокированные
Сообщений: 4356
Награды: 1
Репутация: 1413
Блокировки:
| Quote (Ty3uK) Т.к. игрок имеет хэндл- он объект, а объект висит в памяти, пока ты его не обнулишь Ммм... вот же незадача, ты одновременно и прав и не прав, причем в равной степени.
Когда мы вызываем функцию Location(x,y) - создается точка, которую функция и возвращает, при этом, если мы её не удалим - она останется висеть в памяти. Аналогично - функция CreateGroup() - создаст группу, которую надо удалить. Функция Player() - не создает игрока а лишь возвращает его handle. Таким образом переменная player сама по себе не утечна. Однако же, переменные рекомендуется обнулять, ибо не обнуленные переменные даже по окончанию исполнения функции продолжают висеть и резервировать под себя память в процессе; По этому, обнуляя переменную - мы не уничтожаем объект как в случае с RemoveLocation(), а лишь убираем link на объект.
|
|
|
|
Ty3uK | Дата: Четверг, 01 Декабря 2011, 10:26:27 | Сообщение # 11 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Ну... Бывает, спасибо за информацию. Самое главное в том, что обнулять надо. Или сразу писать ссылку в функцию
|
|
|
|