Photon server основной цикл

Photon server основной цикл

Сообщение shade007 11 ноя 2014, 03:32

Собственно надо найти место куда вставить обновление позиции ботов по времени, а вот где этот цикл в фотоне который бы постоянно повторялся ума не приложу , помогите пожалуйста :ympeace:
shade007
UNец
 
Сообщения: 34
Зарегистрирован: 03 фев 2014, 00:06

Re: Photon server основной цикл

Сообщение ximael 11 ноя 2014, 11:55

Код: Выделить всё
private Action updateAction = new Action(ActCode.GAME_UPDATE);;

public StartGame()
{
   ScheduleAction(updateAction);
}

public void EnqueueOperation(ZPeer peer, OperationRequest operationRequest, SendParameters sendParameters)
{
   executionFiber.Enqueue(() => ExecuteOperation(peer, operationRequest, sendParameters));
}
public void EnqueueAction(Action action)
{
   executionFiber.Enqueue(() => ProcessAction(action));
}
public IDisposable ScheduleAction(Action action, long timeMs)
{
   return executionFiber.Schedule(() => ProcessAction(action), timeMs);
}

protected void ProcessAction(Action action)
{
   switch (action.actionCode)
   {
      case ActCode.GAME_UPDATE:
         Update();
         break;
      default:
         log.ErrorFormat("Game.ProcessAction: ERROR: Uncknown actionCode={0}", action.actionCode);
         break;
   }
}

public void Update()
{
   ...
   ScheduleAction(updateAction, 50);//повторить через 50 миллисекунд
}
Музыка и звуковой дизайн для игр
Bomb Heroes - Бомбермен онлайн
ximael
UNец
 
Сообщения: 36
Зарегистрирован: 20 апр 2013, 00:23

Re: Photon server основной цикл

Сообщение shade007 11 ноя 2014, 17:02

ximael писал(а):
Код: Выделить всё
private Action updateAction = new Action(ActCode.GAME_UPDATE);;

public StartGame()
{
   ScheduleAction(updateAction);
}

public void EnqueueOperation(ZPeer peer, OperationRequest operationRequest, SendParameters sendParameters)
{
   executionFiber.Enqueue(() => ExecuteOperation(peer, operationRequest, sendParameters));
}
public void EnqueueAction(Action action)
{
   executionFiber.Enqueue(() => ProcessAction(action));
}
public IDisposable ScheduleAction(Action action, long timeMs)
{
   return executionFiber.Schedule(() => ProcessAction(action), timeMs);
}

protected void ProcessAction(Action action)
{
   switch (action.actionCode)
   {
      case ActCode.GAME_UPDATE:
         Update();
         break;
      default:
         log.ErrorFormat("Game.ProcessAction: ERROR: Uncknown actionCode={0}", action.actionCode);
         break;
   }
}

public void Update()
{
   ...
   ScheduleAction(updateAction, 50);//повторить через 50 миллисекунд
}

И куда мне в фотон сервере все это вставлять? Это не фотон клауд случаем?
shade007
UNец
 
Сообщения: 34
Зарегистрирован: 03 фев 2014, 00:06

Re: Photon server основной цикл

Сообщение Woolf 11 ноя 2014, 18:45

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

Вот пример такого треда, в который можно прописать временные события:
Синтаксис:
Используется csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using ExitGames.Logging;

class TimeEventerThread {

    public class BaseTimeEvent {
        private readonly int waitTime; //Время срабатывания в секундах
        private readonly bool once; //Признак одноразового срабатывания
        private long lastTime; //Время последнего срабатывания
        public bool isDel;//Флаг снятия ивента

        public bool isOnce { get { return once; } }

        public BaseTimeEvent(int aWait, bool aOnce) {
            waitTime = aWait;
            once = aOnce;
            lastTime = Environment.TickCount;
        }

        public bool checkDoWork() {
            long dtime = Environment.TickCount - lastTime;
            return dtime / 1000 > waitTime;
        }

        public virtual void doWork() {
            lastTime = Environment.TickCount;
        }
    }

    public static readonly TimeEventerThread getI = new TimeEventerThread();
    private readonly List<BaseTimeEvent> timeEvents = new List<BaseTimeEvent>();
    private Thread mainThread;
    private static readonly ILogger log = LogManager.GetCurrentClassLogger();

    public void runManager() {
        mainThread = new Thread(doWork);

        //------------------------------------------------------
        addTimeEvent(new Cleaner());
        addTimeEvent(new StaticItemsMgr());
        addTimeEvent(new Rebooter());

        //------------------------------------------------------
        mainThread.Start();
    }

    public void addTimeEvent(BaseTimeEvent evnt) {
        lock (timeEvents) {
            timeEvents.Add(evnt);
        }
    }

    public void removeTimeEvent(BaseTimeEvent evnt) {
        lock (timeEvents) {
            timeEvents.Remove(evnt);
        }
    }

    public void stopManager() {
        mainThread.Abort();
        lock (timeEvents) {
            timeEvents.Clear();
        }
    }

    private void doWork() {

        while (true) {
            // log.Debug("DoWork PIU!");

            lock (timeEvents) {

                foreach (var evnt in timeEvents.Where(evnt => evnt.checkDoWork())) {
                    evnt.doWork();
                    if (evnt.isOnce) evnt.isDel = true;
                }

                int i = 0;
                while (i < timeEvents.Count) {
                    if (timeEvents[i].isDel) {
                        timeEvents.RemoveAt(i);
                    } else i++;
                }
            }

            Thread.Sleep(500);
        }
    }

}


Ключевая функция тут doWork - она работает параллельно всему серверу. У меня - она вызывает временные события, у вас - может делать что угодно. Не забывайте тока делать sleep иногда, иначе будет нагрузка большая.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Photon server основной цикл

Сообщение ximael 12 ноя 2014, 10:34

И куда мне в фотон сервере все это вставлять? Это не фотон клауд случаем?

это именно фотон сервер, смотри исходники light.
http://forum.exitgames.com/viewtopic.php?f=5&t=1369
http://forum.exitgames.com/viewtopic.php?f=5&t=234
Музыка и звуковой дизайн для игр
Bomb Heroes - Бомбермен онлайн
ximael
UNец
 
Сообщения: 36
Зарегистрирован: 20 апр 2013, 00:23


Вернуться в Photon

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2