PDA

Просмотр полной версии : [Function] IsPlayerInVehicle



Prolific
21.04.2016, 10:10
Всем привет, давно использую у себя в модах свою функцию IsPlayerInVehicle_Ex
Её плюсы:

Работает быстрее нежели стандартный IsPlayerInVehicle
Заменяет native GetPlayerVehicleID
Заменяет native IsPlayerInAnyVehicle


Параметры: ИД игрока.
Возвращает: ИД т/с, в противном случае 0 (иды машин стартуют с 1, так что все очень удобно).

Кстати, надеюсь я не изобрел велосипед, ибо на форумах такого не видел.

Суть:
В начало мода кидаем массивчик (обнуляйте его при выходе игрока).

new Player_Veh_ID[MAX_PLAYERS];
Делаем дефайн для удобства:

#define IsPlayerInVehicle_Ex(%0) Player_Veh_ID[%0]
В OnPlayerStateChange

if(newstate == PLAYER_STATE_DRIVER) Player_Veh_ID[playerid] = GetPlayerVehicleID(playerid);
else if(oldstate == PLAYER_STATE_DRIVER) Player_Veh_ID[playerid] = 0;


Тесты скорости:

public OnPlayerStateChange(playerid, newstate, oldstate)
{
new tick = GetTickCount();
if(newstate == PLAYER_STATE_DRIVER)
{
Player_Veh_ID[playerid] = GetPlayerVehicleID(playerid);
for(new i, a; i < 1000000; i++)
{
a += IsPlayerInVehicle_Ex(playerid);
}
printf("IsPlayerInVehicle_Ex = %i", GetTickCount() - tick);
tick = GetTickCount();
for(new i; i < 1000000; i++)
{
GetPlayerVehicleID(playerid);
}
printf("GetPlayerVehicleID = %i", GetTickCount() - tick);
tick = GetTickCount();
for(new i; i < 1000000; i++)
{
IsPlayerInVehicle(playerid, i);
}
printf("IsPlayerInVehicle = %i", GetTickCount() - tick);
SCMTA(-1, "ALL");
}
else if(oldstate == PLAYER_STATE_DRIVER) Player_Veh_ID[playerid] = 0;
return 1;
}


1)
[14:45:55] IsPlayerInVehicle_Ex = 210
[14:45:56] GetPlayerVehicleID = 593
[14:45:57] IsPlayerInVehicle = 941
2)
[14:46:19] IsPlayerInVehicle_Ex = 168
[14:46:20] GetPlayerVehicleID = 716
[14:46:21] IsPlayerInVehicle = 957
3)
[15:49:42] IsPlayerInVehicle_Ex = 231
[15:49:43] GetPlayerVehicleID = 945
[15:49:44] IsPlayerInVehicle = 974

TheMallard
21.04.2016, 10:30
if(!GetPlayerVehicleID(playerid)
???

Prolific
21.04.2016, 10:35
if(!GetPlayerVehicleID(playerid)
???

Тесты скорости...

Кстати функция не нужна, приду домой переделаю под define для правильности восприятия. Хотя можно напрямую работать с переменной.

Daniel_Cortez
21.04.2016, 11:23
В начало мода кидаем массивчик (обнуляйте его при выходе игрока).

В OnPlayerStateChange

Сама функция
Разбрасывать по моду прибитые друг к другу гвоздями отрывки кода - и всего лишь ради одной функции... Это такая мода ставить палки к себе в колёса?

http://pro-pawn.ru/showthread.php?10447

Prolific
21.04.2016, 11:31
Почему сразу палки, ради двух строк писать перехват...

Nash_Brigers
21.04.2016, 12:28
Разбрасывать по моду прибитые друг к другу гвоздями отрывки кода - и всего лишь ради одной функции... Это такая мода ставить палки к себе в колёса?

http://pro-pawn.ru/showthread.php?10447
Как по мне, "палки" - это когда ради одной мизерной проверки Вы перехватываете кэлбек)

vovandolg
21.04.2016, 13:37
ффф)) ну это хорошо что ты умный такой и написал это, но когда измеряешь скорость не забывай её измерять в общем везде.
Потому что ты нагрузил калбэк и не измерил его новую медленную скорость и новую нагрузку.
Функция то быстро выполнятся стала, но калбэк ты нагрузил.
Это тоже самое что тебя в магазин послали, а ты послал брата или сестру, один чёрт кто то, но пойдёт в магазин ...

Prolific
21.04.2016, 14:45
ффф)) ну это хорошо что ты умный такой и написал это, но когда измеряешь скорость не забывай её измерять в общем везде.
Потому что ты нагрузил калбэк и не измерил его новую медленную скорость и новую нагрузку.
Функция то быстро выполнятся стала, но калбэк ты нагрузил.
Это тоже самое что тебя в магазин послали, а ты послал брата или сестру, один чёрт кто то, но пойдёт в магазин ...

Улови суть. В коллбэке мы вызываем затратную функцию всего 1 раз. В цикле вызываеи 100тыс. То есть смотри, ты сел в авто, функция вызвалась. После в любых командах, циклах, короче в любых кусках кода тебе уже не нужно вызывать GetPlayerVehicleID, а всего лишь прочитать значение переменной. В этом и вся суть.

vovandolg
21.04.2016, 15:02
записать в переменную и есть вызвать один раз, что так ты раз записывал что получилось раз:smoke:

- - - Добавлено - - -

Хотя если так подумать и не смотря на увеличенный объём ты сделал разгрузку, у меня в моде так всё равно идёт вызов узнавания VehID

Prolific
21.04.2016, 15:53
записать в переменную и есть вызвать один раз, что так ты раз записывал что получилось раз:smoke:

- - - Добавлено - - -

Хотя если так подумать и не смотря на увеличенный объём ты сделал разгрузку, у меня в моде так всё равно идёт вызов узнавания VehID

У тебя например цикл в моде:

for(new i; i < MAX_PLAYERS; i++)
{
if(GetPlayerVehicleID(i)) return 1;
}
Если все игроки сидят в авто, то функция GetPlayerVehicleID вызовется 1000 раз.
А теперь мой код:

for(new i; i < MAX_PLAYERS; i++)
{
if(IsPlayerInVehicle_Ex(i)) return 1;
}
Так же мы вызовем IsPlayerInVehicle_Ex 1000 раз, НО мы всего лишь будем читать значение переменной, а не посылать запрос, получать ответ...

Я думал, что принцип тривиален и не нуждается в объяснениях.

vovandolg
21.04.2016, 18:57
ты не забывай про калбэк! мы тут с самого начала видим результаты, просто не забывай что ты слил нагрузку в калбэк!

Daniel_Cortez
21.04.2016, 20:44
Как по мне, "палки" - это когда ради одной мизерной проверки Вы перехватываете кэлбек)
В таком случае у вас какое-то странное представление о понятии палки.
Да, решение с перехватом сложнее сделать, но им проще пользоваться: если понадобится изменить или удалить код решения, достаточно будет найти один участок кода, а не несколько, разбросанных по всему моду.
И если выкладываете работу на всеобщее обозрение, следует быть готовым сделать её максимально удобной для конечного пользователя.
Впрочем, я не стану утверждать, что решение с перехватом будет удобно абсолютно для всех. Некоторым удобнее засорять мод привязанными друг к другу кусками кода, чтобы в конечном счёте запутаться в них, как в паутине, другие привыкли ковыряться в г- RLS, а кому-то нравится садо-мазо. Таких людей вряд ли что-то изменит.



Тесты скорости:
Не стал смотреть результаты, поскольку в них запросто может вмешаться любой другой процесс - например, если антивирус начнёт что-то проверять, то результаты одного или нескольких из тестируемых субъектов ухудшатся.
Если хотите добиться более-менее достоверных результатов, делайте тест со вложенными циклами, чтобы каждый тестируемый отрывок кода выполнялся много раз - так удастся сгладить скачки нагрузки по всем отрывкам.
Готовое решение уже есть: http://pro-pawn.ru/showthread.php?12585

В общем, что хотелось бы сказать про эту тему... Как я уже говорил, разбрасывать код по всему скрипту ради одной функции - далеко не самая лучшая идея.
Да и сама тема в таком виде больше похожа на мануал, поэтому хотелось бы видеть более удобное для использования решение.
А те работы, что из разряда "так сойдёт", "сделал как есть, доделывайте сами" или "скажите ещё спасибо, что выложил" - ими уже давно всякие г-и и им подобные свалки завалены.

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

Desulaid
21.04.2016, 22:16
Ты тестируешь вызов функций и обращение к массиву. Результат тестирования недостоверный выходит :с

Prolific
22.04.2016, 00:48
В таком случае у вас какое-то странное представление о понятии палки.
Да, решение с перехватом сложнее сделать, но им проще пользоваться: если понадобится изменить или удалить код решения, достаточно будет найти один участок кода, а не несколько, разбросанных по всему моду.
И если выкладываете работу на всеобщее обозрение, следует быть готовым сделать её максимально удобной для конечного пользователя.
Впрочем, я не стану утверждать, что решение с перехватом будет удобно абсолютно для всех. Некоторым удобнее засорять мод привязанными друг к другу кусками кода, чтобы в конечном счёте запутаться в них, как в паутине, другие привыкли ковыряться в г- RLS, а кому-то нравится садо-мазо. Таких людей вряд ли что-то изменит.



Не стал смотреть результаты, поскольку в них запросто может вмешаться любой другой процесс - например, если антивирус начнёт что-то проверять, то результаты одного или нескольких из тестируемых субъектов ухудшатся.
Если хотите добиться более-менее достоверных результатов, делайте тест со вложенными циклами, чтобы каждый тестируемый отрывок кода выполнялся много раз - так удастся сгладить скачки нагрузки по всем отрывкам.
Готовое решение уже есть: http://pro-pawn.ru/showthread.php?12585

В общем, что хотелось бы сказать про эту тему... Как я уже говорил, разбрасывать код по всему скрипту ради одной функции - далеко не самая лучшая идея.
Да и сама тема в таком виде больше похожа на мануал, поэтому хотелось бы видеть более удобное для использования решение.
А те работы, что из разряда "так сойдёт", "сделал как есть, доделывайте сами" или "скажите ещё спасибо, что выложил" - ими уже давно всякие г-и и им подобные свалки завалены.

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

Дорогой Кортез, я был бы согласен с тобой, если бы это был include, НО это не тот случай, когда нужно создавать инклуд ради пары строк, это лишь маленькая шестеренка, которую можно красиво прикрутить (никакой это не гавнокод, если бы тут было 100 строк по 5 строк на каждый коллбэк, тогда безусловно лучше было бы это засунуть в инклуд, но это не тот случай).

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

P.S. Кстати, эту тему не помешало бы перенести в мануалы.
P.P.S. И да, я никогда не писал и писать так не буду: "так сойдёт", "сделал как есть, доделывайте сами" или "скажите ещё спасибо, что выложил". Так что не нужно из меня делать идиота и гнать с форума, спасибо за понимание.

ziggi
22.04.2016, 01:00
это лишь маленькая шестеренка, которую можно красиво прикрутить

Красиво прикрутить, это когда ты пишешь #include "some" и получаешь полностью рабочую систему, без необходимости лезть куда-либо, заменять какие-либо функции и прочего.

Prolific
22.04.2016, 01:04
Красиво прикрутить, это когда ты пишешь #include "some" и получаешь полностью рабочую систему, без необходимости лезть куда-либо, заменять какие-либо функции и прочего.

просто когда в моде соберется под 100-ку инклудов будет немножечко проблематично, вам не кажется? (Обращаюсь к Ziggi и Cortez)

Daniel_Cortez
22.04.2016, 10:12
просто когда в моде соберется под 100-ку инклудов будет немножечко проблематично, вам не кажется? (Обращаюсь к Ziggi и Cortez)
Первостепенные инклуды типа a_mysql.inc, sscanf2.inc, dc_cmd.inc etc. вынести в самое начало списка, а остальные, в которых всего несколько функций или какая-нибудь система - поставить ниже. В чём проблема?

ziggi
22.04.2016, 11:04
просто когда в моде соберется под 100-ку инклудов будет немножечко проблематично, вам не кажется? (Обращаюсь к Ziggi и Cortez)

Нет, у меня около 200 инклудов, очень удобно. Гораздо удобнее, чем копошиться в одном файле на 40к строк.

Prolific
22.04.2016, 17:47
Нет, у меня около 200 инклудов, очень удобно. Гораздо удобнее, чем копошиться в одном файле на 40к строк.

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

P.S. Поскольку многие имеют такое же мнение, как и я, я останусь при нем. Хотя может быть это и вредная привычка и в остальных языках это не приветствуется, но в павн это распространенная практика, поэтому всем скриптерам удобнее понимать код именно в таком формате, как подал его я.

$continue$
22.04.2016, 18:12
Чуваку, плохо! Псих бригаду в его дом, срочно!

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

Ну есть много других редакторов кроме pawno?


Вот если программировать в вижле например, там удобно работать с инклудами, т.к. там есть вкладки и можно быстро переключаться между ними, а в данном случае мне это не нравится.

Prolific
22.04.2016, 19:28
Чуваку, плохо! Псих бригаду в его дом, срочно!

Ну есть много других редакторов кроме pawno?
Так они же в твоем доме заняты делом.
Пробовал, SunWrite (вроде так называется), не понравился.

$continue$
22.04.2016, 20:27
В моем доме царит чистота и покой. Это ты (ЗАМЕТЬ НЕ Я (ВЫДЕЛЮ ЭТО КРАСНЫМ)) говоришь, что многомодульность - бред и оно не нужно. Иди расскажи Страуструпу.

Так они же в твоем доме заняты делом.
Пробовал, SunWrite (вроде так называется), не понравился.

Prolific
22.04.2016, 20:43
В моем доме царит чистота и покой. Это ты (ЗАМЕТЬ НЕ Я (ВЫДЕЛЮ ЭТО КРАСНЫМ)) говоришь, что многомодульность - бред и оно не нужно. Иди расскажи Страуструпу.

Абсолютно нарушил ты смысл моего повествования. Я сказал что в PAWN это не популярно. Отмечу, не во всех ЯП, в в PAWN, так что не нужно коверкать смысл. И кстати, до тебя 2 критика критиковали действительно агрументированно, а вот ты похож на школоту немного, хотя это и не так, пересмотри свое отношение к другим, а то сильно импульсивно и немного ложно наговариваешь.

$continue$
22.04.2016, 21:00
Так мне не чего добавить к ziggi и DC.

Абсолютно нарушил ты смысл моего повествования. Я сказал что в PAWN это не популярно. Отмечу, не во всех ЯП, в в PAWN, так что не нужно коверкать смысл. И кстати, до тебя 2 критика критиковали действительно агрументированно, а вот ты похож на школоту немного, хотя это и не так, пересмотри свое отношение к другим, а то сильно импульсивно и немного ложно наговариваешь.

Prolific
22.04.2016, 21:02
Так мне не чего добавить к ziggi и DC.

Так смысл набивать посты?