SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian

Reply
 
Thread Tools Display Modes
Old 31/01/2018, 04:11 AM   #21
Jasno
Little Clucker
 
Join Date: Nov 2017
Posts: 15
Reputation: 0
Default Re: Не убиваются таймеры

Quote:
Originally Posted by Eims View Post
Это вообще что за ужас?
Один совет лучше другого
Для кого как, у меня всё замечательно работает таким образом, были дикие лаги из-за таймеров 100 , т.к. все выполняется поочерёдно , плюс рассинхронизированное обновление чего либо что в этом таймере. Где вы ужас то нашли ?
Jasno is offline   Reply With Quote
Old 31/01/2018, 05:45 AM   #22
Eims
Huge Clucker
 
Eims's Avatar
 
Join Date: May 2013
Location: Восточный Мордор
Posts: 418
Reputation: 12
Default Re: Не убиваются таймеры

Quote:
Originally Posted by Jasno View Post
Для кого как, у меня всё замечательно работает таким образом, были дикие лаги из-за таймеров 100 , т.к. все выполняется поочерёдно , плюс рассинхронизированное обновление чего либо что в этом таймере. Где вы ужас то нашли ?
Выше уже объяснили всё, не? Ну давай повторю.
Так как данный таймер будет вызываться каждую секунду, код в нём должен быть максимально оптимизированным, ибо одна упущенная миллисекунда через час работы таймера будет равна 3600 миллисекундам. Соответственно, чем больше говнокода в таймере, тем больше будет задержка и больше времени будет утеряно.
В твоём случае ты мало того, что в этот таймер запихнул цикл (решается индивидуальными таймерами), так ещё и каждую итерацию цикла делаешь обращение к двум нативкам, что будет дополнительно сжирать время (решается при помощи foreach, хотя, в случае индивидуальных таймеров, решать подобное не придётся).

Вообще идея запихивать в один таймер кучу всего (античиты/спидометр и т.п.) - лютый треш. По хорошему, следует для каждой системы/группы систем создавать свой таймер, хотя бы для того, чтоб иметь возможность выполнять код этих систем только когда это действительно нужно, а не заставлять сервер каждую итерацию таймера проверять, совпадает ли условие и нужно ли выполнять последующий код. Это сожрет дополнительной памяти, но хорошо скажется на производительности.
__________________
- How many IT Engineers does it take to fix a broken light bulb?
- None, the light bulb works fine in my office, I cannot replicate the issue.
Eims is offline   Reply With Quote
Old 31/01/2018, 09:20 AM   #23
Jasno
Little Clucker
 
Join Date: Nov 2017
Posts: 15
Reputation: 0
Default Re: Не убиваются таймеры

Quote:
Originally Posted by Eims View Post
Выше уже объяснили всё, не? Ну давай повторю.
Так как данный таймер будет вызываться каждую секунду, код в нём должен быть максимально оптимизированным, ибо одна упущенная миллисекунда через час работы таймера будет равна 3600 миллисекундам. Соответственно, чем больше говнокода в таймере, тем больше будет задержка и больше времени будет утеряно.
В твоём случае ты мало того, что в этот таймер запихнул цикл (решается индивидуальными таймерами), так ещё и каждую итерацию цикла делаешь обращение к двум нативкам, что будет дополнительно сжирать время (решается при помощи foreach, хотя, в случае индивидуальных таймеров, решать подобное не придётся).

Вообще идея запихивать в один таймер кучу всего (античиты/спидометр и т.п.) - лютый треш. По хорошему, следует для каждой системы/группы систем создавать свой таймер, хотя бы для того, чтоб иметь возможность выполнять код этих систем только когда это действительно нужно, а не заставлять сервер каждую итерацию таймера проверять, совпадает ли условие и нужно ли выполнять последующий код. Это сожрет дополнительной памяти, но хорошо скажется на производительности.
про 3600 поконкретнее, просто я чёт не понимаю. Имеешь в виду что таймер будет потом через 3600 выполняться или просто что за это время 3600 миллисекунд пропадёт , как по типу поставить таймеру раз в 501 или раз в 502. На практике с 2012 юзаю 1 таймер, всё время были какие либо проблемы с кучей, да и как то логика подсказывала что при онлайне 200+ каждые 10 миллисекунд один и тот же код не есть хорошо.
Jasno is offline   Reply With Quote
Old 31/01/2018, 10:02 AM   #24
OstGot
Gangsta
 
OstGot's Avatar
 
Join Date: Mar 2013
Location: Gomel, Belarus
Posts: 692
Reputation: 293
Default Re: Не убиваются таймеры

Quote:
Originally Posted by Jasno View Post
На практике с 2012 юзаю 1 таймер, всё время были какие либо проблемы с кучей, да и как то логика подсказывала что при онлайне 200+ каждые 10 миллисекунд один и тот же код не есть хорошо.
Только ты не учитываешь, что каждые 10 мс будет выполняться одна сотая (а вернее одна от MAX_PLAYERS, смотря чему у тебя она равна) часть того глобального таймера, который вызывается у тебя раз в секунду, и следовательно то, что вызывается раз в секунду у тебя будет в MAX_PLAYERS раз дольше, чем код для единичного игрока. Прикол тут в том, что один таймер с циклом даёт эту нагрузку разово и ощущаться при игре она будет больше. Смотри это как на задержку сервера (к примеру) в 0,54 мс от каждого игрока каждые 10 мс, и (к примеру) в 54 мс при цикле для всех каждую секунду. Уверен, второе заметить при игре проще.

P.s.
Quote:
Originally Posted by Mexanizm93 View Post
Чем же хуже, когда один глобальный таймер обрабатывает игроков циклом ? А создавать на каждого игрока таймер и выполнять тот же самый код не хуже, если можно обойтись одним зацикленным ? На мой взгляд, единый таймер на игроков лучше.
Вдобавок ко всему выше, глобальный таймер без foreach бегает циклом по всем слотам на сервере вообще (или почти по всем, если используешь GetPlayerPoolSize). Имея иды 3, 24 и 31 онлайн (всего 3 игрока), цикл в таймере без foreach в лучшем случае пробежит от 0 до 31 слота, а индивидуальные таймеры, т.к. создаются и выполняются только для онлайн игроков, имеют таким образом преимущество как у foreach.
__________________
aka Nexius
Don't want to always check for updates of my scripts?
Include it the last, after all others
Nexius's Update Checker
OstGot is offline   Reply With Quote
Old 01/02/2018, 08:45 AM   #25
Eims
Huge Clucker
 
Eims's Avatar
 
Join Date: May 2013
Location: Восточный Мордор
Posts: 418
Reputation: 12
Default Re: Не убиваются таймеры

Quote:
Originally Posted by Jasno View Post
про 3600 поконкретнее, просто я чёт не понимаю. Имеешь в виду что таймер будет потом через 3600 выполняться или просто что за это время 3600 миллисекунд пропадёт
Второе (за это время пропадёт 3600 миллисекунд). Соответственно, все остальные системы в моде, что будут на очереди в обработку после вызова таймера, будут выполняться на 1 миллисекунду позже. Сюда же приплюсовываем задержки во всех остальных системах и на выходе получаем лаги, проблемы с таймерами (коллизия в таймерах как раз из-за подобного и происходит) и прочие радости.



Quote:
Originally Posted by Jasno View Post
На практике с 2012 юзаю 1 таймер, всё время были какие либо проблемы с кучей, да и как то логика подсказывала что при онлайне 200+ каждые 10 миллисекунд один и тот же код не есть хорошо.
Вдобавок к сообщению OstGot хочу сказать лишь то, что во всех проблемах, что у тебя были с индивидуальными таймерами, виноват только ты сам и твоя невнимательность. Если понимать то, что ты делаешь и как это будет работать, проблем никаких не будет.
__________________
- How many IT Engineers does it take to fix a broken light bulb?
- None, the light bulb works fine in my office, I cannot replicate the issue.
Eims is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Таймеры Josipo Русский/Russian 4 17/01/2016 05:02 PM
Таймеры Prolific Русский/Russian 7 30/08/2015 03:41 PM
Таймеры AlexeyTrekkkk Русский/Russian 14 21/07/2014 01:14 AM


All times are GMT. The time now is 12:07 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.