29. juni 2011 - 16:28Der er
5 kommentarer og 1 løsning
Threads i Spil
Jeg har tit tænkt på hvad der er mest optimalt mht. spil og Threads, Det er sådan at lige pt. har jeg lavet mig et lille RTS spil, hvor man bygger "Factories" som Producere forskellige ting.. de bliver transporteret af "Trucks". til en base. som så bruges som "Storage".. man kan ikke rigtigt andet i spillet, men det er jo en god start :)
nu er det så sådan at jeg har lavet spillet så det opretter i tråd for hver Lastbil og hver Factory og Bygning/Storage..
men er det en god ide? jeg tænkte mere hvis man så har 1000 objecter som allesammen skal køre en unik tråd... ligenu har de alle adgang til mit "UnitMap" object... som så bliver behandlet af en anden tråd, som sårger for og Tegne det hele i et Grapthics2D object. .som så bliver sendt til Bufferen.
Det er nu mest et spørgsmål om optimering end noget andet tror jeg :)
Det er en MEGET dårlig ide at oprette tråde på denne måde. Hvis du får oprettet 1000 tråde, vil næsten alt CPU gå til context switching.
De fleste spil køre alt i en tråd. For meget avancerede 3D spil, som er udviklet til at udnytte flere CPU kerner, vil der være en tråd per kerne (typisk 3 eller 4 kerner).
Når du programmere spil, skal du lave en game-loop. Dette er i princippet en uendelig while-løkke, som starter med at gøre alt logik, som f.eks. udregne hvad AI'en skal gøre og udregne placering af objekter på skærmen. Derefter gentegner den skærmbilledet. Dette gør den så hurtigt den kan slippe af sted med det.
Når man siger at et spil kører med eksempeltvis 100 frames per second, vil det sige at den når rundt i game-løkken 100 gange per sekund.
Men med den typiske implementation af traade i Java (SUN, IBM, BEA Java pass Windows eller Linux) fungerer det kun godt op til nogle faa hundrede traade.
En traad per objekt og >1000 objekter er ikke et godt design.
Du skal vaelge et design med enten kun antal samtidige traade i CPU som aldrig blokerer eller max. 100-200 traade som blokerer.
arh.. det lyder nu meget logisk :) men det er hovedsageligt for at spillet ikke skal hænge, hvis der nu er et problem med ens netforbindelse, eller hvis man nu lige Tabber ud af spillet.. eller andre problemer der gør at spillet måske ikke kan tænke så meget.
Hvad nu hvis jeg laver min Tråd på denne måde.
Tråd til NetSync (MultiPlayer get/set data) //For ikke og sænke Game loopet for meget. Tråd til GameData //For at data bliver opdateret realtime, for ikke og sænke hastighed ved at spillets grafik hænger.
GameLoop //Spillets Analyze af data til Grafik
Så er det blevet 3 Tråde.. NetSync / GameData / Main Classen
Så kan jeg altid lave SpilleTid logikken i min GameData Tread, så hvis den f.eks hænger i 1.2 sekunder, at den så opdatere korrekt.. og at grafikken samt vinduet ikke fryser, hvis det er tilfældet.. samt hvis den ryger af nettet, kan jeg også ungå frost problemer der.
Lyder det bedre.. eller har jeg helt misforstået konceptet?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.