LINUXTALKS.CO

Как правильно сделать многопточность в игре? В чём недостатки моей идеи? Поделитесь опытом.

 , , ,

L


0

1

В gambas есть многопоточность, но судя по тому как она там есть, сомнительно что она безопасная.

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

Идея многопоточности такая. Каждый игровой тик - это двухстадийный конвейер. Каждому из параллельных процессов передаётся номер потока. У каждого игрового объекта есть массив InputEvents размерностью в число потоков. В gambas массивы - это объекты.

Первая стадия конвейера - это создание событий. Все игровые объекты делятся на кучи, всего число куч - это число потоков во второй степени. Каждый из процессов закончив работать с одной кучей, берёт следующую свободную. Возможно резервирует её заранее, это я ещё не продумал как именно лучше делать. Обрабатывая объекты, например причинение урона, работы, участия в процедуре, он все изменения для целевых объектов не осуществляет сам, а создаёт (или расширяет) список событий, заполняет его и присваивает элементу массива InputEvents в соответствии со своим номером потока. Таким образом в целевом объекте изменяется максимум ссылка на один из элементов этого массива, при том для каждого потока свой элемент.

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

  • InputEvents[0]
  • InputEvents[1]
    • Урон дробящий 300 едениц
    • Солнечная радиация 80 едениц
  • InputEvents[2]
    • Боевое знамя, мораль +50 едениц
  • InputEvents[3]
    • Смерть друга, мораль -800 едениц

Массив ссылок на массивы. Каждый массив событий создаётся в своём процессе. То есть несколько процессов одновременно не дёргают поля объекта и каждый пишет события в свой массив, который сам и создаёт, помещая ссылку на него в элемент соответствующий номеру своего потока.

Вроде идея выглядит хорошо. Но кажется что то важное я не учёл. Вопрос опытным разработчикам. Какие есть важные или критические недостатки у этой идеи?

Думаю не использовать текстовый формат сообщений. А сразу сделать бинарный, с кодом взаимодействия, с ID отправителя, кодом модификатора, величинами взаимодействия. То есть использовать структуру или целочисленный массив из 10 элементов. Смотря что быстрее будет.

★★★★★★

gambas

не епу что это, все дальнейшие ответы даны из общих соображений

Все игровые объекты делятся на кучи, всего число куч - это число потоков во второй степени. Каждый из процессов закончив работать с одной кучей, берёт следующую свободную.

Формула n_piles = threads^2 норм для начала, хотя оптимальная зависимость тут скорее линейная или суперлинейная по числу объектов, имею в виду что в целом будет достаточно пулов (кучек) по 10-100 объектов каждый или около того, в зависимости от их тяжести. Если у тебя тысяча (типа тяжелых) объектов и 100 тредов (128 запросто на современных тачках, округляю) = то по твоей формуле получается надо 10000 кучек, что в 10 раз больше числа объектов. Но это всё тюнинг, вначале можно просто захардкодить любое значение

Думаю не использовать текстовый формат сообщений. А сразу сделать бинарный

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

а уж сеть (мультиплеер) потом прикрутишь через какой-нибудь сериализатор

ThePlayerZero    
★★
Последнее исправление: ThePlayerZero (всего исправлений: 1)

Linux / Chrome
Ответ на: комментарий от ThePlayerZero

а уж сеть (мультиплеер) потом прикрутишь через какой-нибудь сериализатор

Я решил сразу делать web-клиент. То есть игра работает на сервере, а игроки через браузеры к ней подключаются.

Если у тебя тысяча (типа тяжелых) объектов и 100 тредов (128 запросто на современных тачках, округляю) = то по твоей формуле получается надо 10000 кучек, что в 10 раз больше числа объектов. Но это всё тюнинг, вначале можно просто захардкодить любое значение

Придётся указать какое то минимальное число объектов на одну кучу. А может и даже вычислять условный «вес» объектов для их распределения, по пиковому и среднему времени их обработки. Я как то и не подумал про системы со 128 потоками.

rezedent12    
★★★★★★
Windows / Firefox
Ответ на: комментарий от rezedent12

Я решил сразу делать web-клиент. То есть игра работает на сервере, а игроки через браузеры к ней подключаются.

Осваивай Elixir+Phoenix.

Minona    
★★★★★★
Windows / Yandex