2013-08-23 1 views
1

Проведение исследований, прежде чем начинать что-то, является хорошей идеей, поэтому я рассматривал статьи здесь, в Stackverflow, перед началом проекта.Java Tilemaps с помощью Cliping для увеличения частоты кадров: что может пойти WRONG?

Теперь при поиске tilemaps один из других вопросов, приводят меня к одной из Java Учебники, в частности, эта страница (http://docs.oracle.com/javase/tutorial/uiswing/painting/step3.html) где-то привлекло мое внимание, это:

private void moveSquare(int x, int y) { 
    int OFFSET = 1; 
    if ((squareX!=x) || (squareY!=y)) { 
     repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET); 
     squareX=x; 
     squareY=y; 
     repaint(squareX,squareY,squareW+OFFSET,squareH+OFFSET); 
    } 
} 

Для тех, кто не знать, что происходит, когда краска называется красным квадратом, рисуется в квадрате X, squareY, это метод, который позволяет вам изменять квадрат и квадрат, и это ускоряет процесс перерисовки, сообщая Java, чтобы ограничить область, которая будет перерисована только старые и новые местоположения (это два вызова перекрашивать)

Теперь это звучит как-то что я должен использовать, когда плитка обновляется, ее координаты перекрашиваются, но в tilemaps обычно входят 2d-массивы и цикл по всему массиву при рисовании, возможно, с участием нескольких изображений в одном месте, и в то время как большая часть карты не перерисовывается который все еще может замедлить его.

Таким образом, вы добавляете к себе плитки, которые отмечают, изменилось или нет что-то изменившееся, что привело бы к тому, что оно изменилось с тех пор, как в последний раз все было нарисовано, и только место для изображений, которые изменились.

Это хорошо работает, пока что-то вроде окна, в которое вставляются графики, проходит цикл минимума/максимума, теперь каждая плитка нуждается в обновлении графики, но ни один из них не будет помечен как таковой, что приведет к пустым экранам.

Что является лучшим для этого?

А что еще я пропустил?

ответ

1

Проблема с repaint(int,int,int,int); - это две папки.

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

Во-вторых, все запросы repaint возвращаются на Диспетчерскую тему событий, а это значит, что в любом случае это приведет к вашему методу paintXxx.

Таким образом, если только ваш метод paintXxx не оптимизирован для обработки обновлений, это не делает вам никаких выгод.

Как вы уже указали, вам действительно нужно будет вычислить, какие заголовки будут обновляться на основе обрезающего прямоугольника контекста Graphics.

Лучшим подходом может быть использование буферного экрана, который обновляется в некотором фоновом потоке, как часть вашего игрового движка. Затем он будет переключен на «активный» буфер для рисования на экран, когда он будет готов.

Вы можете воспользоваться вырезку в это время, чтобы только оказать небольшую часть активного буфера, если вы обнаружили, обновляя весь экран inafficent

... ИМХО ...

Об этом в Painting in AWT and Swing.