ArrayList remove(i) tar den bort helt?

Permalänk

ArrayList remove(i) tar den bort helt?

hej håller på med ett simpelt 2d particlesystem i java och då använder jag en arraylist för att hålla mina particles i, just nu går det ut på att partikeln börjar i mitten och åker ut från den medans den liksom fadar ut, när partikeln har nått en gräns använder jag mig av metoden remove(i) och de spawnar en ny partikel i mitten men medans jag kör programet tappar jag sakta fps och då tänkte jag lite om det kan va att remove() inte tar bort den helt skulle det kunna vara så? eller vad tror ni?

Visa signatur

Att programmera eller att inte programmera, det är frågan?

Permalänk
Medlem

Vadå tar bort helt? remove() tar inte bort partikeln överhuvudtaget, bara dess förekomst i din ArrayList. Så ifall det fortfarande finns referenser kvar till partikeln någon annanstans så är det klart den lever vidare, det kan inte ArrayList göra något åt.

Permalänk
Skrivet av Curik:

Vadå tar bort helt? remove() tar inte bort partikeln överhuvudtaget, bara dess förekomst i din ArrayList. Så ifall det fortfarande finns referenser kvar till partikeln någon annanstans så är det klart den lever vidare, det kan inte ArrayList göra något åt.

men när jag renderar partikel systemet ser det ut såhär:

for(int i = 0; i < particles.size();i++){ particles.get(i).render(g); } och såhär när jag tar bort den: for(int i = 0; i < particles.size();i++){ if(time >= 10){ particles.remove(i); } }

då borde den väll ändå rendera en parikel mindre?

Visa signatur

Att programmera eller att inte programmera, det är frågan?

Permalänk
Medlem
Skrivet av kallepårymmen:

men när jag renderar partikel systemet ser det ut såhär:

for(int i = 0; i < particles.size();i++){ particles.get(i).render(g); } och såhär när jag tar bort den: for(int i = 0; i < particles.size();i++){ if(time >= 10){ particles.remove(i); } }

då borde den väll ändå rendera en parikel mindre?

Vad är time för något? Den är så att säga "konstant" i din andra loop - Som det står nu tar tar du alltså bort ALLA partiklar i particles om time >= 10.

Permalänk
Medlem
Skrivet av kallepårymmen:

men när jag renderar partikel systemet ser det ut såhär:

for(int i = 0; i < particles.size();i++){ particles.get(i).render(g); } och såhär när jag tar bort den: for(int i = 0; i < particles.size();i++){ if(time >= 10){ particles.remove(i); } }

då borde den väll ändå rendera en parikel mindre?

Om time är större eller lika med tio tar du bort alla partiklar ur arraylisten, annars tar du inte bort något.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Om time är större eller lika med tio tar du bort alla partiklar ur arraylisten, annars tar du inte bort något.

Skrivet av dagbro:

Vad är time för något? Den är så att säga "konstant" i din andra loop - Som det står nu tar tar du alltså bort ALLA partiklar i particles om time >= 10.

aha oj är lite trött

for(int i = 0; i < particles.size();i++){ if(particles.get(i).time >= 10){ particles.remove(i); } }

så ska det vara

Visa signatur

Att programmera eller att inte programmera, det är frågan?

Permalänk
Medlem
Skrivet av kallepårymmen:

aha oj är lite trött

for(int i = 0; i < particles.size();i++){ if(particles.get(i).time >= 10){ particles.remove(i); } }

så ska det vara

när ökar du time?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

när ökar du time?

time ökar medans partikeln förflyttar sig från mittpunkten

Visa signatur

Att programmera eller att inte programmera, det är frågan?

Permalänk
Medlem

Nu är jag ingen javakodare, men av vad jag har förstått skall dina partiklar raderas av att anropa remove så länge inga andra referenser till dem existerar. D.v.s. om din lista är det enda stället du kan komma åt dem.

Själv kodar jag mest C++ och tacka vet jag delete

Edit: Alltså tror jag att du antingen har referenser kvar till dina partiklar någon stans i programmet eller att det är något annat som får det att gå långsamt.

Permalänk
Medlem

for(int i = 0; i < particles.size();i++){ if(particles.get(i).time >= 10){ particles.remove(i); } }

Inte direkt relaterat till din fråga, men den där koden har en bugg.. När du tar bort element i så shiftas ju alla element ett steg åt vänster (tar du bort index 0 så blir index 1 flyttat till 0, 2 till 1, osv).. Vilket gör att du hoppar över att kolla en partikel varje gång du tar bort en gammal partikel.

Sen något som skulle kunna orsaka ditt prestandaproblem, att shifta alla element med 1 steg är rätt dyrt, tar du bort ett element på index i så kör den ju memcopy på index i+1 till list.length för att "flytta ihop dem" (och då du säkert oftast tar bort element i början av arraylisten pga. timeout grejen så lär det ju bli en jäkla massa minneskopiering av i princip hela array), så tycker helt klart att du bör titta på någon typ av länkad lista istället om du inte har någonting som kräver O(1) random access som en array backend ger dig (alternativt hantera borttagningen i arraylisten själv (dvs. själv flytta ihop elementen), eftersom då får du som värst kopiera particles.length antal element ( O(n) ), istället för som nu där du som värst kopierar ca (particles.length*(particles.length-1)/2) element ( O(n^2) ).

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Medlem

Det kan ju även vara en minnesläcka som gör att det blir segare med tiden. Men då måste ju dina partiklar ha referenser någon annanstans för att det ska vara möjligt..