Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Java 2D для игр, графика для игры 
:(
    Опции темы
Fieral
Дата 25.11.2010, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Добрый день.
Я пишу 2D авиа-симулятор на Java.

Для отрисовки графики использую стандартные классы: java.awt.image.BufferedImage и java.awt.Graphics. Создаю в памяти буфер java.awt.image.BufferedImage - рендерю в него и затем вывожу на форму.

Вот тест отрисовки картинки размера 1024*768:

Код

package test;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Gtest {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        BufferedImage I = ImageIO.read(new File("textures\\1024x768.png"));
        BufferedImage O = new BufferedImage(I.getWidth(), I.getHeight(),
                BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = O.createGraphics();
        long t = 0;
        
        
        for (int i = 0; i < 100; i++) {
            
            t = System.currentTimeMillis();
            g.drawImage(I, 0, 0, null);
            t = (System.currentTimeMillis() - t);
        
            System.out.println(": " + t);
            System.out.println(": " + (((int)(100*1000.0/t))/100.0)+" fps");
        }
    }
}



Код

: 109ms
: 9.17 fps
: 79ms
: 12.65 fps
: 78ms
: 12.82 fps
: 78ms
: 12.82 fps
: 94ms
: 10.63 fps
: 78ms
: 12.82 fps
: 78ms
: 12.82 fps
: 78ms
: 12.82 fps
...


Как видно при запуске отрисовка занимает около 78 миллисекунд с FPS 10-12 кадров в секунду, что как-то не густо.

Собсно вопрос: есть ли в Яве что-то получше java.awt или всё-таки придётся использовать серьёзные либы (типа OpenGL)?



--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
Skipy
Дата 25.11.2010, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 6
Всего: 16



Попробуйте повозиться с java.awt.image.VolatileImage: http://download.oracle.com/javase/6/docs/a...atileImage.html


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
Skynin
Дата 25.11.2010, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 6
Всего: 10



Цитата

Собсно вопрос: есть ли в Яве что-то получше java.awt или всё-таки придётся использовать серьёзные либы (типа OpenGL)?


Использование OpenGL в Java-приложении, статья

jMonkeyEngine

Это сообщение отредактировал(а) Skynin - 25.11.2010, 19:31
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
Fieral
Дата 26.11.2010, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



VolatileImage даёт теже 10 fps :(

Код

package test;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.awt.image.VolatileImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Gtest {
    private static int H = 768;
    private static int W = 1024;
    private static VolatileImage vImg;
    VolatileImage backBuffer = null;
    private Graphics gBB;

    static GraphicsEnvironment ge = GraphicsEnvironment
            .getLocalGraphicsEnvironment();
    static GraphicsConfiguration gc = ge.getDefaultScreenDevice()
            .getDefaultConfiguration();

    private static VolatileImage createVolatileImage(int w, int h) {
        return createVolatileImage(w, h, VolatileImage.OPAQUE);
    }

    private static VolatileImage createVolatileImage(int width, int height,
            int transparency) {

        VolatileImage image = null;

        image = gc.createCompatibleVolatileImage(width, height, transparency);
        

        int valid = image.validate(gc);

        if (valid == VolatileImage.IMAGE_INCOMPATIBLE) {
            image = createVolatileImage(width, height, transparency);
            return image;
        }

        return image;
    }

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        BufferedImage I = ImageIO.read(new File("textures\\1024x768.png"));

        long t = 0;
        for (int i = 0; i < 100; i++) {
System.gc();
            t = System.currentTimeMillis();
            draw(I);
            t = (System.currentTimeMillis() - t);

            System.out.println(": " + t + "ms");
            System.out.println(": " + (((int) (100 * 1000.0 / t)) / 100.0)
                    + " fps");
        }
    }

    static Graphics2D g;

    private static void draw(BufferedImage i) {

        vImg = createVolatileImage(W, H);
        do {
            if (vImg.validate(gc) == VolatileImage.IMAGE_INCOMPATIBLE) {
                vImg = createVolatileImage(W, H);
            }
            g = vImg.createGraphics();
            g.drawImage(i, 0, 0, null);
            g.dispose();
        } while (vImg.contentsLost());

    }
}




Код

: 531ms
: 1.88 fps
: 94ms
: 10.63 fps
: 78ms
: 12.82 fps
: 94ms
: 10.63 fps
: 79ms
: 12.65 fps
: 78ms
: 12.82 fps
: 94ms
: 10.63 fps
: 78ms
: 12.82 fps
: 94ms
: 10.63 fps
: 94ms
: 10.63 fps
: 78ms
: 12.82 fps
: 94ms
: 10.63 fps

--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
kamre
Дата 26.11.2010, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 1
Всего: 13



Что-то явно не так делаете, не должна Java2D так сильно тормозить.

Вот пример:

Код

import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Game extends JFrame {

    public static void main(String[] args) {
        new Game();
    }

    private static int frameCountInterval = 1000;
    private int frameCount;
    private long ptime;
    private BufferedImage image;

    public Game() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setUndecorated(true);
        setSize(1024, 768);
        setVisible(true);
        createBufferStrategy(2);
        try {
            image = ImageIO.read(new File("SkyView2.PNG"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        gameLoop();
    }

    private void gameLoop() {
        frameCount = 0;
        ptime = System.currentTimeMillis();
        while (true) {
            drawStuff();
            frameCount++;
            if (frameCount == frameCountInterval)
                updateFrameRate();
        }
    }

    private void drawStuff() {
        BufferStrategy bs = getBufferStrategy();
        Graphics g = null;
        try {
            g = bs.getDrawGraphics();
            g.drawImage(image, 0, 0, null);
        } finally {
            g.dispose();
        }
        bs.show();
    }

    private void updateFrameRate() {
        long ctime = System.currentTimeMillis();
        long ms = ctime - ptime;
        ptime = ctime;
        double fc = 1000 * (double) frameCountInterval / ms;
        String frameRateString = String.format("%d frames in %d ms = %.3f FPS", frameCountInterval, ms, fc);
        System.out.println(frameRateString);
        frameCount = 0;
    }
}


На десктопе (WinXP Core 2 Duo 3GHz NVIDIA 9800GTX+, d3d pipeline в Java2D) выдает примерно 4000 FPS.
PM MAIL   Вверх
Fieral
Дата 26.11.2010, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Код

10 frames in 969 ms = 10,320 FPS
10 frames in 938 ms = 10,661 FPS
10 frames in 922 ms = 10,846 FPS
10 frames in 921 ms = 10,858 FPS
10 frames in 922 ms = 10,846 FPS
10 frames in 938 ms = 10,661 FPS
10 frames in 937 ms = 10,672 FPS
10 frames in 922 ms = 10,846 FPS
10 frames in 922 ms = 10,846 FPS
10 frames in 922 ms = 10,846 FPS
10 frames in 922 ms = 10,846 FPS
10 frames in 906 ms = 11,038 FPS
10 frames in 922 ms = 10,846 FPS
10 frames in 922 ms = 10,846 FPS
10 frames in 922 ms = 10,846 FPS
10 frames in 922 ms = 10,846 FPS
10 frames in 906 ms = 11,038 FPS
10 frames in 937 ms = 10,672 FPS
10 frames in 938 ms = 10,661 FPS
10 frames in 906 ms = 11,038 FPS



В принципе логично - чегоб он работал быстрее, если отрисовка одного кадра в буфер без окон и фреймов занимает 90ms.
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
kamre
Дата 26.11.2010, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 1
Всего: 13



На моем слабом ноуте (Win7 Intel U2300 1.2GHz со встроенной видеокартой Intel Mobile) выдает:

1000 frames in 6863 ms = 145,709 FPS
1000 frames in 6840 ms = 146,199 FPS
1000 frames in 6830 ms = 146,413 FPS
1000 frames in 6823 ms = 146,563 FPS
1000 frames in 6807 ms = 146,908 FPS

Что же у вас тогда за железо такое? 

Может это OpenJDK на линупсе с кривыми драйверами? Если на линупсе, то можно попробовать запускать с -Dsun.java2d.opengl=True, должно быстрее заработать, если драйвера openGL поддерживают.
PM MAIL   Вверх
Fieral
Дата 26.11.2010, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Регистрация: 10.12.2007

Репутация: нет
Всего: 1



Ок.
Я использовал ключи

Код

-Dsun.java2d.translaccel=true
-Dsun.java2d.ddforcevram=true //unnecessary as of 1.5 Beta 1


Из http://gpwiki.org/index.php/Java:Tutorials...mage#References

И с ними не работало, а вот с ключём: 

Код

-Dsun.java2d.opengl=True


Отрисовка VolatileImage херачит на полную катушку. smile


Код

package test;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.awt.image.VolatileImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Gtest {
    private static int H = 768;
    private static int W = 1024;
    private static VolatileImage vImg;
    VolatileImage backBuffer = null;
    private Graphics gBB;

    static GraphicsEnvironment ge = GraphicsEnvironment
            .getLocalGraphicsEnvironment();
    static GraphicsConfiguration gc = ge.getDefaultScreenDevice()
            .getDefaultConfiguration();

    private static VolatileImage createVolatileImage(int w, int h) {
        return createVolatileImage(w, h, VolatileImage.OPAQUE);
    }

    private static VolatileImage createVolatileImage(int width, int height,
            int transparency) {

        VolatileImage image = null;

        image = gc.createCompatibleVolatileImage(width, height, transparency);
        

        int valid = image.validate(gc);

        if (valid == VolatileImage.IMAGE_INCOMPATIBLE) {
            image = createVolatileImage(width, height, transparency);
            return image;
        }

        return image;
    }

    public static void main(String[] args) throws IOException, InterruptedException {
        // TODO Auto-generated method stub

        BufferedImage I = ImageIO.read(new File("textures\\1024x768.png"));

        long t = 0;
        for (int i = 0; i < 100; i++) {
System.gc();
            t = System.currentTimeMillis();
            draw(I);
            [color=red]Thread.sleep(15);[/color]//Для равномерности.
            t = (System.currentTimeMillis() - t);

            System.out.println(": " + t + "ms");
            System.out.println(": " + (((int) (100 * 1000.0 / t)) / 100.0)
                    + " fps");
        }
    }

    static Graphics2D g;

    private static void draw(BufferedImage i) {

        vImg = createVolatileImage(W, H);
        do {
            if (vImg.validate(gc) == VolatileImage.IMAGE_INCOMPATIBLE) {
                vImg = createVolatileImage(W, H);
            }
            g = vImg.createGraphics();
            g.drawImage(i, 0, 0, null);
            g.dispose();
        } while (vImg.contentsLost());

    }
}



Код

OpenGL pipeline enabled for default config on screen 0
: 140ms
: 7.14 fps
: 109ms
: 9.17 fps
: 31ms
: 32.25 fps
: 16ms
: 62.5 fps
: 31ms
: 32.25 fps
: 16ms
: 62.5 fps
: 16ms
: 62.5 fps
: 15ms
: 66.66 fps
: 15ms
: 66.66 fps
....

--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.