Должен ли я запускать каждый плагин в отдельном потоке?

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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам