Почему этот код работает медленно на некоторых устройствах? - PullRequest
0 голосов
/ 22 июля 2010

пожалуйста, посмотрите этот код, когда я запускаю его на Nokia N97, он работает очень медленно, но я проверяю его на Samsung Corby, он работает верно, я думаю, что если я использую проблему с игровым холстом, то это будет неуместно. что я должен сделать, чтобы решить эту проблему.

public class MIDPCanvas extends GameCanvas implements Runnable {

Graphics g;
Image img;
int x = getWidth() / 2;
Thread t = new Thread(this);

public MIDPCanvas() {
    super(true);

    try {
        img = Image.createImage("/pic.jpg");
    } catch (IOException ex) {
        ex.printStackTrace();
    }

    g = getGraphics();
    g.setColor(150, 230, 200);
    g.fillRect(0, 0, getWidth(), getHeight());

    t.start();
}

public void run() {
    while (true) {
        g.drawImage(img, x, getHeight() / 2, Graphics.VCENTER | Graphics.HCENTER);
        x--;
        flushGraphics();
    }
   }
}

спасибо

Ответы [ 3 ]

0 голосов
/ 22 июля 2010

Это очень плохой способ сделать анимацию.

Если вы должны использовать подход с бесконечным циклом, по крайней мере, включайте yield() или Thread.sleep(100) на каждую итерацию. Но гораздо лучше использовать Display.callSerially(). Это обеспечит быструю анимацию устройства.

Google - ваш друг, чтобы объяснить все, как использовать этот метод.

Лично за многие годы работы с приложениями J2ME высокой сложности с большим количеством анимации я никогда не использовал GameCanvas - всегда Canvas, переопределяя метод paint() и анимируя с помощью callSerially().

0 голосов
/ 25 июля 2010

это новый код, но нет движения

public class MIDPCanvas extends Canvas implements Runnable {

Graphics g;
Image img;
int x = getWidth() / 2;
Thread t = new Thread(this);
Display display;

public MIDPCanvas(Display display) {

    this.display = display;
    try {
        img = Image.createImage("/pic.jpg");
    } catch (IOException ex) {
        ex.printStackTrace();
    }

    t.start();
}

public void run() {
    while (true) {
        x--;
        repaint();
        display.callSerially(this);
    }
}

protected void paint(Graphics g) {
    g.drawImage(img, x, getHeight() / 2, Graphics.VCENTER | Graphics.HCENTER);
    display.callSerially(this);
}

}

0 голосов
/ 22 июля 2010

Поскольку у вас есть бесконечный цикл в run(), я бы предположил, что один из вызовов в цикле while блокирует на Corby или это устройство каким-то образом замедляет ваш процесс:

    while (true) {
        g.drawImage( ... );
        x--;
        flushGraphics();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...