Здравствуйте. Есть смысл удалять все-все PVar'ы при дисконнекте игрока? Знаю что это необязательно, но не освободит ли это удаление память, которую сервер выделил под них ранее?
P.S да и вообще, какие советы можете дать относительно памяти?
Вид для печати
Здравствуйте. Есть смысл удалять все-все PVar'ы при дисконнекте игрока? Знаю что это необязательно, но не освободит ли это удаление память, которую сервер выделил под них ранее?
P.S да и вообще, какие советы можете дать относительно памяти?
Смысла удалять их при дисконнекте нет, так как они автоматически удаляются.
Подробнее о принципах работы pVar (именно по части памяти) можно прочесть тут.
Касаемо последнего вопроса: достаточно лишь просто выделять столько, сколько требуется для работы кода, и этого будет достаточно (подсчитывать нормально размер массивов). Но если ты жаждешь извращений и не самой рациональной траты времени, почитай об упакованных строках, например.
Хочешь вопрос? :D
Привет
Вообщем на PVar я делаю всякую мини п*елку в виде работ и типа готовки еды в моде.
Возник вопрос например я создал 1 pvar с названием cooking и при определенном первом этапе действия системы ему присваивается значение 1, дальше на втором этапе этому же пвару присваивается значение 2, и на третьем этапе присваивают 3 значения ну типа
Это как то влияет на нагрузку? Или если создал 1 пвар с одним названием и используешь её. Нагрузка приходиться именно на эту выделеную память или как там. Вообщем думаю ты понял суть вопросаPHP код:
SetPVar(playerid, "cooking") 1) в начале готовки
SetPVar(playerid, "cooking") 2) когда еда готова
SetPVar(playerid, "cooking") 3) и когда берешь еду
Зачем тогда вообще использовать PVar'ы? Если под один PV'ar выделяется 58 байт и при этом сразу же при коннекте игрока? Т.е если мне надо запомнить какое-то значение временно, к примеру из перехода игрока из одного диалога в другой, то какой смысл мне использовать PV'ar, если я могу записать это значение в обычную переменную (я рассматриваю только int и float) и "потратить" всего 4 байта? Получается, что профит мы получим только в случае если сервер будет пустовать? У нас есть 1000 слотов, если мы будем использовать обычную переменную, мы выделим 4000 байт под нужную нам переменную игроков, в случае с PV'ar мы выделим 0, но если на сервер зайдут 100 человек, тогда будет выделено 5800 байт? Не понимаю, разъясните, пожалуйста
Потому что эти 58*800 байт выделяются в любом случае: используешь ты pVar или нет.
Ты ещё начни использовать глобальный string вместо локального, ведь зачем выделять память в стэке (хотя она там выделена ещё при старте сервера и все твои "new" просто резервируют определённые участки памяти под свои нужды, а не выделяют новую память), когда можно создать глобальную переменную и делать всё то же самое, что и делает стэк, только в ручном режиме! :agree:
Если простым языком, то выделение памяти под стэк вшито в саму абстрактную машину. Ты лишь можешь контролировать количество выделяемой памяти через
Собственно, эта память нужна для хранения временных данных (информации о обрабатываемом коллбэке и т.п.), а так же её можно использовать путём создания локальных переменных.PHP код:
#pragma dynamic количество
У меня уже давно есть в планах написать урок, где объяснить подобные элементарные и важные вещи максимально доступно, но пока всё руки не доходят.
Нет, не получается :)
Удаление нужно не для того, чтоб освобождать память (хотя для чего ты вообще собрался её освобождать, если количество занимаемой модом памяти известно уже на этапе компиляции и никак не изменится при работе сервера?), а для того, чтоб освободить память (слот) для нового pVar. Ведь, как ранее говорилось, у pVar есть свои лимиты и если эти pVar вовремя не удалять, можно легко лимиты превысить.
Да и чем больше создано pVar, тем дольше будет обращение к pVar с последним ID, что хоть и не существенно, но должно тебя волновать, если ты хочешь написать хороший мод, который использует ресурсы по назначению, а не разбрасывается ими.
Всё понял. Благодарю. Сразу же вопрос хочу здесь задать по поводу динамических арен/сфер стримера, они сильно превосходят по скорости классический вариант с перебором координат по типу цикл + IsPlayerInRangeOfPoint? Если сделать 1 проверку в OnPlayerEnterDynamicArea, стример будет ~20 раз (по-моему каждые 50 мс по дефолту) проверять вошёл ли игрок в зону, верно? С другой стороны, если сделать цикл с перебором координат на какую-нибудь кнопку с откатом в 1-2 секунды...? Я слышал что-то типа: "если ставишь себе стример - используй его по максимуму", - насколько верны эти слова?
Всё зависит от ситуации. Преимущество стримера в том, что он все сверки координат делает на своей стороне, в отдельном потоке. Но из этого вытекает минус в виде "неточности" из-за того, что когда стример находит игрока внутри динамической зоны, он отсылает информацию об этом серверу и сервер не сразу обрабатывает её, а ставит в общую очередь. Соответственно, если пакет пришёл в момент начала выполнения какого-нибудь трудоёмкого коллбэка, OnPlayerEnterDynamicArea не сработает, пока этот коллбэк не обработается.
То бишь, нагрузки на поток, в котором обрабатывается мод, будет меньше, но и точность упадёт
Имейте в виду, что темы с вопросами здесь архивируются, чтобы не отвечать заново на одни и те же вопросы для каждого такого же пользователя, как вы. Например, если кто-то ещё задаст вопрос про экономию памяти за счёт PVa'ов, ему дадут ссылку на эту тему. Или этот кто-то сам найдёт ответ, отыскав тему по названию (через поиск по форуму).
Если же у вас возник новый вопрос, никак не относящийся к предыдущему, создайте новую тему - иначе ответ на новый вопрос по названию темы найти не получится. Не захламляйте форум бессвязными вопросами в одной теме.
Закрыто.