Должен ли я запускать каждый плагин в отдельном потоке? - PullRequest
4 голосов
/ 23 августа 2011

В моей игре пользователь может загружать собственные сценарии.Обычно загружается от 50 до 100 скриптов.Каждый сценарий вызывается для каждого кадра с помощью метода Update.

  1. Когда происходит сбой сценария, другие сценарии не должны быть затронуты.
  2. Метод обновления сценариев может работать максимум1 миллисекунда каждый кадр.Поэтому мне также нужно иметь возможность прервать сценарии, которые заморожены / не реагируют во времени.

Как мне это сделать?Я думаю, что запуск 3000 - 6000 потоков в секунду - не лучшая практика.Я также не могу запускать потоки после вызова Update в цикле и ждать 16 мс, потому что скрипты должны быть синхронизированы с игрой.Сценарии зависят от запуска каждого кадра.

Является ли пул потоков правильным выбором?И если да, то как мне прервать сценарии в тот тайм-аут?

1 Ответ

4 голосов
/ 23 августа 2011

Коротко: защита от враждебного кода трудна.

1. Когда происходит сбой сценария, другие сценарии не должны быть затронуты : для достижения этого единственный надежный способ в Windows - запускать каждый сценарий в отдельном процессе. То есть Исключение StackOverflow, вызванное «скриптом», приведет к остановке вашего процесса. Межпроцессное взаимодействие вряд ли будет соответствовать вашим требованиям к производительности.

2. 1 мс каждый сценарий : прерывание потока является решением. Избегайте огромного количества потоков (превышение десятков потоков сомнительно: переключение между потоками может снизить вашу производительность, место в стеке съедает всю память, и в общем случае синхронизация состояния перекрестного потока - это весело). Не перезапускайте «скрипты», которые ведут себя плохо - таким образом, вам не нужно беспокоиться о слишком большом количестве вызовов Thread.Abort. Обратите внимание, что удаление потока, в котором нет необходимости, приведет к уничтожению всего, что связано со «сценарием», так как он мог порождать собственные потоки / асинхронные операции / задачи пула потоков ...

...