Russian Qt Forum
Март 28, 2024, 14:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сетевая игра в режиме реального времени. Qt  (Прочитано 27031 раз)
Nelkor
Гость
« : Октябрь 25, 2014, 18:27 »

Всем привет!
Решил в учебных целях сделать на Qt сетевую игру (для локальной сети) в режиме реального времени. Всё что я знаю о работе с сетью в Qt - глава из книги Макса Шлее. Ну и конечно, в силу своей нубости столкнулся с рядом проблем. А точнее проблема только одна - на "хосте" игра летает, на "клиентах" - лагает. Причин, наверное множество, и вот какие вопросы я хотел бы задать:

1. До того, как я увидел тормоза на "клиенте" я считал, что выделить на клиента 1 порт - это хорошая идея. Сейчас я начинаю задумываться о том, что через 1 порт, наверное, информация идёт туговато. А может я ошибаюсь. Сколько примерно выделяют портов для игр?

2. Таймер запущен только на хосте, для всех клиентов update() происходит по сигналу readyRead() от сервера, после соответствующего чтения информации. Опять же не знаю, хорошая это идея или плохая. Как обычно поступают для координации времени в играх?

3. Все расчеты ведутся только на хосте. Поэтому информации приходится передавать очень много. Это решаемая проблема - каждый клиент может брать на себя часть расчетов и серверу придётся меньше передавать. Однако как же тогда работают настоящие игры, в которых информации передаётся уж явно в разы больше, причем не по локалке, а через интернет, и таких тормозов даже близко нет. Что можете посоветовать по этому поводу?

4. TCP-соединение. Может быть лучше UDP, ибо он быстрее? А что используется в настоящих играх? Тем более, если сделать так, чтобы клиенты сами расчитывали себе часть параметров, а передавались только ключевые, то потеря пакетов становится критичной. Можно, конечно, доработать игру до такой степени, что потери пакетов будут выявляться на стороне клиента и корректироваться с новыми полученными пакетами, но ведь потеря пакетов - это в любом случае плохо?

5. Поскольку учился я по книге М. Шлее, умею подключаться только к конкретному порту конкретного компьютера (по его имени). А как же сделать что-то типа "мониторинга" сети? Вот как, извиняюсь, в варкрафте: Кто-то создал игру - другие видят, что появился такой-то хост, и могут к нему законнектиться. Как происходит сей процесс?

Буду благодарен любым советам! Возможно данные вопросы интересны не только мне, и данная тема разовьётся в хорошую дискуссию. Пожалуйста, активно принимаем участие)
Записан
vulko
Гость
« Ответ #1 : Октябрь 27, 2014, 10:43 »

1. До того, как я увидел тормоза на "клиенте" я считал, что выделить на клиента 1 порт - это хорошая идея. Сейчас я начинаю задумываться о том, что через 1 порт, наверное, информация идёт туговато. А может я ошибаюсь. Сколько примерно выделяют портов для игр?
Все зависит от ситуации. Если например ты будешь слать однотипные данные на 4 порта, нужно их собрать будет. при сборке нужно учитывать время отправки.
А вот выбрать несколько портов для разных данных это нормально. Например на первый порт идут данные сигналинга, на второй данные игры и т.д.

2. Таймер запущен только на хосте, для всех клиентов update() происходит по сигналу readyRead() от сервера, после соответствующего чтения информации. Опять же не знаю, хорошая это идея или плохая. Как обычно поступают для координации времени в играх?
Не специалист в игро-строении, но для начала почему бы и нет. А вообще данные лучше принимать в отдельном потоке, особенно если у тебя не какие-нибудь шахматы.

3. Все расчеты ведутся только на хосте. Поэтому информации приходится передавать очень много. Это решаемая проблема - каждый клиент может брать на себя часть расчетов и серверу придётся меньше передавать. Однако как же тогда работают настоящие игры, в которых информации передаётся уж явно в разы больше, причем не по локалке, а через интернет, и таких тормозов даже близко нет. Что можете посоветовать по этому поводу?
Насколько я знаю, серьезные сетевые игры обрабатывают все данные на серверах. Клиенты шлют только свои данные.
Отправка данных идет с той скоростью, которую тянет сеть. Частота отправки данных соответсвует (1 / ping). Ping зависит от размера пакета, но для 1..64(128) байт он в принципе одинаковый.

4. TCP-соединение. Может быть лучше UDP, ибо он быстрее? А что используется в настоящих играх? Тем более, если сделать так, чтобы клиенты сами расчитывали себе часть параметров, а передавались только ключевые, то потеря пакетов становится критичной. Можно, конечно, доработать игру до такой степени, что потери пакетов будут выявляться на стороне клиента и корректироваться с новыми полученными пакетами, но ведь потеря пакетов - это в любом случае плохо?
Смотря какие данные... например если посмотреть на игру шахматы... или покер, там важно чтобы пакет дошел. Количество данных небольшой. Можно для простоты воспользоваться и TCP.
UDP быстрее, но пакеты могут теряться. В локалке врядли, а вот через интернет уже вполне вероятно.

5. Поскольку учился я по книге М. Шлее, умею подключаться только к конкретному порту конкретного компьютера (по его имени). А как же сделать что-то типа "мониторинга" сети? Вот как, извиняюсь, в варкрафте: Кто-то создал игру - другие видят, что появился такой-то хост, и могут к нему законнектиться. Как происходит сей процесс?
В локальной сети есть широковещательные пакеты multicast.
Бывают архитектуры с сервером, к которому подключаются юзеры и там создают игры и видят обновления списка игр. Обновление может быть автоматом, либо по запросу от клиента (юзер нажал кнопку обновить например).
Варианты есть разные...

Поскольку ты хочешь чему-то научиться, а не создать аналог варкрафта, где высоконагруженные кластеры серверов обрабатывают данные от тысяч игроков, то делать все как в таких играх не нужно.
Начни с простого. А потом усложнишь.
Записан
reyamo6736
Новичок

Offline Offline

Сообщений: 1

Играйте в крутые сайта и получайте отличные преиму


Просмотр профиля
« Ответ #2 : Октябрь 24, 2022, 16:48 »

Все зависит от ситуации. Если например ты будешь слать однотипные данные на 4 порта, нужно их собрать будет. при сборке нужно учитывать время отправки.
А вот выбрать несколько портов для разных данных это нормально. Например на первый порт идут данные сигналинга, на второй данные игры и т.д.

В локальной сети есть широковещательные пакеты multicast.
Бывают архитектуры с сервером, к которому подключаются юзеры и там создают игры и видят обновления списка игр. Обновление может быть автоматом, либо по запросу от клиента (юзер нажал кнопку обновить например).
« Последнее редактирование: Октябрь 24, 2022, 21:58 от gil9red » Записан

Turbo Casino — это новое онлайн-казино, предлагающее игрокам шанс выиграть реальные деньги и призы. Площадка казино turbo на деньги поддерживается ведущими поставщиками программного обеспечения, включая Playtech и Micr
negova
Новичок

Offline Offline

Сообщений: 2


Просмотр профиля
« Ответ #3 : Ноябрь 18, 2022, 20:37 »

1. До того, как я увидел тормоза на "клиенте" я считал, что выделить на клиента 1 порт - это хорошая идея. Сейчас я начинаю задумываться о том, что через 1 порт, наверное, информация идёт туговато. А может я ошибаюсь. Сколько примерно выделяют портов для игр?
Все зависит от ситуации. Если например ты будешь слать однотипные данные на 4 порта, нужно их собрать будет. при сборке нужно учитывать время отправки.
А вот выбрать несколько портов для разных данных это нормально. Например на первый порт идут данные сигналинга, на второй данные игры и т.д.

2. Таймер запущен только на хосте, для всех клиентов update() происходит по сигналу readyRead() от сервера, после соответствующего чтения информации. Опять же не знаю, хорошая это идея или плохая. Как обычно поступают для координации времени в играх?
Не специалист в игро-строении, но для начала почему бы и нет. А вообще данные лучше принимать в отдельном потоке, особенно если у тебя не какие-нибудь шахматы.

3. Все расчеты ведутся только на хосте. Поэтому информации приходится передавать очень много. Это решаемая проблема - каждый клиент может брать на себя часть расчетов и серверу придётся меньше передавать. Однако как же тогда работают настоящие игры, в которых информации передаётся уж явно в разы больше, причем не по локалке, а через интернет, и онлайн-казино Селектор является ведущим онлайн-казино на рынке. Он предлагает широкий выбор игровых автоматов и настольных игр в рулетку. таких тормозов даже близко нет. Что можете посоветовать по этому поводу?
Насколько я знаю, серьезные сетевые игры обрабатывают все данные на серверах. Клиенты шлют только свои данные.
Отправка данных идет с той скоростью, которую тянет сеть. Частота отправки данных соответсвует (1 / ping). Ping зависит от размера пакета, но для 1..64(128) байт он в принципе одинаковый.

4. TCP-соединение. Может быть лучше UDP, ибо он быстрее? А что используется в настоящих играх? Тем более, если сделать так, чтобы клиенты сами расчитывали себе часть параметров, а передавались только ключевые, то потеря пакетов становится критичной. Можно, конечно, доработать игру до такой степени, что потери пакетов будут выявляться на стороне клиента и корректироваться с новыми полученными пакетами, но ведь потеря пакетов - это в любом случае плохо?
Смотря какие данные... например если посмотреть на игру шахматы... или покер, там важно чтобы пакет дошел. Количество данных небольшой. Можно для простоты воспользоваться и TCP.
UDP быстрее, но пакеты могут теряться. В локалке врядли, а вот через интернет уже вполне вероятно.

5. Поскольку учился я по книге М. Шлее, умею подключаться только к конкретному порту конкретного компьютера (по его имени). А как же сделать что-то типа "мониторинга" сети? Вот как, извиняюсь, в варкрафте: Кто-то создал игру - другие видят, что появился такой-то хост, и могут к нему законнектиться. Как происходит сей процесс?
В локальной сети есть широковещательные пакеты multicast.
Бывают архитектуры с сервером, к которому подключаются юзеры и там создают игры и видят обновления списка игр. Обновление может быть автоматом, либо по запросу от клиента (юзер нажал кнопку обновить например).
Варианты есть разные...

Поскольку ты хочешь чему-то научиться, а не создать аналог варкрафта, где высоконагруженные кластеры серверов обрабатывают данные от тысяч игроков, то делать все как в таких играх не нужно.
Начни с простого. А потом усложнишь.

В локальной сети есть широковещательные пакеты multicast.
Записан
layex
Новичок

Offline Offline

Сообщений: 1


Просмотр профиля
« Ответ #4 : Ноябрь 19, 2022, 00:23 »

1. До того, как я увидел тормоза на "клиенте" я считал, что выделить на клиента 1 порт - это хорошая идея. Сейчас я начинаю задумываться о том, что через 1 порт, наверное, информация идёт туговато. А может я ошибаюсь. Сколько примерно выделяют портов для игр?
Все зависит от ситуации. Если например ты будешь слать однотипные данные на 4 порта, нужно их собрать будет. при сборке нужно учитывать время отправки.
А вот выбрать несколько портов для разных данных это нормально. Например на первый порт идут данные сигналинга, на второй данные игры и т.д.

2. Таймер запущен только на хосте, для всех клиентов update() происходит по сигналу readyRead() от сервера, после соответствующего чтения информации. Опять же не знаю, хорошая это идея или плохая. Как обычно поступают для координации времени в играх?
Не специалист в игро-строении, но для начала почему бы и нет. А вообще данные лучше принимать в отдельном потоке, особенно если у тебя не какие-нибудь шахматы.

3. Все расчеты ведутся только на хосте. Поэтому информации приходится передавать очень много. Это решаемая проблема - каждый клиент может брать на себя часть расчетов и серверу придётся меньше Крупнейшее онлайн-казино в России Селектор . Компания предлагает широкий выбор игр, включая слоты, рулетку, слоты на деньги и другие азартные игры. передавать. Однако как же тогда работают настоящие игры, в которых информации передаётся уж явно в разы больше, причем не по локалке, а через интернет, и таких тормозов даже близко нет. Что можете посоветовать по этому поводу?
Насколько я знаю, серьезные сетевые игры обрабатывают все данные на серверах. Клиенты шлют только свои данные.
Отправка данных идет с той скоростью, которую тянет сеть. Частота отправки данных соответсвует (1 / ping). Ping зависит от размера пакета, но для 1..64(128) байт он в принципе одинаковый.

4. TCP-соединение. Может быть лучше UDP, ибо он быстрее? А что используется в настоящих играх? Тем более, если сделать так, чтобы клиенты сами расчитывали себе часть параметров, а передавались только ключевые, то потеря пакетов становится критичной. Можно, конечно, доработать игру до такой степени, что потери пакетов будут выявляться на стороне клиента и корректироваться с новыми полученными пакетами, но ведь потеря пакетов - это в любом случае плохо?
Смотря какие данные... например если посмотреть на игру шахматы... или покер, там важно чтобы пакет дошел. Количество данных небольшой. Можно для простоты воспользоваться и TCP.
UDP быстрее, но пакеты могут теряться. В локалке врядли, а вот через интернет уже вполне вероятно.

5. Поскольку учился я по книге М. Шлее, умею подключаться только к конкретному порту конкретного компьютера (по его имени). А как же сделать что-то типа "мониторинга" сети? Вот как, извиняюсь, в варкрафте: Кто-то создал игру - другие видят, что появился такой-то хост, и могут к нему законнектиться. Как происходит сей процесс?
В локальной сети есть широковещательные пакеты multicast.
Бывают архитектуры с сервером, к которому подключаются юзеры и там создают игры и видят обновления списка игр. Обновление может быть автоматом, либо по запросу от клиента (юзер нажал кнопку обновить например).
Варианты есть разные...

Поскольку ты хочешь чему-то научиться, а не создать аналог варкрафта, где высоконагруженные кластеры серверов обрабатывают данные от тысяч игроков, то делать все как в таких играх не нужно.
Начни с простого. А потом усложнишь.

А вообще данные лучше принимать в отдельном потоке, особенно если у тебя не какие-нибудь шахматы.
Записан
Selector
Новичок

Offline Offline

Сообщений: 1


Просмотр профиля
« Ответ #5 : Ноябрь 30, 2022, 18:51 »

1. До того, как я увидел тормоза на "клиенте" я считал, что выделить на клиента 1 порт - это хорошая идея. Сейчас я начинаю задумываться о том, что через 1 порт, наверное, информация идёт туговато. А может я ошибаюсь. Сколько примерно выделяют портов для игр?
Все зависит от ситуации. Если например ты будешь слать однотипные данные на 4 порта, нужно их собрать будет. при сборке нужно учитывать время отправки.
А вот выбрать несколько портов для разных данных это нормально. Например на первый порт идут данные сигналинга, на второй данные игры и т.д.

2. Таймер запущен только на хосте, для всех клиентов update() происходит по сигналу readyRead() от сервера, после соответствующего чтения информации. Опять же не знаю, хорошая это идея или плохая. Как обычно поступают для координации времени в играх?
Не специалист в игро-строении, но для начала почему бы и нет. А вообще данные лучше принимать в отдельном потоке, особенно если у тебя не какие-нибудь шахматы.

3. Все расчеты ведутся только на хосте. Поэтому информации приходится передавать очень много. Это решаемая проблема - каждый клиент может брать на себя часть расчетов и серверу придётся меньше передавать. Однако как же тогда работают настоящие игры, в которых информации передаётся уж явно в разы больше, причем не по локалке, а через интернет, и таких тормозов даже близко нет. Что можете посоветовать по этому поводу?
Насколько я знаю, серьезные сетевые игры обрабатывают все данные на серверах. Клиенты шлют только свои данные.
Отправка данных идет с той скоростью, которую тянет сеть. Частота отправки данных соответсвует (1 / ping). Ping зависит от размера пакета, но для 1..64(128) байт он в принципе одинаковый.

4. TCP-соединение. Может быть лучше UDP, ибо он быстрее? А что используется в настоящих играх? Тем более, если сделать так, чтобы клиенты сами расчитывали себе часть параметров, а передавались только ключевые, то потеря пакетов становится критичной. Можно, конечно, доработать игру до такой степени, что потери пакетов будут выявляться на стороне клиента и корректироваться с новыми полученными пакетами, но ведь потеря пакетов - это в любом случае плохо?
Смотря какие данные... например если посмотреть на игру шахматы... или покер, там важно чтобы пакет дошел. Количество данных небольшой. Можно для простоты воспользоваться и TCP.
UDP быстрее, но пакеты могут теряться. В локалке врядли, а вот через интернет уже вполне вероятно.

5. Поскольку учился я по книге М. Шлее, умею подключаться только к конкретному порту конкретного компьютера (по его имени). А как же сделать что-то типа "мониторинга" сети? Вот как, извиняюсь, в варкрафте: Кто-то создал игру казино Селектор, - другие видят, что появился такой-то хост, и могут к нему законнектиться. Как происходит сей процесс?
В локальной сети есть широковещательные пакеты multicast.
Бывают архитектуры с сервером, к которому подключаются юзеры и там создают игры и видят обновления списка игр. Обновление может быть автоматом, либо по запросу от клиента (юзер нажал кнопку обновить например).
Варианты есть разные...

Поскольку ты хочешь чему-то научиться, а не создать аналог варкрафта, где высоконагруженные кластеры серверов обрабатывают данные от тысяч игроков, то делать все как в таких играх не нужно.
Начни с простого. А потом усложнишь.

Бывают архитектуры с сервером, к которому подключаются юзеры и там создают игры и видят обновления списка игр.
Записан
genitod
Новичок

Offline Offline

Сообщений: 1


Просмотр профиля
« Ответ #6 : Январь 09, 2023, 16:04 »

Всем привет!
Решил в учебных целях сделать на Qt сетевую игру (для локальной сети) в режиме реального времени. Всё что я знаю о работе с сетью в Qt - глава из книги Макса Шлее. Ну и конечно, в силу своей нубости столкнулся с рядом проблем. А точнее проблема только одна - на "хосте" игра летает, на "клиентах" - лагает. Причин, наверное множество, и вот какие вопросы я хотел бы задать:

1. До того, как я увидел тормоза на "клиенте" я считал, что выделить на клиента 1 порт - это хорошая идея. Сейчас я начинаю задумываться о том, что через 1 порт, наверное, информация идёт туговато. А может я ошибаюсь. Сколько примерно выделяют портов для игр?

2. Таймер запущен только на хосте, для всех клиентов update() происходит по сигналу readyRead() от сервера, после соответствующего чтения информации. Опять же не знаю, хорошая это идея или плохая. Как обычно поступают для координации времени в играх?

3. Все расчеты ведутся только на хосте. Поэтому информации приходится передавать очень много. Это решаемая проблема - каждый клиент может брать на себя часть расчетов и серверу придётся меньше передавать. Однако как же тогда работают настоящие игры, в которых информации передаётся уж явно в разы больше, причем не по локалке, а через интернет, и таких тормозов даже близко нет. Что можете посоветовать по этому поводу?

4. TCP-соединение. Может быть лучше UDP, ибо он быстрее? А что используется в настоящих играх? Тем более, если сделать так, чтобы клиенты сами расчитывали себе часть параметров, а передавались только ключевые, то потеря пакетов становится критичной. Можно, конечно, доработать игру до такой степени, что потери пакетов будут выявляться на стороне клиента и корректироваться с новыми полученными пакетами, но ведь потеря пакетов - это в любом случае плохо?

5. Поскольку учился я по книге М. Шлее, умею подключаться только к конкретному порту конкретного компьютера (по его имени). А как же сделать что-то типа "мониторинга" сети? Вот как, извиняюсь, в варкрафте: Кто-то создал игру лучшие бонусы в Селектор, казино  - другие видят, что появился такой-то хост, и могут к нему законнектиться. Как происходит сей процесс?

Буду благодарен любым советам! Возможно данные вопросы интересны не только мне, и данная тема разовьётся в хорошую дискуссию. Пожалуйста, активно принимаем участие)

Бывают архитектуры с сервером, к которому подключаются юзеры и там создают игры и видят обновления списка игр.
Записан
Fetal
Новичок

Offline Offline

Сообщений: 2


Просмотр профиля
« Ответ #7 : Январь 13, 2023, 13:57 »

1. До того, как я увидел тормоза на "клиенте" я считал, что выделить на клиента 1 порт - это хорошая идея. Сейчас я начинаю задумываться о том, что через 1 порт, наверное, информация идёт туговато. А может я ошибаюсь. Сколько примерно выделяют портов для игр?
Все зависит от ситуации. Если например ты будешь слать однотипные данные на 4 порта, нужно их собрать будет. при сборке нужно учитывать время отправки.
А вот выбрать несколько портов для разных данных это нормально. Например на первый порт идут данные сигналинга, на второй данные игры и т.д.

2. Таймер запущен только на хосте, для всех клиентов update() происходит по сигналу readyRead() от сервера, после соответствующего чтения информации. Опять же не знаю, хорошая это идея или плохая. Как обычно поступают для координации времени в играх?
Не специалист в игро-строении, но для начала почему бы и нет. А вообще данные лучше принимать в отдельном потоке, особенно если у тебя не какие-нибудь шахматы.

3. Все расчеты ведутся только на хосте. Поэтому информации приходится передавать очень много. Это решаемая проблема - каждый клиент может брать на себя часть расчетов и серверу придётся меньше передавать. Однако как же тогда работают настоящие игры, в которых информации передаётся уж явно в разы больше, причем не по локалке, а через интернет, и таких тормозов даже близко нет. Что можете посоветовать по этому поводу?
Насколько я знаю, серьезные сетевые игры обрабатывают все данные на серверах. Клиенты шлют только свои данные.
Отправка данных идет с той скоростью, которую тянет сеть. Частота отправки данных соответсвует (1 / ping). Ping зависит от размера пакета, но для 1..64(128) байт он в принципе одинаковый.

4. TCP-соединение. Может быть лучше UDP, ибо он быстрее? А что используется в настоящих играх? Тем более, если сделать так, чтобы клиенты сами расчитывали себе часть параметров, а передавались только ключевые, то потеря пакетов становится критичной. Можно, конечно, доработать игру до такой степени, что потери пакетов казино brillx будут выявляться на стороне клиента и корректироваться с новыми полученными пакетами, но ведь потеря пакетов - это в любом случае плохо?
Смотря какие данные... например если посмотреть на игру шахматы... или покер, там важно чтобы пакет дошел. Количество данных небольшой. Можно для простоты воспользоваться и TCP.
UDP быстрее, но пакеты могут теряться. В локалке врядли, а вот через интернет уже вполне вероятно.

5. Поскольку учился я по книге М. Шлее, умею подключаться только к конкретному порту конкретного компьютера (по его имени). А как же сделать что-то типа "мониторинга" сети? Вот как, извиняюсь, в варкрафте: Кто-то создал игру - другие видят, что появился такой-то хост, и могут к нему законнектиться. Как происходит сей процесс?
В локальной сети есть широковещательные пакеты multicast.
Бывают архитектуры с сервером, к которому подключаются юзеры и там создают игры и видят обновления списка игр. Обновление может быть автоматом, либо по запросу от клиента (юзер нажал кнопку обновить например).
Варианты есть разные...

Поскольку ты хочешь чему-то научиться, а не создать аналог варкрафта, где высоконагруженные кластеры серверов обрабатывают данные от тысяч игроков, то делать все как в таких играх не нужно.
Начни с простого. А потом усложнишь.

Звучит толково)
Записан
kayat58460
Новичок

Offline Offline

Сообщений: 1


Просмотр профиля
« Ответ #8 : Февраль 21, 2023, 17:38 »

Все зависит от ситуации. Если например ты будешь слать однотипные данные на 4 порта, нужно их собрать будет. при сборке нужно учитывать время отправки.
А вот выбрать несколько портов для разных данных это нормально. Например на первый порт идут данные сигналинга, на второй данные игры и т.д.
Советую посетить крутую статью https://memepedia.ru/kakie-luchshie-onlajn-kazino-popadayut-v-top/ про лучшие онлайн казино в топе сейчас
В локальной сети есть широковещательные пакеты multicast.
Бывают архитектуры с сервером, к которому подключаются юзеры и там создают игры и видят обновления списка игр. Обновление может быть автоматом, либо по запросу от клиента (юзер нажал кнопку обновить например).
Пробовал, получалась одна фигня
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.066 секунд. Запросов: 22.