В gambas есть многопоточность, но судя по тому как она там есть, сомнительно что она безопасная.
Пока что концепция игры, это плоское игровое поле без вертикальности, с передвигающимися по нему персонажами - «пешками».
Идея многопоточности такая. Каждый игровой тик - это двухстадийный конвейер. Каждому из параллельных процессов передаётся номер потока. У каждого игрового объекта есть массив InputEvents размерностью в число потоков. В gambas массивы - это объекты.
Первая стадия конвейера - это создание событий. Все игровые объекты делятся на кучи, всего число куч - это число потоков во второй степени. Каждый из процессов закончив работать с одной кучей, берёт следующую свободную. Возможно резервирует её заранее, это я ещё не продумал как именно лучше делать. Обрабатывая объекты, например причинение урона, работы, участия в процедуре, он все изменения для целевых объектов не осуществляет сам, а создаёт (или расширяет) список событий, заполняет его и присваивает элементу массива InputEvents в соответствии со своим номером потока. Таким образом в целевом объекте изменяется максимум ссылка на один из элементов этого массива, при том для каждого потока свой элемент.
Вторая стадия конвейера - это обработка событий. Все игровые объекты опять же разделённые на кучи, изменяют свои состояния в соответствии с сообщениями из массивов InputEvents. То есть применяют по отношению к себе различные эффекты, типа попаданий выстрелов или применённых очков работы.
- InputEvents[0]
- InputEvents[1]
- Урон дробящий 300 едениц
- Солнечная радиация 80 едениц
- InputEvents[2]
- Боевое знамя, мораль +50 едениц
- InputEvents[3]
- Смерть друга, мораль -800 едениц
Массив ссылок на массивы. Каждый массив событий создаётся в своём процессе. То есть несколько процессов одновременно не дёргают поля объекта и каждый пишет события в свой массив, который сам и создаёт, помещая ссылку на него в элемент соответствующий номеру своего потока.
Вроде идея выглядит хорошо. Но кажется что то важное я не учёл. Вопрос опытным разработчикам. Какие есть важные или критические недостатки у этой идеи?
Думаю не использовать текстовый формат сообщений. А сразу сделать бинарный, с кодом взаимодействия, с ID отправителя, кодом модификатора, величинами взаимодействия. То есть использовать структуру или целочисленный массив из 10 элементов. Смотря что быстрее будет.