Thread te langzaam. Betere manier om code uit te voeren (Android AndEngine)?

Ik ontwikkel een game waarbij de gebruiker sprites maakt met elke aanraking. Ik heb dan een threadrun om te controleren of die sprites tegen andere botsen. Het probleem is, als ik te snel tik, veroorzaak ik een fout van de ongeldige wijzeruitzondering. Ik denk dat het komt omdat ik sneller tik dan dat mijn thread werkt. Dit is de draad die ik heb:

public class grow implements Runnable{

        public grow(Sprite sprite){

        }
        @Override
        public void run() {
            float radf, rads; //fill radius/stationary radius
            float fx=0, fy=0, sx, sy;

            while(down){
                if(spriteC[spriteNum].active){
                    spriteC[spriteNum].sprite.setScale(spriteC[spriteNum].scale += 0.001);
                    if(spriteC[spriteNum].sprite.collidesWith(ground)||spriteC[spriteNum].sprite.collidesWith(roof)||
                            spriteC[spriteNum].sprite.collidesWith(left)||spriteC[spriteNum].sprite.collidesWith(right)){
                        down = false;
                        spriteC[spriteNum].active=false;
                        yourScene.unregisterTouchArea(spriteC[spriteNum].sprite);
                    }

                    fx = spriteC[spriteNum].sprite.getX();
                    fy = spriteC[spriteNum].sprite.getY();
                    radf=spriteC[spriteNum].sprite.getHeightScaled()/2;

                    Log.e("F"+Float.toString(fx),Float.toString(fy));
                    if(spriteNum>0)
                         for(int x=0;x

Betere oplossing voor iedereen? Ik weet dat er iets te doen is met een handler, maar ik weet niet precies wat dat is en hoe ik er een moet gebruiken.

0
Ja, dat hielp ook. Bedankt.
toegevoegd de auteur rphello101, de bron
Uw logboekregistratie werkt net zo veel als uw werkelijke botsdetectie doet!
toegevoegd de auteur David Schwartz, de bron

2 antwoord

U moet de uitvoering van uw "groeien" Runnable synchroniseren zodat de methode run() niet met zichzelf wordt verschoven wanneer u snel op de knop drukt, zoals u hebt opgemerkt. U kunt dit waarschijnlijk doen met een eenvoudige gesynchroniseerde methode of blok, maar een wachtrij is ook een mogelijkheid als u meer geavanceerde besturing wenst.

Voor wat betreft snelheid, profiel het met traceview en vind de knelpunten. Zoals een gebruiker hierboven heeft opgemerkt, kan het loggen behoorlijk duur zijn.

1
toegevoegd
Het synchroniseren en verwijderen van de logs heeft wel wat geholpen, maar ik kan het nog steeds crashen. Nog andere ideeën?
toegevoegd de auteur rphello101, de bron
post een stacktrace
toegevoegd de auteur Thomas Dignan, de bron

Kostte me een tijdje om uit te zoeken hoe het moest, maar een update-handler werkte heel goed. Ik heb zojuist een scène-update-handler gebruikt. Voer deze code uit bij het maken van een scène in onCreateScene:

        scene.registerUpdateHandler(new IUpdateHandler() {

                @Override
                public void reset() {         
                }

                @Override
                public void onUpdate(float pSecondsElapsed) {
//Whatever you want to update. Any moving or scaling object essentially.
    }

Stuur rphello101 a PM op http://www.andengine.org/forums/ als iemand meer informatie nodig heeft .

0
toegevoegd