|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.06.2016, 12:43 | #21 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
вам надо каждое активное действие отбавлять, а не искать короткое. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
27.06.2016, 14:05 | #22 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
Не совсем понял смысл. Не могли бы пояснить более развернуто?
|
27.06.2016, 14:51 | #23 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
у вас есть же список действий что выполняются сейчас, как я понял он привязан у вас не к мобу, а к миру, но это не так важно.
у вас же не один моб в мире действует, а все, значит всегда надо проходить по всему списку. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
27.06.2016, 17:19 | #24 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
Не совсем так.
Правильней будет сказать, что все действия мобов состоят из действия и задержки. Вот например. Моб двигается со скоростью 2 клетки в секунду. Т.е. его действия следующие: получил команду двигаться, подождал 500 мс, сместился на соседнюю клетку, подождал 500 мс, сместился на соседнюю клетку. Другой пример. Моб атакует со скоростью 5 атак в секунду. Его действия: получил команду атаковать, ждет 200 мс, наносит урон, ждет 200 мс, наносит урон и т.д. Так вот я предполагал сделать все следующим образом. Вот поступило от каждого моба команда, что он делает. Они записываются в сортируемый по времени задержки лист. Работает таймер, который каждую мс добавляет переменную. Сравнивает, пришло ли время для действия того или иного моба. Если нет, то ничего не происходит. Если такое время настало, то он вызывает метод действия моба (переместиться на соседнюю клетку, нанести урон и пр.). Возможен вариант, когда действия разных мобов происходят в одно и того же время. Поэтому в таймере запускается цикл, который запускает все действия мобов, время которых настало. После чего удаляет их из очереди. Вычитает из всех остальных задач время, какое натикало и сбрасывает счетчик времени и опять тикает пока не настанет время следующего действия. |
27.06.2016, 17:23 | #25 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
просто храните в каждом мобе сколько он еще должен быть в задержке, не усложняйте.
и потом проходя по списку всех мобов отнимаете, а если задержка стала <=0 тогда можно делать след действие. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
28.06.2016, 16:23 | #26 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
Попробовал. Пошло вроде более менее. Но!
Почему задержка такая большая? Выставляешь задержку в 1000 мс, а вывод происходит примерно раз в 16 секунд? Решил сделать вообще все просто. Вот так: Код:
P.S. Попробовал запустить дебаг екзешник не через студию, а на прямую, время на цикл сократилось до 5 мс. Хорошо, но как-то все равно много для такой простейшей программки. Ну и собственно задержка между циклами не равна интервалу (на данный момент стоит 100, а на самом деле около 104-105мс). Последний раз редактировалось max_prorok; 28.06.2016 в 16:36. |
28.06.2016, 16:43 | #27 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
любой вывод это не мгновенная операция,потому лучше не выводить если нет необходимости.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
11.10.2016, 10:48 | #28 |
Форумчанин
Регистрация: 06.10.2011
Сообщений: 181
|
Прошу прощения за поднятие темы, которая давно обсуждалась.
Но тут появилась новая идея. Заключается она в том, чтобы отказаться от таймера. А завязать все действия на таймер, который работает всегда - то есть, внутренние часы компьютера. Поясню. Например, в методе жизни локации, в котором работает цикл, в котором думают все жители локации по кругу, в самом начале в переменную записывать время компьютера. На какое-то действие моба, допустим переход на соседнюю клетку заложена задержка в 500 мс. Так вот, моб подумал, что ему надо перейти на соседнюю клетку. В этот момент записываем, в его внутреннюю переменную DateTime записать значение DateTime.Now+500ms. Далее цикл проходит. Считывается новое значение времени сервера. Когда доходит до нужного моба, сравнивается время сервера и время записанное в переменную моба. Если время в переменной моба меньше или равно времени сервера, то моб делает шаг, если нет, то продолжает стоять на месте. Подскажите, на сколько такой подход хорош? Не будет ли задержка слишком большой? P.S. Есть еще идея вместо List<Mob> использовать LinkedList<Mob>. Будет ли от этого алгоритм работать быстрее? Или в принципе все равно? |
11.10.2016, 22:02 | #29 | |||
Форумчанин
Регистрация: 24.01.2011
Сообщений: 774
|
Цитата:
Цитата:
Считайте время на каждую операцию в тиках своего движка. Например, на переход в соседнюю клетку - 10 тиков, удар - два тика и т.п. И каждый цикл таймера считайте одним тиком. Цитата:
И да, у Вас игра тормозит или что? Что за странная тяга к оптимизации?
a.k.a. Angelicos Phosphoros
Мой сайт |
|||
11.10.2016, 22:55 | #30 | |||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Цитата:
вам не надо привязываться ко времени, есть UPS, есть их частота в секунду(положенная), и все. привяжетесь к обычному времени, и все у вас плывет чуть что. Цитата:
какое сравнивается? сервер должен быть императивен. началось действие, сервер всем говорит "моб пошел" и все. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. Последний раз редактировалось Пепел Феникса; 11.10.2016 в 23:06. |
|||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Снова я и снова геморрой, только уже с многопоточностью | 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 |