14.05.2011, 18:31
(
Последний раз редактировалось DANGER1979; 15.05.2011 в 08:11.
)
Я не сторонник чужих скриптов.
Но так сложилось что как только я какой то [Include] пытаюсь применить для своего серва, то случаются какие то непредвиденные ситуации.
Первым печальным моим опытом было использование mxINI. Там из-за того что параметры с одинаковым началом воспринимались как одинаковые. В итоге слетело куча аккаунтов и мы перешли на базу данных. Спасибо автору, иначе я бы не решился с ini переходить на MySQL.
Кстати плагин mysql единственное из сторонних разработок, что стоит у меня на сервере и работает корректно.
Дальше мы пытались перевести всё цыклы на foreach. Особенно было актуально это для стрим тачек, т.е. создание динамического массива стрим тачек для каждого игрока. В общем сервер при каждом рестарте вис так, что пинг показывало в клиенте, но сама игра зависала. При этом ни одна ркон команда в удалённой консоли не пахала. Приходилось просто ФС крашить сервер.
Потом я поставил плагин от инкогнито и отключил все свои скриптовые стримеры. В итоге по началу было вроде нормально. Но потом когда я пикапы и ЗД тексты перевёл тоже на этот стример, то всё начало жутко лагать, подгрузки были очень заметны. Я вывел счётчики на экран в диалоге и увидел ужас. Так каждому игроку грузилось по несколько тысяч объектов. В итоге я подумал, что где то в стримере идёт не корректное удаление объектов из динамических массивов.
Теперь я решил снова разобрать динамические массивы от ******.
Потом в public OnGameModeInit() инициализируем массив
Потом создаём заполнение массива в public OnVehicleStreamIn(vehicleid, forplayerid)
Потом удаление в public OnVehicleStreamOut(vehicleid, forplayerid)
и на всякий случай очистку массива в public OnPlayerDisconnect(playerid, reason)
В итоге тачки добавлялись в массив, но не совсем корректно удалялись. Через некоторое время из-за переполнения сервер зависал. Это видимо проблема всех скриптов при попытке создания динамических массивов.
Теперь вопрос: "Что я сделал не так?"
P.S. Я то докопаюсь до истины, просто интересно, кто-нибудь использует эти сторонние ресурсы на серверах сампа под Windows? Не ужели у всех сразу всё глатко работает?
Может кто ещё сталкивался с проблемами в чужих серьёзных сторонних разработках (отбросив всякую чушь что пишет разная школота)?
Но так сложилось что как только я какой то [Include] пытаюсь применить для своего серва, то случаются какие то непредвиденные ситуации.
Первым печальным моим опытом было использование mxINI. Там из-за того что параметры с одинаковым началом воспринимались как одинаковые. В итоге слетело куча аккаунтов и мы перешли на базу данных. Спасибо автору, иначе я бы не решился с ini переходить на MySQL.
Кстати плагин mysql единственное из сторонних разработок, что стоит у меня на сервере и работает корректно.
Дальше мы пытались перевести всё цыклы на foreach. Особенно было актуально это для стрим тачек, т.е. создание динамического массива стрим тачек для каждого игрока. В общем сервер при каждом рестарте вис так, что пинг показывало в клиенте, но сама игра зависала. При этом ни одна ркон команда в удалённой консоли не пахала. Приходилось просто ФС крашить сервер.
Потом я поставил плагин от инкогнито и отключил все свои скриптовые стримеры. В итоге по началу было вроде нормально. Но потом когда я пикапы и ЗД тексты перевёл тоже на этот стример, то всё начало жутко лагать, подгрузки были очень заметны. Я вывел счётчики на экран в диалоге и увидел ужас. Так каждому игроку грузилось по несколько тысяч объектов. В итоге я подумал, что где то в стримере идёт не корректное удаление объектов из динамических массивов.
Теперь я решил снова разобрать динамические массивы от ******.
Маленький Мануал по созданию динамических массивов,
может кому пригодиться и это чудо у него будет корректно работать
Для этого создаёмможет кому пригодиться и это чудо у него будет корректно работать
pawn Код:
#define MAX_STREAMEDCARS 100 // Максимальное количество тачек, которое может находится рядом возле игрока.
//допустим что на сервере не создастся ситуации при которой кол-во стрим-тачек выйдет за 100
new StreamedVehicle[MAX_PLAYERS][MAX_STREAMEDCARS];//массив хранения ИД тачек по каждому игроку
new StreamVehCount[MAX_PLAYERS];//глобальный счётчик
pawn Код:
public OnGameModeInit()
{
...
Itter_InitInternal(StreamedVehicle, MAX_PLAYERS, MAX_STREAMEDCARS);
return 1;
}
pawn Код:
stock Itter_InitInternal(arr[][], s0, s1)
{
for(new i = 0; i != s0; ++i)
{
for(new j = 0; j != s1; ++j)
{
arr[i][j] = -1;
}
}
}
pawn Код:
public OnVehicleStreamIn(vehicleid, forplayerid)
{
...
new start;
Itter_AddInternal(start, StreamVehCount[forplayerid], StreamedVehicle[forplayerid], vehicleid);
return 1;
}
pawn Код:
stock Itter_AddInternal(&start, &count, array[], value)
{
if(array[value] != -1)
{
return 0;
}
count++;
if(start == -1)
{
start = value;
}
else if(start > value)
{
array[value] = start;
start = value;
}
else
{
new cur = start, last;
do
{
last = cur;
cur = array[cur];
if(cur > value)
{
array[value] = cur;
array[last] = value;
printf("1. count: %d, array[value:%d]: %d, array[last:%d]: %d", count, value, array[value], last, array[last]);
return 1;
}
}
while(cur != -1);
array[last] = value;
printf("2. count: %d, array[value:%d]: %d, array[last:%d]: %d", count, value, array[value], last, array[last]);
}
return 1;
}
pawn Код:
public OnVehicleStreamOut(vehicleid, forplayerid)
{
...
new start;
Itter_RemoveInternal(start, StreamVehCount[forplayerid], StreamedVehicle[forplayerid], vehicleid);
return 1;
}
pawn Код:
stock Itter_RemoveInternal(&start, &count, array[], value)
{
if(start == -1)
{
return 0;
}
if(start == value)
{
start = array[value];
}
else
{
new cur = start;
while(array[cur] != value)
{
cur = array[cur];
if(cur == -1)
{
return 0;
}
}
array[cur] = array[value];
printf("3. count: %d, array[cur:%d]: %d, array[value:%d]: %d", count, cur, array[cur], value, array[value]);
}
array[value] = -1;
--count;
printf("4. count: %d, array[cur:%d]: %d, array[value:%d]: %d", count, cur, array[cur], value, array[value]);
return 1;
}
pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
...
new start;
Itter_ClearInternal(start, StreamVehCount[playerid], StreamedVehicle[playerid]);
return 1;
}
pawn Код:
stock Itter_ClearInternal(&start, &count, array[])
{
if (start != -1)
{
new cur = start, next = array[cur];
start = -1; count = 0;
while (next != -1)
{
array[cur] = -1;
cur = next;
next = array[cur];
}
}
}
Теперь вопрос: "Что я сделал не так?"
P.S. Я то докопаюсь до истины, просто интересно, кто-нибудь использует эти сторонние ресурсы на серверах сампа под Windows? Не ужели у всех сразу всё глатко работает?
Может кто ещё сталкивался с проблемами в чужих серьёзных сторонних разработках (отбросив всякую чушь что пишет разная школота)?