PDA

Просмотр полной версии : [Вопрос] Обновление скорости спидометра на TD



Nash_Brigers
05.06.2017, 10:34
Думаю, что ни для кого не секрет, что обновление текстдравов спидометра сильно грузит сервер.. Я пришёл к интересной идее, как можно ускорить обновление текстдрава в нём, путём проверки равенства показаний скорости.. т.е. Если скорость равна предыдущей (а в основном все гоняют на максимум), то не обновлять спидометр. Вопрос такой - пробывал ли кто-нибудь подобное реализовать на загруженном сервере и каковы были результаты?

Nash_Brigers
05.06.2017, 14:32
Хоть кто-нибудь понял о чём я?) Или все погнали сервера перепиливать?

Seregamil
05.06.2017, 16:20
Хоть кто-нибудь понял о чём я?) Или все погнали сервера перепиливать?

Да все поняли, ну по логике вещей, если поставить такую проверку на обновлялку, то нагрузка должна сбавиться, правда незначительно, но все же

Просто мало у кого есть до отвала загруженные сервера
Или их вообще нет))

vovandolg
05.06.2017, 22:10
Думаю, что ни для кого не секрет, что обновление текстдравов спидометра сильно грузит сервер.. Я пришёл к интересной идее, как можно ускорить обновление текстдрава в нём, путём проверки равенства показаний скорости.. т.е. Если скорость равна предыдущей (а в основном все гоняют на максимум), то не обновлять спидометр. Вопрос такой - пробывал ли кто-нибудь подобное реализовать на загруженном сервере и каковы были результаты?

О боже я так всегда делал с ТДшками, взгляни на мой зм мод, там есть апдейт тдшки с баблом и прочей шелухой))
Я думал так все делали...

DeimoS
06.06.2017, 02:33
Эмм, если у вас обновление текстдравов даёт сильную нагрузку - у меня для вас плохие новости.

Подобная проверка создаст лишь дополнительное лишнее условие, которое будет 90% времени в холостую проверяться и оставшиеся 10% просто будут теряться, из-за чего профита будет крайне мало, если он будет вообще.
Это то же самое, что и проверять pVar на то, существует ли он, прежде чем его удалять.

От определения скорости авто будет гораздо больше нагрузки. Хотя и эта нагрузка не должна создавать каких-то проблем, ибо SA-MP не настолько плох, чтоб от элементарных вычислений загинаться. Оптимизируйте лучше алгоритмы, а не подобной фигнёй занимайтесь

Nash_Brigers
06.06.2017, 09:21
Эмм, если у вас обновление текстдравов даёт сильную нагрузку - у меня для вас плохие новости.

Подобная проверка создаст лишь дополнительное лишнее условие, которое будет 90% времени в холостую проверяться и оставшиеся 10% просто будут теряться, из-за чего профита будет крайне мало, если он будет вообще.
Это то же самое, что и проверять pVar на то, существует ли он, прежде чем его удалять.

От определения скорости авто будет гораздо больше нагрузки. Хотя и эта нагрузка не должна создавать каких-то проблем, ибо SA-MP не настолько плох, чтоб от элементарных вычислений загинаться. Оптимизируйте лучше алгоритмы, а не подобной фигнёй занимайтесь

При определении скорости через GetVehicleVelocity нагрузки нету, а вот при частом обновлении текстдравов серв стабильно падает. От проверок же с JIT нагрузок также нет.
Если, вы считаете это охотой на ведьм, то запихните обновление спидометра в OnPlayerUpdate, как "ракнет" в своё время..

UPD: Тема не актуальна, можете удалить.

DeimoS
06.06.2017, 13:46
При определении скорости через GetVehicleVelocity нагрузки нету

Причём тут GetVehicleVelocity, если речь шла о вычислении скорости по тем данным, что выдаёт GetVehicleVelocity? Именно математические вычисления чаще всего дают большую нагрузку. И чем сложнее эти вычисления, тем дольше сервер их будет производить


а вот при частом обновлении текстдравов серв стабильно падает. От проверок же с JIT нагрузок также нет.
Если, вы считаете это охотой на ведьм, то запихните обновление спидометра в OnPlayerUpdate, как "ракнет" в своё время..

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

Вот, ради эксперимента, можно взять текстдрав даты и времени с паблика и вставить обновление в OnPlayerUpdate

new Text:Clock;
new Text:Date;

public OnGameModeInit()
{
Clock = TextDrawCreate(547.000000,29.000000, "00:00");//это создает тестдрайвер
TextDrawLetterSize(Clock,0.5,1.5);//размер шрифта
TextDrawFont(Clock,0);//стиль шрифта
TextDrawColor(Clock,0xffffffff);//цвет
TextDrawSetOutline(Clock,1);
//дата
Date = TextDrawCreate(547.000000,45.000000, "26.06.2011");//это создает тестдрайвер
TextDrawLetterSize(Clock,0.5,1.5); //размер шрифта
TextDrawFont(Date,0);//стиль шрифта
TextDrawColor(Date,0xffffffff);//цвет
TextDrawSetOutline(Date,1);
return 1;
}

public OnPlayerConnect(playerid)
{
TextDrawShowForPlayer(playerid,Clock);
TextDrawShowForPlayer(playerid,Date);
return 1;
}

public OnPlayerUpdate(playerid)
{
static
string[256],
buff_1,
buff_2,
buff_3;

gettime(buff_1, buff_2, buff_3);

SetWorldTime(buff_1);
format(string, sizeof(string), "%02d:%02d:%02d", buff_1, buff_2, buff_3);
TextDrawSetString(Clock, string);
TextDrawShowForPlayer(playerid, Clock);
// date
getdate(buff_1, buff_2, buff_3);

format(string, sizeof(string), "%02d.%02d.%d",buff_3, buff_2, buff_1);
TextDrawSetString(Date, string);
TextDrawShowForPlayer(playerid, Date);
return 1;
}
А после хоть завертись - ничего не изменится, кроме количества отправленных пакетов

vovandolg
06.06.2017, 23:15
DeimoS, ну так когда вызывается тд setstring клиенты на слабых пк начинают попукивать особенно если тд на экране много, получается лишние обороты как на сервер так и на клиент же.
Или есть исходники сампа чтобы опровергнуть что то подобное?))

DeimoS
07.06.2017, 03:45
DeimoS, ну так когда вызывается тд setstring клиенты на слабых пк начинают попукивать особенно если тд на экране много, получается лишние обороты как на сервер так и на клиент же.
Или есть исходники сампа чтобы опровергнуть что то подобное?))

Изначально речь шла о нагрузке сервера, не?
И каким же должен быть ПК, если он начинает виснуть от обновления текстдрава? :) Там ведь ничего особо страшного не происходит.

Ну а если нужны исходники, то есть Open SA-MP, где можно найти нужный код. Хотя и без него понятно, что само по себе обновление текстдрава не будет вызывать проблем, если их не миллион штук и они не отображают модели объектов/скинов/авто.

vovandolg
07.06.2017, 20:05
Изначально речь шла о нагрузке сервера, не?
И каким же должен быть ПК, если он начинает виснуть от обновления текстдрава? :) Там ведь ничего особо страшного не происходит.

Ну а если нужны исходники, то есть Open SA-MP, где можно найти нужный код. Хотя и без него понятно, что само по себе обновление текстдрава не будет вызывать проблем, если их не миллион штук и они не отображают модели объектов/скинов/авто.

Не ну так мало или много всё равно есть же, мелочи тоже считаются))
Если оставлять все мелочи без внимания то соберётся полный совок мусора и каках

Nash_Brigers
08.06.2017, 09:31
Причём тут GetVehicleVelocity, если речь шла о вычислении скорости по тем данным, что выдаёт GetVehicleVelocity? Именно математические вычисления чаще всего дают большую нагрузку. И чем сложнее эти вычисления, тем дольше сервер их будет производить
К стати, я не то скопировал, имелись ввиду вычисления через VectorSize.

GetVehicleVelocity(vehicleid, X, Y, Z);
Speed = floatround(VectorSize(X, Y, Z) * 100.0);

DeimoS
08.06.2017, 09:54
Не ну так мало или много всё равно есть же, мелочи тоже считаются))
Если оставлять все мелочи без внимания то соберётся полный совок мусора и каках

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

vovandolg
08.06.2017, 10:01
Ну так почему ты не учитываешь, что ради улучшения игры для игроков со слабым ПК (хотя вряд ли она улучшится) ты добавишь одну, по сути, лишнюю проверку, которая будет обрабатываться каждую итерацию таймера для каждого игрока, что, в перспективе, лишь затормозит обработку кода.

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

DeimoS
08.06.2017, 10:02
Жаль я на житхаб не сливаю не чего, строки показать хочется из своего мода где и что я имел в виду,
и нету там не какой лишней проверки которая бы тормозила обработку кода.

Да причём тут ты, если мы говорим про автора темы?

Любая проверка, существование которой не особо оправдано, может считаться лишней

public OnGameModeInit()
{
new time = GetTickCount();
for(new i, j; i < 100_000; i++)
{
for(j = 0; j < 1_000; j++)
{}
}
printf("Цикл №1: %d", GetTickCount()-time);
time = GetTickCount();
for(new i, j; i < 100_000; i++)
{
for(j = 0; j < 1_000; j++)
{
if(time == 1000)
continue;
}
}
printf("Цикл №2: %d", GetTickCount()-time);
return 1;
}

И вы ради единичных случаев предлагаете что-то там сверять. Это ли не лишняя проверка?

vovandolg
08.06.2017, 10:27
Да причём тут ты, если мы говорим про автора темы?

Любая проверка, существование которой не особо оправдано, может считаться лишней

public OnGameModeInit()
{
new time = GetTickCount();
for(new i, j; i < 100_000; i++)
{
for(j = 0; j < 1_000; j++)
{}
}
printf("Цикл №1: %d", GetTickCount()-time);
time = GetTickCount();
for(new i, j; i < 100_000; i++)
{
for(j = 0; j < 1_000; j++)
{
if(time == 1000)
continue;
}
}
printf("Цикл №2: %d", GetTickCount()-time);
return 1;
}

И вы ради единичных случаев предлагаете что-то там сверять. Это ли не лишняя проверка?

Аа, ну так будь любезен закинь в обе проверки функцию TD)))
Я и так знаю что обычная проверка имеет тоже смысл микронагрузки, но мы же говорим о функции тоже...

Nash_Brigers
08.06.2017, 10:54
Да причём тут ты, если мы говорим про автора темы?
Любая проверка, существование которой не особо оправдано, может считаться лишнейНа момент создания темы я не считал ту проверку лишней из-за мнимой мною нагрузки обновления TD, темболее при плагине JIT эти проверки практически ничего не значат, судя по тестам проведённых мною. До меня потом дошла ложность моих выводов об обновлении.. Я крепко тупонул проверяя это дело на локальном сервере на себе, скажем так..

Аа, ну так будь любезен закинь в обе проверки функцию TD)))К стати, да..

DeimoS
09.06.2017, 02:18
Аа, ну так будь любезен закинь в обе проверки функцию TD)))
Я и так знаю что обычная проверка имеет тоже смысл микронагрузки, но мы же говорим о функции тоже...

Эмм, так а что изменится? И в том, и в другом случае функция будет вызываться с одинаковым временем. Только в первом случае будет вызываться просто функция, а во втором - функция+проверка.
Второй вариант будет несущественно выигрывать лишь в случае, когда условие будет срабатывать (1 из 10 вызовов), а в ином случае будет прилично проигрывать, ибо:
Случай 1: Просто отправляем данные на обновление
Случай 2: Проверяем, совпадает ли условие и если не совпадает, отправляем данные.

Логично, что в первом случае серверу нужно выполнить на несколько действий меньше (не забываем, что для выполнения проверки серверу придётся обращаться к обеим переменным, что хранят текущую и предыдущую скорость, которые ещё и массивами будут => из-за кучи дополнительных генерируемых инструкций по обращению к ячейкам времени проверка условия будет занимать ещё дольше) и ради того, чтоб облегчить игру 1-му из 100-а игроков, ты жертвуешь процессорным временем...



Верхнее число - время выполнения цикла без условия, а нижнее, соответственно, с условием.
Слева данные в ситуации, когда проверка совпала, а справа - когда не совпала
http://i.imgur.com/JgmLG1G.png
Так как игрок чаще разгоняется, нежели держит одну скорость, гораздо чаще условие будет не совпадать

vovandolg
10.06.2017, 19:00
Ну так то да, до конца копнул, но бывают такие случаи где срабатывание TD часто не нужно и там разжёвываемый вариант темы с условиями подошёл бы.

DeimoS
11.06.2017, 14:28
Ну так то да, до конца копнул, но бывают такие случаи где срабатывание TD часто не нужно и там разжёвываемый вариант темы с условиями подошёл бы.

В таких ситуациях лучше сам таймер обновления убивать на время, пока обновлять текстдрав не нужно. Именно поэтому и следует все подобные вещи держать на отдельных индивидуальных таймерах: чтоб можно было в любой момент отключить таймер для одного игрока, но у второго он будет работать. В итоге будет на 10 строк больше, но в перспективе вы выиграете гораздо сильнее в плане процессорного времени

Nash_Brigers
12.06.2017, 22:14
Переместите уже тему в корзину, ответ на вопрос "найден"..