Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752

Как правильно передавать данные с сервера на клиент (игра)

21.11.2012, 20:02. Показов 5573. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть структурированный список игроков(т.е. те кто онлайн)
В цикле каждому юзеру(игроку), отправляю вот такую структуру,
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Structure Info
  Type.l
  Target.l
  ;DOWNLOAD
  Name.s{16}
  Race.s{16}
  Mob.l
  Player.l
  NPC.l
  TheEnd.l
  ;Update_World
  Update_Finish.l
  Type_Object.l
  ID.l
  MaxHP.l
  MaxMP.l
  HP.l
  MP.l
  x.d
  y.d
  z.d
  Show.l
  ;PLAYER
  Radius_View.l
  Player_x.d
  Player_y.d
  Player_z.d
  command.l
  Yaw.d
EndStructure
в которую записываю данные игрока.
Отправляю тому юзеру, перехожу к след. в списке игроку и снова отправляю этому же юзеру. И так пока не кончится список.
Потом перехожу к след. юзеру и так же отправляю ему весь список игроков.

Т.е. это выглядит так

PureBasic
1
2
3
4
5
6
7
8
9
ForEach Player()
  now = @Player()
  ForEach Player()
    здесь заполняю нужные поля структуры Info и отправляю юзеру now
  Next
  If Now <> @Player()
    ChangeCurrentElement(Player(), Now)
  EndIf
Next
А клиентом принимаю эти данные друг за другом в цикле, и когда он принял, отправляю серверу сообщение, которое дает ему знать, что надо снова передать ему список игроков.
Т.е.
PureBasic
1
2
3
4
5
6
7
  Repeat
    ReceiveNetworkData(ConnectionID, @Info, SizeOf(Info))
    If Info_Server\TheEnd = 1
      Exit_Update = 1
    EndIf
  Until Exit_Update = 1
  SendNetworkData(ConnectionID, @***, SizeOf(***))
В общем в случаях примерно 1/100 клиент пропускает 1 передачу данных(т.е. весь лист).

Может ли эта ошибка быть из-за системы передачи данных?
И подскажите, пожалуйста, способ по лучше.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2012, 20:02
Ответы с готовыми решениями:

Как передавать координаты с сервера на клиент
Здравствуйте. Подскажите, по какому алгоритму передаются координаты игроков, например в WoW. С Ла2 проше, там по клику. А вот в WoW на...

Как правильно передавать данные между страницами?
Например, документ Продажа. Нужно выбрать товар из формы справочника Номенклатура. Как передать выбранный элемент из формы справочника в...

(Catel) Как правильно передавать данные для редактирования в дочерние окна?
К примеру в MainViewModel есть коллекция, эту коллекцию нужно отредактировать в другом окне. Как правильно передать и вернуть такую...

4
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
21.11.2012, 21:37
Цитата Сообщение от Le Thaw Посмотреть сообщение
PureBasic
1
2
3
4
5
ForEach Player()
 now = @Player()
 ForEach Player()
 'здесь заполняю нужные поля структуры Info и отправляю юзеру now
 Next
Здесь не вижу логики. Зачем во вложенном цикле перебирать тот же список?
Почему было сделано именно так?


Цитата Сообщение от Le Thaw Посмотреть сообщение
В общем в случаях примерно 1/100 клиент пропускает 1 передачу данных(т.е. весь лист).
Они точно отправлялись?

При приеме, в каких случаях, в поле TheEnd структуры Info_Server записывается число 1?
И не помешало бы проверять сколько байт было получено.
1
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752
21.11.2012, 22:21  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Здесь не вижу логики. Зачем во вложенном цикле перебирать тот же список?
Почему было сделано именно так?
Ну потому что я каждому игроку, отправляю весь список игроков, в том числе и данные об игроке, которому передаю. Поэтому так.

Цитата Сообщение от locm Посмотреть сообщение
Они точно отправлялись?
Открывал 2 окна. Во втором персонаж равномерно передвигается вперед на 4 координаты. А точнее на модуль вектора равным 4. В первом окне выводил дебагером расстояние, которое прошел второй персонаж. Но вот в некоторых случаях, второй передвигался на 8, а не 4. К тому же это заметно по тому, как 2ой персонаж дергается. Ну т.е. если каждые 10 милисек двигается на 4, то за 20 милисек на 8 это резко.

На сервере так же проверял, что каждые 10 милисек, каждый игрок перемещается, если должен, естественно.

Цитата Сообщение от locm Посмотреть сообщение
При приеме, в каких случаях, в поле TheEnd структуры Info_Server записывается число 1?
В таких, когда весь список игроков уже отправлен клиенту, т.е. надо дать ему знать, что уже можно выйти из цикла.

Добавлено через 2 минуты
Цитата Сообщение от locm Посмотреть сообщение
И не помешало бы проверять сколько байт было получено.
А для чего это? Ведь структура и так фиксированной длины. Этой длинны сообщение и отправляется и принимается.
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
21.11.2012, 23:25
Цитата Сообщение от Le Thaw Посмотреть сообщение
В таких, когда весь список игроков уже отправлен клиенту, т.е. надо дать ему знать, что уже можно выйти из цикла.
Как клиент узнает что ему был передан весь список?
Что будет если придет больше одного пакета? Правильно, в структуре Info будет только последний из них. Не это ли причина пропусков?
1
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752
22.11.2012, 00:01  [ТС]
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
                Repeat
                  ReceiveNetworkData(ConnectionID, @Info_Server, SizeOf(Info_Server))
                If Info_Server\TheEnd = 1
                  Info_Server\TheEnd = 0
                  Info_Client\Type = 3
                  Info_Client\Update_Finish = 1
                  Exit_Update = 1
                  SendNetworkData(ConnectionID, @Info_Client, SizeOf(Info_Client))
                Else
                  Type_Object = Info_Server\Type_Object
                  Select Type_Object
                    Case 1
                      If Info_Server\ID = I_Player\ID
                        I_Player\HP = Info_Server\HP
                        I_Player\MP = Info_Server\MP
                        I_Player\x = Info_Server\x
                        I_Player\y = Info_Server\y
                        I_Player\z = Info_Server\z
                        EntityLocate(Player_Camera, I_Player\x, I_Player\y, I_Player\z)
                      Else
                        id_player = Player_ListID(Str(Info_Server\ID))
                        If id_player = 0
                          AddElement(Player())
                          With Player()
                            \ID = Info_Server\ID
                            \Name = Info_Server\Name
                            \Race = Info_Server\Race
                            \x = Info_Server\x
                            \y = Info_Server\y
                            \z = Info_Server\z
                            \MaxHP = Info_Server\MaxHP
                            \MaxMP = Info_Server\MaxMP
                            \HP = Info_Server\HP
                            \MP = Info_Server\MP
                            \Show = 0
                            \Yaw = Info_Server\Yaw
                              
                            Mesh = CreateCube(#PB_Any, 5)
                              
                            width_Cube = 8
                            height_Cube = 8
                            R = Red(200)
                            G = Green(0)
                            B = Blue(0)
                            Texture = CreateTexture(#PB_Any, width_Cube, height_Cube)
                            StartDrawing(TextureOutput(Texture))
                            Box(0, 0, width_Cube, height_Cube, RGB(R, G, B))
                            StopDrawing()
                            Material = CreateMaterial(#PB_Any, TextureID(Texture))
                            \Entity = CreateEntity(#PB_Any, MeshID(Mesh), MaterialID(Material), \x, \y, \z)
                            
                            Player_XYZ(StrD(\x, 3) + ";" + StrD(\y, 3) + ";" + StrD(\z, 3)) = @Player()
                            EntityPhysicBody(\Entity, #PB_Entity_StaticBody, 0)
                            Player_ListID_Entity(Str(\Entity)) = @Player()
                            Player_ListID(Str(\ID)) = @Player()
                            
                            HideEntity(\Entity, 0)
                            RotateEntity(\Entity, 0, \Yaw, 0)
                            
                            StartDrawing(WindowOutput(Window))
                            DrawingFont(FontID(Font))
                            WidthText = TextWidth(\Name)
                            HeightText = TextHeight(\Name)
                            StopDrawing()
                            \Sprite_Name = CreateSprite(#PB_Any, WidthText, HeightText)
                            StartDrawing(SpriteOutput(\Sprite_Name))
                            DrawingFont(FontID(Font))
                            DrawText(0, 0, \Name, RGB(0, 200, 0))
                            StopDrawing()
                            \WidthText = WidthText
                          EndWith
                        Else
                          If id_player <> @Player()
                            ChangeCurrentElement(Player(), id_player)
                          EndIf
                          With Player()
                            \HP = Info_Server\HP
                            \MP = Info_Server\MP
                            \x = Info_Server\x
                            \y = Info_Server\y
                            \z = Info_Server\z
                            \Yaw = Info_Server\Yaw
                            \new_Show = 1
                            EntityLocate(\Entity, \x, \y, \z)
                            RotateEntity(\Entity, 0, \Yaw, 0)
                          EndWith
                        EndIf
                      EndIf
                    Case 2
                      id_mob = Monster_ListID(Str(Info_Server\ID))
                      If id_mob <> 0
                        If id_mob <> @Monster()
                          ChangeCurrentElement(Monster(), id_mob)
                        EndIf
                        With Monster()
                          \HP = Info_Server\HP
                          \MP = Info_Server\MP
                          \x = Info_Server\x
                          \y = Info_Server\y
                          \z = Info_Server\z
                          \new_Show = 1
                          EntityLocate(\Entity, \x, \y, \z)
                        EndWith
                      EndIf
                  EndSelect
                EndIf
                Until Exit_Update = 1
                Exit_Update = 0
Это клиент.
Когда сервер передал весь список. Отправляет последний структурированный пакет, в котором переменная Info_Server\TheEnd = 1

Добавлено через 10 минут
Я могу скинуть весь код сервера и клиента, но станете ли вы разбираться в процедурах передачи пакетов? Клиент 750 строк. Сервер 500.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.11.2012, 00:01
Помогаю со студенческими работами здесь

С сервера отправить данные на клиент
разобрался я более менее с сокетами но вот не как не получается с сервера отправить строчку на клиент реализуем о ли это ? а вот наоборот с...

Клиент на Android не получает данные с сервера
Сервер на компе, написан на .Net, клиент на Android, ставится на устройство. Находясь в одной сети клиент подключается к серверу на .Net,...

Как передавать байт массив клиент->сервер и обратно
Доброго времени суток! Как от сервера передать клиенту не строку, а byte? Просто БД лежит на сервере, вытащить картинку клиенту в...

Клиент - сервер. Как передавать и принимать List<Point>
есть клиент-серверное приложение - &quot;ОнлайнПейнт&quot;). using System; using System.Collections.Generic; using System.Drawing; ...

Android клиент-серверное приложение. Не могу получить данные с сервера
Добрый день. Пытаюсь сделать клиент-серверное приложение: клиент Android, сервер - Windows, программа на Java. Проблема в том, что с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru