[nohtml]
TheOneLLama schreef op 15 augustus 2002 @ 17:48:
[...]
Als je dit zo gaat bekijken met het perspectief "vertrouw enkel de server", dan krijg je de volgende situatie: stel ik heb 500ms lag. Ik ga vooruitlopen. 250ms later berijkt dit de server. De server stuurt direct een correctie: je bent pas 250ms later met lopen begonnen. Deze correctie komt 250ms later weer aan bij mij (de client) en ik word 500ms nadat ik naar voren ben gaan lopen opeens naar achteren geworpen: weg voordeel van de prediction.
dat klopt, daarom moet je de tijd waarop een knop is ingedrukt ook meesturen
(let wel dat 500 ms over het algemeen niet geldt als
speelbare ping... zeker niet met zo'n algoritme)
Je kan dit oplossen door de client z'n woord te nemen op wanneer deze begon te lopen, maar dat is onveilig!
Je kan ook gewoon, in plaats van de client blindelings op z'n woord te vertrouwen, kijken of die tijd enigzins consistent is met de rest
proberen via mechanismes de integriteit van het tijdstip wat de client opgeeft te verhogen (zoals het al zegt: verhogen.. je kan dit niet nou eenmaal niet waarborgen, dat wordt nooit 100% veilig).
dat zeg ik

je zult altijd een trade-off moeten maken, daar ontkom je gewoon niet aan. Maar je kunt wel zorgen dat het zo kloppend mogelijk is.
Natuurlijk is het dan niet 100% veilig tegen cheaten, maar zeg nou zelf, hoeveel ruimte voor cheaten blijft er over? Dat een client opgeeft dat een knop 25ms eerder is ingedrukt dan werkelijk?
Een andere oplossing is, laat die client maar lekker doorlopen, hij denkt dan wel dat ie een beetje ergens anders loopt maar ach. Dan krijg je natuurlijk een probleem als die client ergens op gaat schieten, de client denkt dat ie iets raakt (en ziet bloed in het rond vliegen), terwijl ie op de server mis schiet.
zoals je zelf al aangeeft is dat niet echt een optie

De oplossing ligt vaak in het midden. Maar het probleem is dat als je hier de oplossing in het midden legt, is dat die ergens tussen security en speelbaarheid in ligt.
zoals ik al zei, dat hou je toch wel

Dat de client zelf al een granaat spawned is dus zinloos hier, want na de roundtrip moet ie dat ding weer verplaatsen naar waar ie werkelijk vandaan komt.
een spawn bestaat meer dan alleen een positie, richting en tijdstip, en gespawned worden moet er toch wel. Kun je net zo goed gelijk doen (ook al is het onzichtbaar) zodat je op bericht van de server gelijk de entitiet kan toewijzen
Alleen als de prediction van de stuiter tegen de medespeler op een tijdstip plaatsvind waarover nadat de prediction is uitgevoerd nog updates komen moet er een correctie plaatsvinden. Die kan de client echter zelf doen mbv. de nieuwe gegevens.
klopt idd
En daarmee werp je ons mooi van theorie de praktijk in

Ik heb een keer zelf een posting gelezen van iemand die een engine gemaakt had op zo'n manier die beweerde dat AMD's en Intel's niet bij alle FP berekening dezelfde uitkomst gaven.
tenzij je een heel complex collision model hebt zijn floating point afwijkingen niet zo heel erg belangrijk en vrijwel niet zichtbaar voor het blote oog en de hersenen. (zo van: heej dat klopt niet, die rocket was eigenlijk 0.001 units naar rechts zodat ie net wel tegen de muur kwam ipv ernaast. CHEATERS!)
Wat gelijk mooi aangeeft dat Quake 1, 2 en dus ook 3 kennelijk security opofferen voor speelbaarheid door de client (een deel van) z'n positie te laten berekenen.
nee, je moet alleen zorgen dat de server op 125 fps draait

De enige garantie die je hebt om dit te vertrouwen is de obscurity van je protcol en je excecutable. Vele game designers vertrouwden daar vrijwel op met als gevolg dat er in vele games mensen met 400 KM/u voorbij komen wandelen.
uiteraard, daarom stond het stukje wat daarna kwam er ook bij
De "Ping" is er ontbetrouwbaar.. het enige wat je weet is namelijk de roundtrip, de heenweg kan erg in tijd schelen met de terugweg, zeker als de upstream en downstream verschillen (kabel/ADSL is dat meestal nog zo ook), of de hoeveelheid data die daarover heen gaat op dat moment. Dan heb je nog dingen als lagspikes en Out Of Order delivery (zeker als je UDP gebruikt, wat de meeste games toch wel doen gezien de traagheid van TCP), die ook nog eens allemaal gefaked moeten worden. Het is dus moeilijk om aan de hand hiervan te werken, het is moeilijk verschil te maken tussen wie wel cheat en wie niet (zeker als de latency hoger is), en je wilt toch echt niemand straffen die niet cheat!.
Het kleinste misbruik al irritant kan zijn, stel jij schiet een raket op me af en ik spring opeens 2 keer zo snel weg, of jij nou ziet dat ik dat doe of niet, het is niet eerlijk. (Sterker nog cheats die je niet kan zien zijn zo mogelijk nog irritanter).
Halve ping was misschien een slecht voorbeeld idd, maar ook niet meer dan als dat bedoeld: een voorbeeld. Maar als iemand een knop indrukt en het pakketje doet er meer dan een seconde over kun je je ook gewoon afvragen of het sowieso wel zinnig is om zo'n persoon in de game te laten... ook al is ie eerlijk. Want zeg nou zelf, wil jij spelen met een ping van 2 ms?
Zelfde geldt voor package loss. Als de client een pakketje verstuurt met een commando erin en die raakt zoek, dan klopt het ook niet meer. Imho is het de taak van de client dat te detecteren (de server acknowledged dat pakketje niet), en zich aan te passen aan de nieuwe situatie (positie van de speler enz. opnieuw opvragen). Okee, dit kan resulteren in een schok. Je kunt daar moeilijk over gaan doen, of gewoon accepteren dat je netwerk niet voldoet aan de eisen van het spel (package loss is toch al iets wat weinig voorkomt, zeker met de apparatuur van tegenwoordig. Als je er last van hebt dan is het meestal ook niet maar 1 pakketje maar gewoon 50% van alle packets, omdat er problemen zijn met een router in het netwerk. Compenseren hiervoor zou nutteloos zijn imho)
[
Voor 0% gewijzigd door
.oisyn op 15-08-2002 19:43
. Reden: typo ]