Originally Posted by Куй
Система персональных переменных (Per-player variables):
Изначально SA-MP был создан для максимум 100 игроков. Это значит, что создание массивов в PAWN размером MAX_PLAYERS, например, PlayerInfo[MAX_PLAYERS], в общем было вполне нормально. Теперь же MAX_PLAYERS равняется 500, а скриптеры создают массивы из 500 элементов лишь для хранения одиночных флагов. Это может оказаться очень затратно в плане потребления памяти. Кроме того, обычные переменные нужно вручную сбрасывать/обнулять, когда игрок покидает сервер. Преимущества использования PVar'ов над массивами размером в MAX_PLAYERS: 1) PVar'ы доступны из всех загруженных гейммодов и скриптов, упрощая модуляризация вашего кода. 2) PVar'ы автоматически удаляются, когда игрок выходит с сервера, что означает вам не нужно вручную сбрасывать переменные для следующего подключившигося игрока. 3) Больше нет нужды в сложных енумах/playerInfo-структурах. 4) Экономит память, не расходуя ее на элементы под playerid'ы, которые, возможно, вообще никогда не будут использованы. 5) Вы можете легко перечислять и выводить/хранить список PVar'ов. Это упрощает как отладку, так и хранение информации об игроках. 6) Если даже PVar не был создан, при запросе его значения возвращается 0 по умолчанию. 7) PVar'ы могут хранить очень большие строки используя динамически выделяемую память. |
native SetPVarInt(playerid, varname[], int_value); - устанавливает значение для целого пвара native GetPVarInt(playerid, varname[]); - возвращает значение целого пвара native SetPVarString(playerid, varname[], string_value[]); - устанавливает значение строкового пвара native GetPVarString(playerid, varname[], string_return[], len); - копирует значение строкового пвара в string_return native SetPVarFloat(playerid, varname[], Float:float_value); - устанавливает значение вещественного пвара native Float:GetPVarFloat(playerid, varname[]); - возвращает значение вещественного пвара native DeletePVar(playerid, varname[]); - удаляет пвар // Типы пваров #define PLAYER_VARTYPE_NONE 0 - неизвестно #define PLAYER_VARTYPE_INT 1 - целое число #define PLAYER_VARTYPE_STRING 2 - строка #define PLAYER_VARTYPE_FLOAT 3 - вещественное число native GetPVarsUpperIndex(playerid); - хз native GetPVarNameAtIndex(playerid, index, ret_varname[], ret_len); - узнает название пвара по его индексу (внутреннему номеру) native GetPVarType(playerid, varname[]); - возвращает тип указанного пвара
// сейчас PVar игрока playerid под названием "cash" не существует и равен по-умолчанию 0 SetPVarInt( playerid, "cash", 123456 ); // создадим числовую ячейку "cash" для игрока playerid // сейчас PVar игрока playerid под названием "cash" равен 123456 SetPVarInt( playerid, "cash", 777 ); // изменим значение числовой ячейки "cash" для игрока playerid // сейчас PVar игрока playerid под названием "cash" равен 777 DeletePVar( playerid, "cash" ); // удалим числовую ячейку "cash" для игрока playerid // сейчас PVar игрока playerid под названием "cash" не существует и равен по-умолчанию 0
Originally Posted by On1xS
К чему этот геморой когда просто можно юзать переменные с массивами...
|
Originally Posted by ^Faus
Можно существенно снизить нагрузку сервера, удаляя ненужные переменные когда они не нужны. Логично?
|
Originally Posted by On1xS
К чему этот геморой когда просто можно юзать переменные с массивами...
|
Неа, это разве что уменьшит потребление памяти |