Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной

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

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 ?

 

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

 

Есть идеи?

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 0

Изменил  CALL_CATEGORY_GAMEPLAY на CALL_CATEGORY_SYSTEM 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах





  • 0

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Изменено пользователем 123new (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

123new возможно

Блин

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

Пичалька (((

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

 

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

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

 

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

GetGame().GetFps() и GetFPS()

 

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

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

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

 

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
12 минуты назад, BorizzK сказал:

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

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

 

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

123new 

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

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

 

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

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Изменено пользователем Malinin (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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 Если гдет ошибся -сорри - бухосапиенс )))

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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);
 }

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×
×
  • Создать...

Важная информация

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