Хранение пользовательских переменных -
p01yak0v - 29.05.2012
Доброго времени суток, тов. программисты и "не очень"!
2 дня назад решил начать ковырять сервер SA-MP и с другом в качестве хобби с нуля писать RP мод. Мы не преследуем никакой цели (по крайней мере пока) - only4fun&skill. А пишем по вечерам во время после университета и работы.
// маленькая предыстория
Первое, с чего я начал разбираться - это буржуйские туториалы. И
вот эта статья стала одной из первых. Поскольку на тот момент никакого представления о концепции хранения и вообще концепции сервера не имел, то сразу сделал заготовочку под здоровье, деньги и прочие характеристики. Но вчера вечером наткнулся на блок функций
*PVar*. Собственно, у меня назрел вопрос: как лучше хранить переменные? Через простой двумерный массив и enum или через PVar'ы?
Заранее благодарю за ответ и любую полезную информацию!
Re: Хранение пользовательских переменных -
eakwarp - 29.05.2012
Пфф, почитайте статьи по оптимизации кода что-ли. Основное различие между обычной переменной и PVar состоит в том, что они используются в разные стороны оптимизации. Оптимизация идет либо в целях потребления меньшего количества оперативной памяти(тогда стоит использовать пвары, они используют минимальное количество оперативной памяти, но при использовании жрут процессорное время), либо в целях экономии процессорного времени(тогда нужно использовать переменные, они всегда висят в оперативной памяти, и процессор гораздо быстрее получает к ним доступ).
А по сути, вы гиблым делом занялись, мои поздравления.
Re: Хранение пользовательских переменных -
DartfoL - 29.05.2012
Выбирайте то, что Вам нравится.
Плюс PVar'ов в том, что их значения можно из FS получать. А переменные только в одном моде.
Лично я юзаю enum.
Re: Хранение пользовательских переменных -
p01yak0v - 29.05.2012
Quote:
Originally Posted by eakwarp
Пфф, почитайте статьи по оптимизации кода что-ли. Основное различие между обычной переменной и PVar состоит в том, что они используются в разные стороны оптимизации. Оптимизация идет либо в целях потребления меньшего количества оперативной памяти(тогда стоит использовать пвары, они используют минимальное количество оперативной памяти, но при использовании жрут процессорное время), либо в целях экономии процессорного времени(тогда нужно использовать переменные, они всегда висят в оперативной памяти, и процессор гораздо быстрее получает к ним доступ).
А по сути, вы гиблым делом занялись, мои поздравления.
|
За информацию - спасибо, а по вопросу нужно это или не нужно, уже нам решение принимать. Чисто пионерный интерес, не больше. Как я уже говорил 4Fun. Мы никуда этот мод (если таковой вообще получится) внедрять не планируем.
Re: Хранение пользовательских переменных -
stabker - 29.05.2012
PVar не везде можно использовать, к примеру в OnPlayerDisconnect ты его не сможешь использовать т.к. он уже будет удален для этого игрока. Enum юзай, а для той информации которая будет использоватся уже по выбору игрока используй PVar"ы чтобы лишний раз не нагружать мод.
Re: Хранение пользовательских переменных -
jhonyxakep - 29.05.2012
Quote:
Плюс PVar'ов в том, что их значения можно из FS получать. А переменные только в одном моде.
|
Не самый лучший вариант решения проблемы межскриптингового программирования. Если уж надо между скриптами, сделайте паблик функцию, которая будет выдавать переменную по запросу, и CallRemoteFunction.
p01yak0v, по сути PVar это пул переменных, создаваемый сервером для каждого игрока отдельно. Плюс в том, что не надо думать разработчику об отчистике лишних значений при отключении игрока от сервера.
Re: Хранение пользовательских переменных -
p01yak0v - 29.05.2012
То есть PVar:
- также как и переменные находятся в опреативной памяти, но занимают меньше места;
- хранятся на этапе от первой их инициализации и до освобождения? (а что тогда с пустыми PVar'ами происходит? По логике экономии памяти они же удаляться должны, нет?)
- доступны в колбэке OnPlayerDisconnect и удаляются сразу после завершения тела;
Тем не менее остается открытым вопрос: Оптимальнее в дисконнекте клиента написать освобождение массива или использовать PVar'ы? У меня почему-то сложилось впечатление, что нужно юзать переменные...
Тогда не понятно, для каких целей требуются PVar'ы?
Re: Хранение пользовательских переменных -
eakwarp - 29.05.2012
Quote:
Originally Posted by p01yak0v
То есть PVar: - также как и переменные находятся в опреативной памяти, но занимают меньше места;
- хранятся на этапе от первой их инициализации и до освобождения? (а что тогда с пустыми PVar'ами происходит? По логике экономии памяти они же удаляться должны, нет?)
- доступны в колбэке OnPlayerDisconnect и удаляются сразу после завершения тела;
Тем не менее остается открытым вопрос: Оптимальнее в дисконнекте клиента написать освобождение массива или использовать PVar'ы? У меня почему-то сложилось впечатление, что нужно юзать переменные...
Тогда не понятно, для каких целей требуются PVar'ы?
|
Я уже объяснил, да и собственно куй сам же и пояснял, пвары по своей сути для тех серверов, где проблема с оперативной памятью стоит остро.
Re: Хранение пользовательских переменных -
jhonyxakep - 29.05.2012
Quote:
То есть PVar:
также как и переменные находятся в опреативной памяти, но занимают меньше места;
хранятся на этапе от первой их инициализации и до освобождения? (а что тогда с пустыми PVar'ами происходит? По логике экономии памяти они же удаляться должны, нет?)
доступны в колбэке OnPlayerDisconnect и удаляются сразу после завершения тела;
Тем не менее остается открытым вопрос: Оптимальнее в дисконнекте клиента написать освобождение массива или использовать PVar'ы? У меня почему-то сложилось впечатление, что нужно юзать переменные...
Тогда не понятно, для каких целей требуются PVar'ы?
|
Используйте переменные и не капайте себе на мозг
Re: Хранение пользовательских переменных -
Stepashka - 29.05.2012
Quote:
Originally Posted by p01yak0v
Оптимальнее в дисконнекте клиента написать освобождение массива
|
а зачем, память при этом все равно не освободится?!
Просто приводите данные к дефолтному значению при подключении нового игрока.
Когда игрок уходит с сервера, мне глубоко пофиг что там хранится в этих переменных, а вот когда приходит новый, я точно знаю что там дефолтные значения.
Re: Хранение пользовательских переменных -
p01yak0v - 29.05.2012
Quote:
Originally Posted by jhonyxakep
Используйте переменные и не капайте себе на мозг
|
Я использовать их и буду. Мне просто важно понять, "что" и "для чего".
Quote:
Originally Posted by Stepashka
а зачем, память при этом все равно не освободится?!
Просто приводите данные к дефолтному значению при подключении нового игрока.
Когда игрок уходит с сервера, мне глубоко пофиг что там хранится в этих переменных, а вот когда приходит новый, я точно знаю что там дефолтные значения.
|
Я под этой фразой подразумевал сохранение необходимых значений в файл. Не так выразился.
Re: Хранение пользовательских переменных -
stabker - 29.05.2012
Quote:
доступны в колбэке OnPlayerDisconnect и удаляются сразу после завершения тела;
|
Они не доступны в нем. На то время PVar уже удален, т.к. удаляется автоматически при выходе
Re: Хранение пользовательских переменных -
Stepashka - 29.05.2012
Quote:
Originally Posted by stabker
Они не доступны в нем. На то время PVar уже удален, т.к. удаляется автоматически при выходе
|
Они удаляются после выполнения
OnPlayerDisconnect.
Re: Хранение пользовательских переменных -
p01yak0v - 29.05.2012
Quote:
Originally Posted by stabker
Они не доступны в нем. На то время PVar уже удален, т.к. удаляется автоматически при выходе
|
Но на момент выполнения OnPlayerDiconnect "выход" еще не осуществлен.
Re: Хранение пользовательских переменных -
Mutha_X - 29.05.2012
Тебе написали, что пивары удаляются после выполнения колбека OnPlayerDisconnect. То есть ты в нём ещё можешь достать значения, но, если вдруг, у тебя сервер будет перезагружаться(допустим gmx ), то в колбеке ты всё потеряешь(на сколько я помню по старым версиям, если это не исправили).
Re: Хранение пользовательских переменных -
stabker - 29.05.2012
Quote:
Originally Posted by Stepashka
Они удаляются после выполнения OnPlayerDisconnect.
|
Хм... я как-то пытался использовать но не получалось
Re: Хранение пользовательских переменных -
White_116 - 29.05.2012
Юзайте обычные переменные. Всё просто и понятно в использовании. Так же ПВар будет медленнее чем обычные переменные и ещё ПВар длинее по записи.
Re: Хранение пользовательских переменных -
stabker - 30.05.2012
Quote:
Originally Posted by White_116
Юзайте обычные переменные. Всё просто и понятно в использовании. Так же ПВар будет медленнее чем обычные переменные и ещё ПВар длинее по записи.
|
Чего это он медленнее?
ПВар удобно использовать, его объявлять не надо, можно вставить в любом месте и вызвать в любом. Конечно, всю статистику не забъешь в них, но иногда если грамотно использовать то очень помогает.
Re: Хранение пользовательских переменных -
White_116 - 30.05.2012
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;
}
Пища для размышлений.
Re: Хранение пользовательских переменных -
SDraw - 30.05.2012
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