Должен ли я запускать каждый плагин в отдельном потоке?
В моей игре пользователь может загружать собственные сценарии. Обычно загружается от 50 до 100 скриптов. Каждый скрипт вызывается для каждого кадра через метод Update.
- Когда происходит сбой скрипта, другие скрипты не должны быть затронуты.
- Метод обновления сценариев может выполняться не более 1 миллисекунды в каждом кадре. Поэтому мне также нужно иметь возможность прервать сценарии, которые заморожены / не реагируют вовремя.
Как мне это сделать? Я думаю, что запуск 3000 - 6000 потоков в секунду - не лучшая практика. Я также не могу запускать потоки после вызова Update в цикле и ждать 16 мс, потому что скрипты должны быть синхронизированы с игрой. Сценарии зависят от запуска каждого кадра.
Является ли Threadpool правильным выбором здесь? И если да, то как мне прервать сценарии в тот тайм-аут?
1 ответ
Коротко: защитить от враждебного кода сложно.
1. Когда происходит сбой скрипта, другие скрипты не должны быть затронуты: для достижения этого единственным надежным способом в Windows является запуск каждого скрипта в отдельном процессе. Т.е. исключение Stackru, вызванное "скриптом", приведет к остановке вашего процесса. Межпроцессное взаимодействие вряд ли будет соответствовать вашим требованиям к производительности.
2. 1 мс каждый сценарий: прерывание потока является решением. Избегайте огромного количества потоков (превышение десятков потоков сомнительно: переключение между потоками может снизить вашу производительность, место в стеке съедает всю память, и в общем случае синхронизация состояния перекрестного потока - это весело). Не перезапускайте "скрипты", которые ведут себя плохо - таким образом, вам не нужно беспокоиться о слишком большом количестве вызовов Thread.Abort. Обратите внимание, что уничтожение потока, в котором нет необходимости, приведет к уничтожению всего, что связано со "сценарием", так как это может привести к созданию собственных потоков / асинхронных операций / задач пула потоков...