Как справиться, игра указывают перед лицом EDT?

Вы не можете передать nil в качестве аргумента опций. Вместо этого используйте пустой набор параметров:

let components = cal.components(unit, fromDate: calcDesp!, toDate: calHoy!, options: [])

Вы также должны убедиться, что развернули calcDesp и calHoy.

8
задан Lii 13 January 2016 в 19:39
поделиться

8 ответов

Похоже, что подход клиент / сервер мог бы выиграть:

Игрок - это клиент - интерактивность и рендеринг происходят с этой стороны. Итак, игрок нажимает кнопку, запрос отправляется на сервер. Ответ от сервера возвращается, и состояние игрока обновляется. В любой момент между этими событиями экран может быть перерисован, и он отражает состояние игры, которое в настоящее время известно клиенту.

ИИ также является клиентом - это эквивалент бота.

] Симуляция - это сервер. Он получает обновления от своих клиентов в разное время и обновляет состояние мира, а затем рассылает эти обновления всем по мере необходимости. Вот где это связано с вашей ситуацией: симуляция / ИИ требует статического мира, и многие вещи происходят одновременно. Сервер может просто поставить в очередь запросы на изменение и применить их перед отправкой обновлений обратно клиенту (-ам). Что касается сервера, игровой мир на самом деле не меняется в реальном времени, он меняется всякий раз, когда сервер чертовски хорошо это решает.

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

Обратите внимание, что на самом деле это не обязательно быть реализованным способом TCP / IP через Интернет, просто это помогает думать об этом в этих терминах.

В качестве альтернативы, вы можете возложить ответственность за сохранение согласованности данных во время моделирования на базу данных, так как они' re уже построен с учетом блокировки и согласованности. Что-то вроде sqlite может работать как часть несетевого решения.

3
ответ дан 6 December 2019 в 00:58
поделиться

Не уверен, что я полностью понимаю поведение, которое вы ищете, но похоже, что вам нужно что-то вроде потока / очереди изменения состояния, чтобы все изменения состояния обрабатывались одним потоком.

Создайте api, например SwingUtilities.invokeLater () и / или SwingUtilities.invokeAndWait () для вашей очереди изменения состояния, чтобы обрабатывать ваши запросы на изменение состояния.

Как это отражается в графическом интерфейсе, я думаю, зависит от поведения, которое вы ищете для. т.е. невозможно снять деньги, потому что текущее состояние - $ 0, или вернуть пользователю, что учетная запись была пуста, когда запрос на снятие был обработан. (вероятно, не с такой терминологией ;-))

0
ответ дан 6 December 2019 в 00:58
поделиться

Самый простой способ - сделать симуляцию достаточно быстрой для запуска в EDT. Предпочитайте программы, которые работают!

Для двухпоточной модели я предлагаю синхронизировать модель предметной области с моделью визуализации. Модель визуализации должна хранить данные о том, что пришло из модели предметной области.

Для обновления: В потоке моделирования заблокируйте модель визуализации. Пройдите обновление модели рендеринга там, где все отличается от ожидаемого, обновите модель рендеринга. По завершении обхода разблокируйте модель рендеринга и запланируйте перерисовку. Обратите внимание, что в этом подходе вам не нужен миллиард слушателей.

Модель визуализации может иметь разную глубину. С одной стороны, это может быть изображение, а операция обновления заключается в замене единственной ссылки на новый объект изображения (это не обрабатывается, например, изменение размера или другое поверхностное взаимодействие очень хорошо). Вы можете не беспокоиться о том, чтобы проверить, есть ли в элементе изменения, и просто обновите все.

0
ответ дан 6 December 2019 в 00:58
поделиться

Можно ли постепенно обновлять состояние игры и при этом иметь согласованную модель? Например, пересчитайте для подмножества объектов планеты / игрока / флота между рендерами / обновлениями пользователя.

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

После каждого инкрементального обновления в EDT вам нужно будет запомнить, какая часть модели остается обновленной, и запланировать новый SwingWorker в EDT, чтобы продолжить эту обработку после того, как любые ожидающие ввода пользователя и рендеринг были выполнены .

Это должно позволить вам избежать копирования или блокировки игровой модели, сохраняя при этом возможность взаимодействия с пользователем.

0
ответ дан 6 December 2019 в 00:58
поделиться

Если изменение состояния игры происходит быстро (как только вы знаете, на что его нужно изменить), вы можете рассматривать состояние игры, как другие модели Swing, и изменять или просматривать состояние только в EDT. Если изменение состояния игры происходит не быстро, вы можете либо синхронизировать изменение состояния и сделать это с помощью рабочего / таймера поворота (но не EDT), либо вы можете сделать это в отдельном потоке, который вы обрабатываете аналогично EDT (в этот момент вы посмотрите, как использовать BlockingQueue для обработки запросов на изменение). Последнее более полезно, если пользовательскому интерфейсу никогда не нужно извлекать информацию из состояния игры, а вместо этого отправляет изменения рендеринга через слушателей или наблюдателей.

0
ответ дан 6 December 2019 в 00:58
поделиться

Как насчет реализации архитектуры каналов и фильтров. Каналы соединяют фильтры вместе и ставят запросы в очередь, если фильтр работает недостаточно быстро. Обработка происходит внутри фильтров. Первый фильтр - это механизм AI, в то время как механизм визуализации реализуется набором последующих фильтров.

На каждом такте таймера новое динамическое мировое состояние вычисляется на основе всех входных данных (время также является входом) и копия вставлена ​​в первую трубу.

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

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

Эта архитектура дает вам хороший параллелизм без большой синхронизации.

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

0
ответ дан 6 December 2019 в 00:58
поделиться

Я думаю, вам не следует, чтобы World сохранял какие-либо данные или вносил изменения в какие-либо объекты, его следует использовать только для поддержки ссылки на объект, и когда этот объект необходимо изменить, попросите игрока, вносящего изменение, изменить его напрямую. В этом случае единственное, что вам нужно сделать, это синхронизировать каждый объект в игровом мире, чтобы, когда игрок вносит изменения, никто другой не мог этого сделать. Вот пример того, о чем я думаю:

Игроку А нужно знать о планете, поэтому он запрашивает у World эту планету (как это зависит от вашей реализации). World возвращает ссылку на объект Planet, который просил игрок A. Игрок А решает внести изменения, поэтому он это делает. Допустим, он добавляет здание. Метод добавления здания на планету синхронизирован, поэтому только один игрок может делать это одновременно. Здание будет отслеживать собственное время строительства (если таковое имеется), поэтому метод добавления здания Planet будет освобожден почти сразу. Таким образом, несколько игроков могут запрашивать информацию на одной и той же планете одновременно, не влияя друг на друга, и игроки могут добавлять здания почти одновременно, без заметных задержек. Если два игрока ищут место для постройки (если это часть вашей игры), тогда проверка пригодности места будет запросом, а не изменением.

Мне очень жаль, если это не дает ответа. вопрос, я не уверен, правильно ли я понял.

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

Мне очень жаль, если это не дает ответа. вопрос, я не уверен, правильно ли я понял.

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

Мне очень жаль, если это не дает ответа. вопрос, я не уверен, правильно ли я понял.

0
ответ дан 6 December 2019 в 00:58
поделиться

Похоже, вам нужна очередь приоритетов для установки обновлений к модели, в которой обновления от пользователя имеют приоритет над обновлениями от моделирования и других входных данных. Я слышу, как вы говорите, что пользователю всегда нужна немедленная обратная связь по поводу своих действий, тогда как другие входные данные (в противном случае имитация) могут иметь рабочих, которые могут занять больше одного шага моделирования. Затем выполните синхронизацию по очереди приоритетов.

0
ответ дан 6 December 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: