Autore Topic: Performance con AndEngine  (Letto 1178 volte)

Offline Zate

  • Utente normale
  • ***
  • Post: 205
  • Respect: +44
    • Mostra profilo
R: Performance con AndEngine
« Risposta #15 il: 25 Dicembre 2011, 01:44:41 CET »
0
Scusa, nel post non avevo scritto di sendLineToLinePool. Si trova nell' onLoopFinished del LoopModifier.
Quello che stai dicendo è quello che ho già fatto, ma dato che nel codice ho un solo oggetto linea (Line) ogni volta la linea riciclata dal LinePool viene assegnata a line. Appunto per questo vedo solo l'ultima parte della curva, il LoopModifier non fa in tempo a finire che line è cambiata. Togliendo detachSelf() funziona correttamente ma solo una volta, poi ricevo l'errore "pEntity already has a parent".

Offline Verandi

  • Moderatore globale
  • Utente normale
  • *****
  • Post: 378
  • Respect: +74
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Performance con AndEngine
« Risposta #16 il: 25 Dicembre 2011, 12:47:51 CET »
0
ma dato che nel codice ho un solo oggetto linea (Line) ogni volta la linea riciclata dal LinePool viene assegnata a line. Togliendo detachSelf() funziona correttamente ma solo una volta, poi ricevo l'errore "pEntity already has a parent".
In realtà nel codice hai solo una line temporanea che man mano diventa la line presa dal pool. L'errore "pEntity already has a parent" che ti viene se non usi il detachSelf() è perché la prima volta le lines vengono create dal pool e quindi non sono nella scena, mentre la seconda volta prende quelle riciclate senza crearne di nuovo e, nel riciclo, il pool le rende solo invisibili e le esclude dall'update, ma risultano ancora assegnate alla scena. Nel momento in cui il disegno della curva finisce, dovresti sia riciclare tutte le lines, come hai detto che fai, sia rimuoverle dalla scene, in modo da avere il pool "pieno" di lines libere.

Offline Zate

  • Utente normale
  • ***
  • Post: 205
  • Respect: +44
    • Mostra profilo
Re:Performance con AndEngine
« Risposta #17 il: 25 Dicembre 2011, 20:58:10 CET »
0
Io però ho bisogno di settare colore, posizione e larghezza della linea e di modificarla con l'entity modifier e, una volta terminato, eliminare il body (e di conseguenza anche la linea). Quindi ho bisogno di assegnare la linea ottenuta dal pool ad una linea su cui poi effettuerò tutte le modifiche.

Offline Zate

  • Utente normale
  • ***
  • Post: 205
  • Respect: +44
    • Mostra profilo
Re:Performance con AndEngine
« Risposta #18 il: 31 Marzo 2012, 11:38:57 CEST »
0
Ciao. Dopo aver ripreso a cercare di sistemare il problema ieri sera, ci sono riuscito  :-)
Sbagliavo ad attaccare la linee perché sono già attaccate, sono semplicemente invisibili. Dovevo comunque attaccare le linee nuove nel caso ne avessi bisogno. La mia classe LinePool è diventata quindi:
Codice (Java): [Seleziona]
package test.gioco.ae;

import org.anddev.andengine.entity.primitive.Line;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.util.pool.GenericPool;

public class LinePool extends GenericPool<Line> {

        Scene mScene;
       
        public LinePool(Scene pScene){
                mScene = pScene;
        }
       
        @Override
        protected Line onAllocatePoolItem() {
                // TODO Auto-generated method stub
                Line line = new Line(0, 0, 0, 0, 5);
                line.setColor(0, 1, 0);
                mScene.attachChild(line);
                return line;
        }

        @Override
        protected void onHandleRecycleItem(final Line line) {
                line.setIgnoreUpdate(true);
                line.setVisible(false);
        }

        @Override
        protected void onHandleObtainItem(final Line line) {
                line.reset();
        }

}
Chiamando reset viene resettata la linea, ma l'entitymodifier è ancora lì presente, quindi devo chiamare anche clearEntityModifiers.
Quindi modifico l'onSceneTouchEvent:
Codice (Java): [Seleziona]
scene.setOnSceneTouchListener(new IOnSceneTouchListener() {

                        @Override
                        public boolean onSceneTouchEvent(Scene pScene,
                                        TouchEvent pSceneTouchEvent) {
                                // TODO Auto-generated method stub

                                if (pSceneTouchEvent.isActionDown()) {
                                        sX = pSceneTouchEvent.getX();
                                        sY = pSceneTouchEvent.getY();
                                } else if (pSceneTouchEvent.isActionMove()) {
                                        mX = pSceneTouchEvent.getX();
                                        mY = pSceneTouchEvent.getY();

                                        final Line line = getLineFromLinePool();
                                        line.clearEntityModifiers();
                                        line.setPosition(sX, sY, mX, mY);
                                        line.setColor(0, 1, 0);                                
                                        final Body bodyLine = PhysicsFactory.createLineBody(
                                                        mPhysicsWorld, line, lineFixtureDef);
                                        bodyLine.setUserData("line");

                                        sX = pSceneTouchEvent.getX();
                                        sY = pSceneTouchEvent.getY();
                       
                                        final LoopEntityModifier entityModifier = new LoopEntityModifier(
                                                        new IEntityModifierListener() {
                                                                @Override
                                                                public void onModifierStarted(
                                                                                final IModifier<IEntity> pModifier,
                                                                                final IEntity pItem) {

                                                                }

                                                                @Override
                                                                public void onModifierFinished(
                                                                                final IModifier<IEntity> pEntityModifier,
                                                                                final IEntity pEntity) {

                                                                }
                                                        }, 1, new ILoopEntityModifierListener() {
                                                                @Override
                                                                public void onLoopStarted(
                                                                                final LoopModifier<IEntity> pLoopModifier,
                                                                                final int pLoop, final int pLoopCount) {

                                                                }

                                                                @Override
                                                                public void onLoopFinished(
                                                                                final LoopModifier<IEntity> pLoopModifier,
                                                                                final int pLoop, final int pLoopCount) {
                                                                        Main.this.runOnUpdateThread(new Runnable() {
                                                                                @Override
                                                                                public void run() {
                                                                                        sendLineToLinePool(line);
                                                                                       
                                                                                        final PhysicsConnector physicsConnector = mPhysicsWorld
                                                                                                        .getPhysicsConnectorManager()
                                                                                                        .findPhysicsConnectorByShape(
                                                                                                                        line);

                                                                                        mPhysicsWorld
                                                                                                        .unregisterPhysicsConnector(physicsConnector);
                                                                                        mPhysicsWorld.destroyBody(bodyLine);
                                                                                }
                                                                        });
                                                                }
                                                        },

                                                        new SequenceEntityModifier(new AlphaModifier(1, 1,
                                                                        0)));
                                        line.registerEntityModifier(entityModifier);
                                }
                               
                                return false;
                        }

                });

sendLineToLinePool e getLineFromLinePool rimangono così:
Codice (Java): [Seleziona]
        private void sendLineToLinePool(Line line) {
                LINE_POOL.recyclePoolItem(line);
        }

        private Line getLineFromLinePool() {
                return LINE_POOL.obtainPoolItem();
        }

Spero che questo possa aiutare qualcuno :)