windows - Hvordan håndterer jeg oprettelsen/ødelæggelsen af ​​mange objekter i hukommelsen effektivt?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er i færd med at lave et spil af min egen. Et af målene er at have så mange objekter i verden som muligt. I dette spil skal mange objekter oprettes i en uforudsigelig periode (som et våbenbrænding vil skabe et objekt), og når den projektil rammer noget, skal objektet også ødelægges (og måske den ting det rammer) .


Så jeg spekulerede på, hvad den bedste måde at håndtere dette i hukommelsen er. Ive tænkte på at skabe en stak eller et bord og tilføje pointerne til disse objekter der og skabe og ødelægge disse objekter på efterspørgsel, men hvad hvis flere hundrede (eller tusinde) objekter forsøger at blive skabt eller ødelagt straks mellem rammer? Jeg ønsker at holde en stabil og flydende rammehastighed, og en sådan stigning i systemopkald ville helt sikkert bremse det ned.


Så jeg troede jeg kunne forsøge at holde en række genstande i hukommelsen, så jeg kun kunne kopiere informationer til dem og bruge dem uden at skulle anmode om hukommelsen for dem på forespørgsel. Men hvor meget hukommelse skal jeg forsøge at reservere? Eller skal jeg ikke bekymre mig om det så længe brugerens computer har nok (formodentlig vil de fokusere på spillet og ikke køre en vejrssimulering i baggrunden).


Hvad ville være den bedste måde at håndtere dette på?

Bedste reference


Kort svar: Det afhænger af objektets forventede levetid.


Normalt kombineres metoderne. Et objekt, der er ret statisk og sandsynligvis ikke vil blive fjernet eller oprettet ofte (normalt spillere, niveauer, visse objekter i niveauerne osv.) Oprettes med den første metode, du beskrev (en liste over objekter, et array, en singleton, osv.) Den nøjagtige metode afhænger af spillet, og objektet oprettes.


For kortsigtede genstande, som kugler, partikelvirkninger eller i nogle spil, bruges fjenderne selv, noget som objekt pool mønster normalt. En smule hukommelse er vendt om i begyndelsen af ​​spillet og genanvendt i løbet af spillet for kugler og smukke partikeleffekter. Hvad angår hvor meget hukommelse skal jeg reservere? , er det ideelle svar 'så lille som muligt'. Desværre er det svært at finde ud af det nogle gange. Den bedste måde at finde ud af, er at tage et gæt på, hvor mange kugler eller hvad du ikke planlægger at have på skærmen til enhver tid, formere med to (for når du beslutter dig for det din kugle helvede skydespil virker ikke rigtig godt med kun 50 kugler) og derefter tilføje en lille buffer. For at gøre det nemmere skal du gemme denne værdi i en let forstået #define BULLET\_MAX 110, så du kan ændre den, når spillet er tættere på det, og du kan med rimelighed være sikker på, at værdien ikke vil svinge så meget. sjovt, du kan binde værdien til en config-variabel, og har grafikindstillingen påvirket den. [2]

Andre referencer 1


I real-time spil, hvor fluiditet er kritisk, tildeler de ofte en stor del af hukommelse i begyndelsen af ​​niveauet og undgår enhver tildeling/deallokation midt i spillet.


Du kan ofte designe, så spilmekanikeren forhindrer spillet i at løbe tør for hukommelse (som for eksempel at øge chancen for, at våben sætter sig fast, når spilleren skyder for meget for ofte).


I sidste ende skal du dog teste dit spil i din målrettede minimale understøttede maskine, hvis den er hurtig nok, så er den hurtig nok og ikke overkomplicerer din kode til hypotetiske situationer.