PVar`ы и с чем их едят
#1

Хотелось бы по-подробнее узнать о этих функциях (как? зачем? и нафиг оно надо )
Желательно на конкретных примерах
Reply
#2

Quote:
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[]); - возвращает тип указанного пвара
Кстати, имена пваров регистронезависимы, т.е. "id" - то же, что и "ID".
Reply
#3

upperindex - наверно узнать верхний индекс?
Reply
#4

Ну про это все я читал...а теперь примеры использования..)
Reply
#5

- код верен при условии, что игрок с ИДом playerid - онлайн.
- если игрок playerid оффлайн, значение везде будет 0, как его не создавай/изменяй

Код:
// сейчас 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
Reply
#6

К чему этот геморой когда просто можно юзать переменные с массивами...
Reply
#7

Можно существенно снизить нагрузку сервера, удаляя ненужные переменные когда они не нужны. Логично?

Если конечно стоит какой нить вшивый гоночный мод, то там это наф не надо.
Reply
#8

Quote:
Originally Posted by On1xS
К чему этот геморой когда просто можно юзать переменные с массивами...
массивы одного скрипта недоступны для других фильтрскриптов, а pvar'ки доступны из всех запущенных скриптов.

но я согласен с тем, что массивы юзать удобнее, т.к. это массивы, а не просто хранилища строк
Reply
#9

Quote:
Originally Posted by ^Faus
Можно существенно снизить нагрузку сервера, удаляя ненужные переменные когда они не нужны. Логично?
Неа, это разве что уменьшит потребление памяти. Кстати пвары медленнее обычных массивов эдак раза в 2 судя по чьим-то тестами на форуме, наверное самый большой их недостаток

Quote:
Originally Posted by On1xS
К чему этот геморой когда просто можно юзать переменные с массивами...
А второй пост читал? И в чем там геморой-то?
Reply
#10

Quote:

Неа, это разве что уменьшит потребление памяти

ты сказал тоже самое. :P
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)