Мултиплейър игра в реално време (концептуален въпрос)

Четох тази статия от Valve, която изглежда обяснява архитектурата на тяхната мултиплейър система. Изглежда, че забавят изобразяването с няколко отметки на клиента, за да могат да обработват изпуснати пакети, но също така изпращат пакети като "делта моментни снимки" (разликата между две съседни състояния).

Да предположим, че имаме времена A, B, C и клиентът е правилен в момент A, но изпуска пакета в B и след това получава този в C. Как може правилно да изведе състоянието в момент C? Пакетът в C само казва (мисля) делтата между състояния B и C, а клиентът знае само състоянието в A. Какво пропускам тук?


person Jesse Beder    schedule 23.12.2008    source източник
comment
Това не е в реално време в ‹a href=en.wikipedia.org/wiki/ Real-time_computing›conventional sense‹/a›.   -  person andersoj    schedule 10.04.2009


Отговори (6)


Делтите не трябва да са относителни към предишното съобщение, което е изпратено (чрез делта или моментна снимка). Вместо това, те биха били относителни спрямо последното потвърдено състояние. Така че в примера по-горе актуализацията на C може да бъде делта спрямо A. Следователно загубата на съобщение B се превръща в неудобство, тъй като делтите стават все по-големи (и потенциално се натрупва грешка), но в крайна сметка съобщение ще премине и ще бъде потвърдено, и сървърът може да започне да изпраща делти спрямо това актуализирано състояние.

person Kylotan    schedule 01.06.2009

Пълното състояние се синхронизира периодично или по заявка на клиента. Интерполация/екстраполация може да се използва за компенсиране на загубата на пакети, докато се чака пълна актуализация на позицията. Някои събития изискват надеждна доставка и може да се добави средство за потвърждение на получаването.

Глен Фидлър има няколко отлични статии за мрежови игри в своя блог.

Тази стара статия за работата в мрежа на Quake 3 звучи подобно. Делта състоянията представляват промени от последното потвърдено от клиента състояние, което е получено. Така че, ако сървърът види, че клиентът изостава, следващата делта ще бъде създадена от разликата между състоянието на клиента и текущото състояние на сървъра.

person Judge Maygarden    schedule 23.12.2008

Без да разглеждам реализацията, бих си представил, че пакет C също включва идентификатора на пакета, от който е делта (в този случай пакет B).

Когато клиентът получи пакет C след пакет A, той ще знае, че все още не е видял пакет B и следователно може да поиска пълна актуализация от сървъра.

person Andrew Rollings    schedule 23.12.2008
comment
Това не предполага ли, че делта B има същото съдържание като делта C? - person Andrew Rollings; 24.12.2008
comment
Или идентификаторът на пакета, от който е делта, или пореден номер, или някакъв друг лесен начин за проследяване на реда на пакетите... - person Marcin; 24.12.2008
comment
Е, обикновено пакетите имат клеймо за време и пореден номер. Това прави възможна точна интерполация между пропуснатите пакети. - person Andrew Rollings; 24.12.2008
comment
Но в статията се казва, че ...интерполацията дори би работила, ако моментната снимка [B] липсваше поради загуба на пакети - това изглежда показва, че не се нуждае от пълна актуализация само с един изгубен пакет. - person Jesse Beder; 25.12.2008
comment
да Сигурен съм, че делтата ще бъде достатъчно малка, за да може интерполацията да е наред. Просто би било по-малко точно. Те вероятно също използват алгоритми за прогнозиране, базирани на вероятния проектиран път на обекта, за да „синтезират“ позиция B за интерполация. Quake 3 направи много неща в тази област. - person Andrew Rollings; 25.12.2008

Предполагам, че от време на време изпращат пълна моментна снимка. ето защо забавените игри включват хора, които работят с грешна скорост, тъй като делта кадрите се изпускат, след което се „телепортират“ до правилната позиция, когато се появи пълна моментна снимка.

person Jimmy    schedule 23.12.2008

От свързаната статия:

Обикновено пълните (не-делта) моментни снимки се изпращат само когато стартира игра или клиент страда от тежка загуба на пакети за няколко секунди. Клиентите могат да поискат пълна моментна снимка ръчно с командата cl_fullupdate.

person RSlaughter    schedule 23.12.2008
comment
Да, но тук говорим за тежка загуба на пакети за няколко секунди. Нито една загуба на пакет, която изрично посочва, че може да възстанови. - person Jesse Beder; 24.12.2008

Сървърът вероятно изпраща пълни синхронизации (т.е. не делта) периодично, но по-рядко. Поне това правя.

person ggambett    schedule 23.12.2008