Сейчас 14:13:31 Воскресенье, 5 мая, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Тип переменной - Player (Говорят что не утечка, но я в этом сомневаюсь)
[Вопрос] Тип переменной - 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
Блокировки:
Игроки утечны, обнуляй их всегда. Я интересовался у Дуоса и Николаса. Т.к. игрок имеет хэндл- он объект, а объект висит в памяти, пока ты его не обнулишь

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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)


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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
Блокировки:
Локалки юзай и не парься, но не забывай их обнулять

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

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
Блокировки:
Ну... Бывает, спасибо за информацию. Самое главное в том, что обнулять надо. Или сразу писать ссылку в функцию

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

Форум о Warcraft 3 » Раздел для картостроителей » GUI / Jass » [Вопрос] Тип переменной - Player (Говорят что не утечка, но я в этом сомневаюсь)
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz