roy-t schreef op maandag 23 augustus 2010 @ 18:52:
Sorry maar aardig modus gaat nu uit. Je kletst uit je nek en doet door die domheid ontzettend elitair, yeah right, CCP en Blizzard hebben meerdere PHD network-engineers werken en hebben toch af en toe bugs, maar nee meneer gaat het foutvrij voor 2 maken dus dan werkt datzelfde algoritme ook voor infinity and beyond, daar hadden ze nog nooit aan gedacht bij CCP...
Maar ach, hier kom je uiteindelijk zelf wel achter

Je wilt niet weten hoe vaak mensen zulke dingen tegen mij zeggen. Meestal hebben ze ook gelijk, maar ik probeer het toch altijd. Niet alleen met programmeren overigens.
rapture schreef op maandag 23 augustus 2010 @ 19:03:
[...]
Elke gameserver heeft grenzen in zijn schaling, vroeg of laat knal je tegen de grenzen aan. Dan zoek je wel naar een manier op de grens te verleggen.
Een eenvoudig voorbeeld is sequentieel schoten verwerken. Elke speler heeft 8 guns/lasers op zijn ruimteschip staan en ze schieten om de 4 seconden. Normaal zou elke speler op een willekeurig moment de guns activeren zodat je gemiddeld kan zeggen 200 speler * 8 guns / 4 seconden = 400 schoten per seconde.
Maar je kan op TS/vent ook een doelwit als primair doelwit uitroepen en een groot percentage van 200 spelers rammen allemaal op F1 tot F8 om hun guns allemaal tegelijkertijd af te gaan. Stel dat 100 spelers binnen een tijdsperiode van 1 seconde het vuur openen, dan heb je 800 schoten per seconde. Stel dat je in 1 ms een schot kan doorrekenen en je bent 0,8s bezig met de schoten te verwerken.
EVE Online kennende proberen de allianties zoveel spelers in te zetten totdat ze de node kapot krijgen. Met 400 man worden de schoten in 1,6 seconde doorgerekend, 800 man 3,2 seconde, 1000 man 4 seconde en 1600 man 6,4 seconde. Inderdaad de guns zouden in EVE sneller schieten dan dat ze kunnen doorgerekend worden en ze beginnen te cyclen. De client toont dat een schot van 4 seconde na 4 seconden nog altijd niet gedaan is. Tussendoor moet de posities van de ruimteschepen die aan het bewegen zijn ook doorgerekend worden.
Bij mijn MMO-RTS heb je geen lange-afstands wapens en zal de gameplay zo zijn dat men niet gaat groeperen en verspreid blijven. Spelers worden enkel met elkaar verbonden als ze in elkaars actie-radius zijn. Ondanks dat het een MMO-RTS is ben je dus eigenlijk maar verbonden met slechts een paar spelers tegelijk; zeker niet meer dan 32.
Het dynamisch verbinden van de clients gebeurt via een stukje software dat de afstanden tussen clients berekent en op basis daarvan clients de opdracht geeft een verbinding naar elkaar te openen. Dit stukje software weer op enkele clients. Iedere server krijgt dan "beheer" over een bepaald lap grond. Deze server moet de afstand bereken tussen alle clients en clients de opdracht geven met elkaar te verbinden indien nodig. Ook zal deze server clients doorgeven aan andere servers indien de client's units zich buiten het toegewezen gebied van de server verplaatsen. Omdat de servers op clients draaien zullen meerdere clients toegewezen worden aan hetzelfde gebied; mocht 1 van de server onverwacht verdwijnen omdat de client het spel afsluit, dan is die andere client met de server er nog. Indien alle clients met servers over dat gebied verdwijnen moet er z.s.m. een nieuwe client toegewezen worden of zal er een eventuele backup server gebruikt worden zolang er nog geen nieuwe client is toegewezen.
Houd er rekening mee dat het hier gaat om servers die clients met elkaar verbinden wanneer ze in de buurt van elkaar komen; als het een paar seconden duurt voordat er eindelijk een nieuwe server is, merken de spelers daar niets van. Als dit nog langer duurt is er een kans dat 2 spelers niet met elkaar verbonden zijn, ondanks dat ze wel elkaar zouden kunnen zien. Dan krijg je dus synchronisatie-problemen en dit mag dus niet voorkomen.
Verder, de clients krijgen de melding om hun positie eens in de paar seconden door te geven aan de servers; de clients weten dus welke servers beheer hebben over het gebied waar zij zijn. Indien een speler het spel normaal afsluit, zal de client's server nog doorgeven aan de centrale server dat er een nieuwe server toegewezen moet worden aan een client, waarna de client's server al zijn clients doorverwijst naar de nieuwe server.
Het spel zelf is niet zo complex dus de meeste clients hebben genoeg CPU kracht over voor dit soort taken. Eventueel ga ik een soort performance test draaien van te voren om te zien of er nog CPU kracht over is op de client. Natuurlijk moet er ook genoeg bandbreedte over zijn, maar de benodigde bandbreedte zal wel meevallen; het gaat hier om clients die enkel een globale indicatie van hun locatie meesturen met een eventuele radius, bijv. locatie 14567.234x-13453.334, en de units zijn verspreid binnen een cirkel/vierkant met een diameter/hoogte van 34.933.
Een bericht-type, 3 double's of float's, een IP'tje of client-id en een timestamp moet voldoende zijn. Het berekenen van de afstand tussen 2 clients is dan ook met een simpel sommetje gelukt. De CPU kracht die nodig is, is wat hoger: als een server 256 spelers toegewezen krijgt moet het 256^2 afstanden berekenen.
Vervolgens moet de server terugsturen met welke clients een client moet verbinden en met welke clients hij de verbinding moet verbreken. De server moet dus een soort database hebben met welke clients een client verbonden is. Indien iedere client met gemiddeld 16 andere clients verbonden is heb je hier een array van 256x16 client-id's. Vervolgens moet de server controleren of er veranderingen zijn of de client met een andere client verbonden moet worden door de resultaten van de afstands-tests te vergelijken met de huidige database en alle veranderingen doorgeven aan de clients.
Alle veranderingen moeten vervolgens weer doorgegeven worden aan de clients. Dit zijn maximaal 256 berichtjes met een lijstje met client-id's waarmee verbonden moet worden en waarmee de verbinding verbroken moet worden.
Ik kan zo nog wel 'ff doorgaan, maar om nou het hele verhaal weer uit te typen lijkt me onnodig.
[
Voor 94% gewijzigd door
Gamebuster op 23-08-2010 19:43
]