Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2016, 12:43   #21
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от max_prorok Посмотреть сообщение
Я просто думал, это делать именно в виде сортировке в самом начале, чтобы в обработчике таймера код занимал как можно меньше времени. А то пока он найдет в коллекции нужную строчку, то пройдет больше времени, чем выберет просто первую. Не исключаю, что вы правы. Попробую тогда написать попроще, через Dictionary<Mob,int>.
Или же все-таки использовать List<>, дабы время не тратить на перевод в хэш-код? Хотя на данном этапе пожалуй лучше об этом не думать. Оптимизацию оставить на потом
у вас не может быть сортировки по времени в принципе, мобы всегда выполняют действие, и всегда есть только одно активное действие на моба.
вам надо каждое активное действие отбавлять, а не искать короткое.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.06.2016, 14:05   #22
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

Не совсем понял смысл. Не могли бы пояснить более развернуто?
max_prorok вне форума Ответить с цитированием
Старый 27.06.2016, 14:51   #23
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас есть же список действий что выполняются сейчас, как я понял он привязан у вас не к мобу, а к миру, но это не так важно.
у вас же не один моб в мире действует, а все, значит всегда надо проходить по всему списку.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.06.2016, 17:19   #24
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

Не совсем так.
Правильней будет сказать, что все действия мобов состоят из действия и задержки.
Вот например. Моб двигается со скоростью 2 клетки в секунду. Т.е. его действия следующие: получил команду двигаться, подождал 500 мс, сместился на соседнюю клетку, подождал 500 мс, сместился на соседнюю клетку.
Другой пример. Моб атакует со скоростью 5 атак в секунду. Его действия: получил команду атаковать, ждет 200 мс, наносит урон, ждет 200 мс, наносит урон и т.д.
Так вот я предполагал сделать все следующим образом. Вот поступило от каждого моба команда, что он делает. Они записываются в сортируемый по времени задержки лист. Работает таймер, который каждую мс добавляет переменную. Сравнивает, пришло ли время для действия того или иного моба. Если нет, то ничего не происходит. Если такое время настало, то он вызывает метод действия моба (переместиться на соседнюю клетку, нанести урон и пр.). Возможен вариант, когда действия разных мобов происходят в одно и того же время. Поэтому в таймере запускается цикл, который запускает все действия мобов, время которых настало. После чего удаляет их из очереди. Вычитает из всех остальных задач время, какое натикало и сбрасывает счетчик времени и опять тикает пока не настанет время следующего действия.
max_prorok вне форума Ответить с цитированием
Старый 27.06.2016, 17:23   #25
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

просто храните в каждом мобе сколько он еще должен быть в задержке, не усложняйте.
и потом проходя по списку всех мобов отнимаете, а если задержка стала <=0 тогда можно делать след действие.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.06.2016, 16:23   #26
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

Попробовал. Пошло вроде более менее. Но!
Почему задержка такая большая? Выставляешь задержку в 1000 мс, а вывод происходит примерно раз в 16 секунд?
Решил сделать вообще все просто. Вот так:
Код:
private void Tick(object sender, ElapsedEventArgs e)
        {
            for (int i=0; i<30; i++)
            Console.WriteLine(DateTime.Now.Millisecond);
        }
По идее, я рассчитывал на то, что будет выводиться 30 раз одно и тоже число. А нет, за время цикла вывод отличается примерно в 25, т.е. в первой итерации цикла скажем выводится 485, а в последней 510. Неужели вывод на консоль так много времени занимает? Я конечно не знаю, может это связано с тем, что это запущено в режиме отладки... Может в релизе все будет норм?

P.S. Попробовал запустить дебаг екзешник не через студию, а на прямую, время на цикл сократилось до 5 мс. Хорошо, но как-то все равно много для такой простейшей программки. Ну и собственно задержка между циклами не равна интервалу (на данный момент стоит 100, а на самом деле около 104-105мс).

Последний раз редактировалось max_prorok; 28.06.2016 в 16:36.
max_prorok вне форума Ответить с цитированием
Старый 28.06.2016, 16:43   #27
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

любой вывод это не мгновенная операция,потому лучше не выводить если нет необходимости.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.10.2016, 10:48   #28
max_prorok
Форумчанин
 
Регистрация: 06.10.2011
Сообщений: 181
По умолчанию

Прошу прощения за поднятие темы, которая давно обсуждалась.
Но тут появилась новая идея.
Заключается она в том, чтобы отказаться от таймера. А завязать все действия на таймер, который работает всегда - то есть, внутренние часы компьютера.
Поясню. Например, в методе жизни локации, в котором работает цикл, в котором думают все жители локации по кругу, в самом начале в переменную записывать время компьютера. На какое-то действие моба, допустим переход на соседнюю клетку заложена задержка в 500 мс. Так вот, моб подумал, что ему надо перейти на соседнюю клетку. В этот момент записываем, в его внутреннюю переменную DateTime записать значение DateTime.Now+500ms. Далее цикл проходит. Считывается новое значение времени сервера. Когда доходит до нужного моба, сравнивается время сервера и время записанное в переменную моба. Если время в переменной моба меньше или равно времени сервера, то моб делает шаг, если нет, то продолжает стоять на месте.
Подскажите, на сколько такой подход хорош? Не будет ли задержка слишком большой?

P.S. Есть еще идея вместо List<Mob> использовать LinkedList<Mob>. Будет ли от этого алгоритм работать быстрее? Или в принципе все равно?
max_prorok вне форума Ответить с цитированием
Старый 11.10.2016, 22:02   #29
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Цитата:
Сообщение от max_prorok Посмотреть сообщение
Я просто думал, это делать именно в виде сортировке в самом начале, чтобы в обработчике таймера код занимал как можно меньше времени. А то пока он найдет в коллекции нужную строчку, то пройдет больше времени, чем выберет просто первую. Не исключаю, что вы правы. Попробую тогда написать попроще, через Dictionary<Mob,int>.
Или же все-таки использовать List<>, дабы время не тратить на перевод в хэш-код? Хотя на данном этапе пожалуй лучше об этом не думать. Оптимизацию оставить на потом
Запомните, сортировка ПОЧТИ ВСЕГДА медленнее получения элементов из хэш-таблицы. И да, не надо оптимизировать код заранее.

Цитата:
Сообщение от max_prorok Посмотреть сообщение
Заключается она в том, чтобы отказаться от таймера. А завязать все действия на таймер, который работает всегда - то есть, внутренние часы компьютера.
Будет много холостых ходов, будет греться ЦП и т.п. Не очень. Так делали лишь в 80-е, когда надо было юзать железо на полную. Не надо оптимизировать, когда это не нужно.
Считайте время на каждую операцию в тиках своего движка. Например, на переход в соседнюю клетку - 10 тиков, удар - два тика и т.п. И каждый цикл таймера считайте одним тиком.

Цитата:
Сообщение от max_prorok Посмотреть сообщение
P.S. Есть еще идея вместо List<Mob> использовать LinkedList<Mob>. Будет ли от этого алгоритм работать быстрее? Или в принципе все равно?
На практике LinkedList медленнее ArrayList (в C# List) почти во всём. Не рекомендую.


И да, у Вас игра тормозит или что? Что за странная тяга к оптимизации?
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 11.10.2016, 22:55   #30
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
P.S. Есть еще идея вместо List<Mob> использовать LinkedList<Mob>. Будет ли от этого алгоритм работать быстрее? Или в принципе все равно?
наиболее быстро это пул объектов, пытается сочетать преимущества массивов и связанных списков(отсутсвие перераспределения объектов)
Цитата:
Заключается она в том, чтобы отказаться от таймера. А завязать все действия на таймер, который работает всегда - то есть, внутренние часы компьютера.
если у вас нет хитрой физики вы даже в одном потоке успеете просчитать тысячу мобов в тик.
вам не надо привязываться ко времени, есть UPS, есть их частота в секунду(положенная), и все.
привяжетесь к обычному времени, и все у вас плывет чуть что.
Цитата:
Так вот, моб подумал, что ему надо перейти на соседнюю клетку. В этот момент записываем, в его внутреннюю переменную DateTime записать значение DateTime.Now+500ms. Далее цикл проходит. Считывается новое значение времени сервера. Когда доходит до нужного моба, сравнивается время сервера и время записанное в переменную моба. Если время в переменной моба меньше или равно времени сервера, то моб делает шаг, если нет, то продолжает стоять на месте.
какой сервер?
какое сравнивается?
сервер должен быть императивен.
началось действие, сервер всем говорит "моб пошел" и все.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 11.10.2016 в 23:06.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Снова я и снова геморрой, только уже с многопоточностью FleXik Общие вопросы Delphi 26 07.07.2013 16:48
Неблокирующий сокет Си проблема с закрытием, проблема с закрытием сокетов в цикле mnx_vol C/C++ Сетевое программирование 0 06.11.2012 13:57
нужно разобраться с многопоточностью с ThRead Object Толян1 C++ Builder 1 16.07.2012 09:52
Проблема с многопоточностью Kapitan4ik Работа с сетью в Delphi 3 29.02.2012 21:46