Хранение пользовательских переменных
#1

Доброго времени суток, тов. программисты и "не очень"!
2 дня назад решил начать ковырять сервер SA-MP и с другом в качестве хобби с нуля писать RP мод. Мы не преследуем никакой цели (по крайней мере пока) - only4fun&skill. А пишем по вечерам во время после университета и работы. // маленькая предыстория

Первое, с чего я начал разбираться - это буржуйские туториалы. И вот эта статья стала одной из первых. Поскольку на тот момент никакого представления о концепции хранения и вообще концепции сервера не имел, то сразу сделал заготовочку под здоровье, деньги и прочие характеристики. Но вчера вечером наткнулся на блок функций *PVar*. Собственно, у меня назрел вопрос: как лучше хранить переменные? Через простой двумерный массив и enum или через PVar'ы?
Заранее благодарю за ответ и любую полезную информацию!
Reply
#2

Пфф, почитайте статьи по оптимизации кода что-ли. Основное различие между обычной переменной и PVar состоит в том, что они используются в разные стороны оптимизации. Оптимизация идет либо в целях потребления меньшего количества оперативной памяти(тогда стоит использовать пвары, они используют минимальное количество оперативной памяти, но при использовании жрут процессорное время), либо в целях экономии процессорного времени(тогда нужно использовать переменные, они всегда висят в оперативной памяти, и процессор гораздо быстрее получает к ним доступ).

А по сути, вы гиблым делом занялись, мои поздравления.
Reply
#3

Выбирайте то, что Вам нравится.
Плюс PVar'ов в том, что их значения можно из FS получать. А переменные только в одном моде.
Лично я юзаю enum.
Reply
#4

Quote:
Originally Posted by eakwarp
Посмотреть сообщение
Пфф, почитайте статьи по оптимизации кода что-ли. Основное различие между обычной переменной и PVar состоит в том, что они используются в разные стороны оптимизации. Оптимизация идет либо в целях потребления меньшего количества оперативной памяти(тогда стоит использовать пвары, они используют минимальное количество оперативной памяти, но при использовании жрут процессорное время), либо в целях экономии процессорного времени(тогда нужно использовать переменные, они всегда висят в оперативной памяти, и процессор гораздо быстрее получает к ним доступ).

А по сути, вы гиблым делом занялись, мои поздравления.
За информацию - спасибо, а по вопросу нужно это или не нужно, уже нам решение принимать. Чисто пионерный интерес, не больше. Как я уже говорил 4Fun. Мы никуда этот мод (если таковой вообще получится) внедрять не планируем.
Reply
#5

PVar не везде можно использовать, к примеру в OnPlayerDisconnect ты его не сможешь использовать т.к. он уже будет удален для этого игрока. Enum юзай, а для той информации которая будет использоватся уже по выбору игрока используй PVar"ы чтобы лишний раз не нагружать мод.
Reply
#6

Quote:

Плюс PVar'ов в том, что их значения можно из FS получать. А переменные только в одном моде.

Не самый лучший вариант решения проблемы межскриптингового программирования. Если уж надо между скриптами, сделайте паблик функцию, которая будет выдавать переменную по запросу, и CallRemoteFunction.

p01yak0v, по сути PVar это пул переменных, создаваемый сервером для каждого игрока отдельно. Плюс в том, что не надо думать разработчику об отчистике лишних значений при отключении игрока от сервера.
Reply
#7

То есть PVar:
  • также как и переменные находятся в опреативной памяти, но занимают меньше места;
  • хранятся на этапе от первой их инициализации и до освобождения? (а что тогда с пустыми PVar'ами происходит? По логике экономии памяти они же удаляться должны, нет?)
  • доступны в колбэке OnPlayerDisconnect и удаляются сразу после завершения тела;
Тем не менее остается открытым вопрос: Оптимальнее в дисконнекте клиента написать освобождение массива или использовать PVar'ы? У меня почему-то сложилось впечатление, что нужно юзать переменные...
Тогда не понятно, для каких целей требуются PVar'ы?
Reply
#8

Quote:
Originally Posted by p01yak0v
Посмотреть сообщение
То есть PVar:
  • также как и переменные находятся в опреативной памяти, но занимают меньше места;
  • хранятся на этапе от первой их инициализации и до освобождения? (а что тогда с пустыми PVar'ами происходит? По логике экономии памяти они же удаляться должны, нет?)
  • доступны в колбэке OnPlayerDisconnect и удаляются сразу после завершения тела;
Тем не менее остается открытым вопрос: Оптимальнее в дисконнекте клиента написать освобождение массива или использовать PVar'ы? У меня почему-то сложилось впечатление, что нужно юзать переменные...
Тогда не понятно, для каких целей требуются PVar'ы?
Я уже объяснил, да и собственно куй сам же и пояснял, пвары по своей сути для тех серверов, где проблема с оперативной памятью стоит остро.
Reply
#9

Quote:

То есть PVar:
также как и переменные находятся в опреативной памяти, но занимают меньше места;
хранятся на этапе от первой их инициализации и до освобождения? (а что тогда с пустыми PVar'ами происходит? По логике экономии памяти они же удаляться должны, нет?)
доступны в колбэке OnPlayerDisconnect и удаляются сразу после завершения тела;
Тем не менее остается открытым вопрос: Оптимальнее в дисконнекте клиента написать освобождение массива или использовать PVar'ы? У меня почему-то сложилось впечатление, что нужно юзать переменные...
Тогда не понятно, для каких целей требуются PVar'ы?

Используйте переменные и не капайте себе на мозг
Reply
#10

Quote:
Originally Posted by p01yak0v
Посмотреть сообщение
Оптимальнее в дисконнекте клиента написать освобождение массива
а зачем, память при этом все равно не освободится?!
Просто приводите данные к дефолтному значению при подключении нового игрока.
Когда игрок уходит с сервера, мне глубоко пофиг что там хранится в этих переменных, а вот когда приходит новый, я точно знаю что там дефолтные значения.
Reply
#11

Quote:
Originally Posted by jhonyxakep
Посмотреть сообщение
Используйте переменные и не капайте себе на мозг
Я использовать их и буду. Мне просто важно понять, "что" и "для чего".
Quote:
Originally Posted by Stepashka
Посмотреть сообщение
а зачем, память при этом все равно не освободится?!
Просто приводите данные к дефолтному значению при подключении нового игрока.
Когда игрок уходит с сервера, мне глубоко пофиг что там хранится в этих переменных, а вот когда приходит новый, я точно знаю что там дефолтные значения.
Я под этой фразой подразумевал сохранение необходимых значений в файл. Не так выразился.
Reply
#12

Quote:

доступны в колбэке OnPlayerDisconnect и удаляются сразу после завершения тела;

Они не доступны в нем. На то время PVar уже удален, т.к. удаляется автоматически при выходе
Reply
#13

Quote:
Originally Posted by stabker
Посмотреть сообщение
Они не доступны в нем. На то время PVar уже удален, т.к. удаляется автоматически при выходе
Они удаляются после выполнения OnPlayerDisconnect.
Reply
#14

Quote:
Originally Posted by stabker
Посмотреть сообщение
Они не доступны в нем. На то время PVar уже удален, т.к. удаляется автоматически при выходе
Но на момент выполнения OnPlayerDiconnect "выход" еще не осуществлен.
Reply
#15

Тебе написали, что пивары удаляются после выполнения колбека OnPlayerDisconnect. То есть ты в нём ещё можешь достать значения, но, если вдруг, у тебя сервер будет перезагружаться(допустим gmx ), то в колбеке ты всё потеряешь(на сколько я помню по старым версиям, если это не исправили).
Reply
#16

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Они удаляются после выполнения OnPlayerDisconnect.
Хм... я как-то пытался использовать но не получалось
Reply
#17

Юзайте обычные переменные. Всё просто и понятно в использовании. Так же ПВар будет медленнее чем обычные переменные и ещё ПВар длинее по записи.
Reply
#18

Quote:
Originally Posted by White_116
Посмотреть сообщение
Юзайте обычные переменные. Всё просто и понятно в использовании. Так же ПВар будет медленнее чем обычные переменные и ещё ПВар длинее по записи.
Чего это он медленнее?
ПВар удобно использовать, его объявлять не надо, можно вставить в любом месте и вызвать в любом. Конечно, всю статистику не забъешь в них, но иногда если грамотно использовать то очень помогает.
Reply
#19

PHP код:
#include <a_samp>
new dd[MAX_PLAYERS];
public 
OnFilterScriptInit()
{
    new 
k;
    new 
tick=GetTickCount();
    
    for(new 
i;i<100000;i++)
    for(new 
playerid;playerid<MAX_PLAYERS;playerid++)
    {
        
SetPVarInt(playerid,"dd",playerid);
        
k=GetPVarInt(playerid,"dd");
    }
    
    
printf("Time 1 %d",GetTickCount()-tick);
    
tick=GetTickCount();
    
    for(new 
i;i<100000;i++)
    for(new 
playerid;playerid<MAX_PLAYERS;playerid++)
    {
        
dd[playerid]=playerid;
        
k=dd[playerid];
    }
    
    
printf("Time 2 %d",GetTickCount()-tick);
    return 
1;

Пища для размышлений.
Reply
#20

Quote:
Originally Posted by White_116
Посмотреть сообщение
PHP код:
#include <a_samp>
new dd[MAX_PLAYERS];
public 
OnFilterScriptInit()
{
    new 
k;
    new 
tick=GetTickCount();
    
    for(new 
i;i<100000;i++)
    for(new 
playerid;playerid<MAX_PLAYERS;playerid++)
    {
        
SetPVarInt(playerid,"dd",playerid);
        
k=GetPVarInt(playerid,"dd");
    }
    
    
printf("Time 1 %d",GetTickCount()-tick);
    
tick=GetTickCount();
    
    for(new 
i;i<100000;i++)
    for(new 
playerid;playerid<MAX_PLAYERS;playerid++)
    {
        
dd[playerid]=playerid;
        
k=dd[playerid];
    }
    
    
printf("Time 2 %d",GetTickCount()-tick);
    return 
1;

Пища для размышлений.
Код:
[22:15:37] Time 1 19756
[22:15:39] Time 2 2391
Ничего себе o_O
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)