Autor Wątek: [J2ME] W poszukiwaniu utraconej wydajności...  (Przeczytany 923 razy)

Offline NPS

  • Użytkownik

# Listopad 14, 2010, 22:31:47
Czyli czy da się to zrobić wydajniej:
int [] rgb = new int[1];
for (int i = 0 ; i < mapWidth ; ++i)
{
    for (int j = 0 ; j < mapHeight ; ++j)
    {
        if (game.map[i][j])
        {
            int width = game.mapBackground.getWidth();
            int height = game.mapBackground.getHeight();
            game.mapBackground.getRGB(rgb, 0, 1,
                i % width, j % height, 1, 1);
            graphics.setColor(rgb[0]);
            graphics.fillRect(i, j, 1, 1);
        }
    }
}
Definicje w Game:
boolean [][] map;
Image mapBackground;
To działa tak - mapBackground zawiera ładny kolorowy obrazek, map zawiera tylko informacje o tym, czy na danej pozycji (dany piksel) jest teren (mapa), czy nie. Przy rysowaniu sprawdzam, czy w danym miejscu jest teren, a jeśli jest, to pobieram kolor piksela w tym miejscu z mapBackground i rysuję go na ekranie.

Działa fajnie (znaczy ładnie rysuje kolorową mapę), ale wydajność leży. Chciałem to zrobić trochę inaczej - pokolorować mapę raz na początku gry, a potem już wyświetlać jedną funkcją całą kolorową mapę. Problem w tym, że nie wiem, jak w danym obrazku (Image, ale możecie zaproponować coś innego) zmienić alphę piksela. Da się to zrobić (lepiej) w J2ME?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline szatkus

  • Użytkownik
    • site

# Listopad 15, 2010, 14:43:26
Wciągnij obrazek do tablicy, poustawiaj przezroczyste pixele gdzie trzeba i zrób nowy przy pomocy createImage.

Offline NPS

  • Użytkownik

# Listopad 15, 2010, 23:35:43
Dzięki, nie zauważyłem tej funkcji. I faktycznie pomogło... Tyle, że dalej mam mało fpsów (konkretnie 1 na jakimś emu). Cały problem w powyższych dwóch forach - przy rozdzielczości 240x320 px musi zająć się 76800 pikselami, co niestety zajmuje zbyt długo. Jak myślicie, da się tutaj jeszcze cokolwiek poprawić?

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Listopad 16, 2010, 00:04:09
To nie przejdzie żadną miarą. Przede wszystkim nie rób tej operacji co klatkę. Zrób sobie dodatkową bitmapę, gdzie będziesz trzymał przygotowane dane. Jeżeli zmian ma być dużo, to możesz zrobić tą bitmapę w formie tablicy int[] i modyfikować (w MIDP2.0 było coś do szybkiego wyświetlenia tablicy int[]).

Główne stwierdzenie jest jednak takie, że w J2ME każdy algorytm ręcznie dotykający każdego piksela w każdej klatce będzie zły (no, chyba że piszesz silnik pokroju Doom RPG i naprawdę wiesz co robisz i jak robisz).