Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
  • 1
BorizzK

GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater

Обратил внимание на какой-то неведомый глюк с этим вызовом

GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater

 

Эти вызовы выполняются подряд с увеличением time

что бы сообщения появлялись не сразу

а через паузы между собой

первое через секунду, следующее через 2 и тп, те вызов идет в цикле с увеличением time

GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(Send_Chat_Message, (time * 1000), false, Player, Message);

Вобщем когда никого на сервере нет - все работает норм

Набежало игроков

Вроде пока все норм

Через какое-то время когда игроки там набегают и тп начинается

Send_Chat_Message выполняется после вызова не через time * 1000
А хрен знает как - может через указанное время, а может через 30 секунд, а  может через 60 секунд
Полная хрень какая-то

Что я делаю не так?

Может заменить CALL_CATEGORY_GAMEPLAY на CALL_CATEGORY_SYSTEM ?

 

Пока не проверял

 

Есть идеи?

 

 

 

 

 

Share this post


Link to post
Share on other sites

14 answers to this question

Recommended Posts

  • 0

Изменил  CALL_CATEGORY_GAMEPLAY на CALL_CATEGORY_SYSTEM 

 

Вроде работает, но надо часов 12 подождать

Share this post


Link to post
Share on other sites







  • 0

Вобщем хрень с calllater продолжается

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

 

Может есть средство посмотреть очередь в категории, уверен, что там в очереди мешает....

Ну или глюк движка

Share this post


Link to post
Share on other sites
  • 0

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

Edited by 123new (see edit history)

Share this post


Link to post
Share on other sites
  • 0

123new возможно

Блин

И никакого sleep нет

Пичалька (((

Какжеж ожидание организовать....

 

Походу придется мутить через OnUpdate серверный....

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
  • 0

ishkur Кстати, об этом я как-то не подумал. Интересная идея. Займусь на досуге )))

 

Есть такие нативные функции

GetGame().GetFps() и GetFPS()

 

над будет посмотреть что к чему

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

GetGame().GetFps() текущий фпс сервера

GetFPS() - это только для клиента

 

после старта на сервере FPS = 0.07

Через 12 часов работы

 

Share this post


Link to post
Share on other sites
  • 0
12 минуты назад, BorizzK сказал:

GetGame().GetFps() текущий фпс сервера

GetFPS() - это только для клиента

 

после старта на сервере FPS = 0.07

Через 12 часов работы

 

что у тебя на сервере происходит такое? это ж адовое что-то

Share this post


Link to post
Share on other sites
  • 0

123new 

0.07 постоянно с первого момента запуска

кстати так и не меняется

 

А что не так-то?

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

BorizzK 0.07 фпс при запуске сервера и в процессе его работы? ну как бы это нихрена не нормально, повод задуматься.
Для примера, если запустить сервер с отображением фпс в консоли сервера, то там за 1-2 к переваливает фпс при старте, но никак не 0.07

Share this post


Link to post
Share on other sites
  • 0

123new Ну ты добавь скажем в функцию которая каждую 1 минуту выполняется

Print("[Diag server]: Fps: " + GetGame().GetFps().ToString() + " : TickTime: " + GetGame().GetTickTime().ToString());

И сам все увидишь

Это не те fps похоже

 

P.S.Впрочем .ToString() не обязательно

print сам преобразует float и int в строку

 

Консоль сервера кажет - около 7000 - 7500 fps

Минимум 6800

Максимум 8300

 

Когда появляются игроки

около 3000

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Я столкнулся с аналогичной проблемой,а реальных таймеров в дейзе я не увидел. Мне желательно просто изменять на ходу длительность срабатывания таймера, но тут ещё и параша такая, что каждое новое включение этого CallLatera - уменьшает время срабатывания в 2 раза

Edited by Malinin (see edit history)

Share this post


Link to post
Share on other sites
  • 0

GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(имяфункции в классе/другом классе, время в мс, true/false (повторять не повторять), параметр, параметр итп);

имяфункции в классе/другом классе - например CallLater(player.G, время в мс, параметр, параметр итп);

Нужно помнить - если идет вызов функции которая должна вернуть значение, то она его не вернет - тк некуда
Однако, если в параметрах функции есть параметр out (один из вариантов передачи содержимого из функции), то если Вы укажете в параметрах вызова переменную класса,

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

Не рекомендуется в пределах одного класса запускать параллельно более 1 повторяющегося вызова
Я вообще рекомендую не использовать

 

CALL_CATEGORY_GAMEPLAY - Используется в основном на клиенте - вызов происходит только когда игрок подключен к серверу/запущен оффлайн (по моим наблюдениям)
На сервере выполняется только когда к серверу подключен хотя бы 1 игрок

Имеет низший приоритет

 

CALL_CATEGORY_SYSTEM - будет выполняться всегда, независимо не от чего

Имеет более низкий приоритет, чем очереди OnUpdate, класса Timer и других, поэтому иногда выполнение может произойти с задержкой

Дополнение
GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Call(имяфункции, параметр, параметр)
Вызывается функцию в следующем фрейме в соответствующем контексте  - с CALL_CATEGORY_GAMEPLAY используется только на клиенте, на сервере аналогично CallLater

На фпс сервера влияет мало

 

GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(имя функуции) - изымает функцию из шедулера если включено повторение выполнения или вызов еще не произошел

 


Timer.

 

Отдельный класс, предназначенный гарантированного выполнения вызываемой с задержкой или повторением функwии - по умолчанию контекст CALL_CATEGORY_SYSTEM

Пример

ref Timer mytimer; (в классе)

 

mytimer = new Timer; (или new Timer(CALL_CATEGORY_SYSTEM))

mytimer.Run(время в секундах,this , "имяфункции в классе", набор параметров (либо null), true/false (повторять/не повторять))

Выполнит с задержкой или будет выполнять с повторением функцию из текущего класса (this) или другого (указать вместо this имя соответствующего класса)
Параметры передаются - либо через набор параметров (класс Param) либо указать null и использовать для этого переменные класса
 

Вообще в файлах есть масса примеров

 

Пример Call и CallLater;
 

class MyClass
{

	bool m_State;
	int  m_time = 10000;

	void MyClass
	{
		GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).Call(Init);
	}

    void Init
    {
        GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(myfunc, 1000, false);
    }

   void myfunc()
    {
        if (!m_State)
        {
            GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(myfunc, m_time, false);
        }
		else
		{
			Print ("m_State = true. FINISH!");
		}
    }

	void SetStateTrue()
	{
		m_State = true;
	}
}

Примерт Timer

class MyClass
{

	bool m_State;
	int  m_time = 10;
	ref Timer mytimer;	


	void MyClass
	{
		Init();
	}

    void Init
    {	mytimer = new Timer;	
        mytimer.Run(10,this,"myfunc",null,true);
    }

   void myfunc()
    {
        if (m_State)
        {
            Print ("m_State = true. FINISH!");
			mytimer.Stop();
        }
    }

	void SetStateTrue()
	{
		m_State = true;
	}
}

Есть еще масса вариантов использования

 

А еще есть AnimationTimer

 

И можно создавать свои таймеры инжектируя свои функции в очередь OnUpdate (наивысший приоритет)

и еще варианты

 

PS Если гдет ошибся -сорри - бухосапиенс )))

 

Edited by BorizzK (see edit history)

Share this post


Link to post
Share on other sites
  • 0

Касательно таймеров более подробно нашёл, мб кому пригодится

class MyObject
 {
	ref Timer myTimer1;
	ref Timer myTimer2;
	ref Timer myTimer3;

	void MyObject()
	{
		myTimer1 = new Timer();
		myTimer1.Run(10, this, "Refresh"); // calls "Refresh" on "this" after 10 seconds

		myTimer2 = new Timer();
		myTimer2.Run(10, this, "Refresh", NULL, true); // calls "Refresh" on "this" every 10 seconds, until Pause or Stop is called

		myTimer3 = new Timer();
		myTimer3.Run(15, this, "Show", new Param1<bool>(false)); // calls "Show" on "this" with one bool argument after 15 seconds
	}

	void Refresh();
	void Show(bool visible);
 }

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.