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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оптимальная прорисовка поля 
:(
    Опции темы
voltaren
Дата 18.11.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажи кто как думает надо решить такую задачу для относительно медленных телефонов. Есть игровое поле которое состоит из элементов квадратной формы, по нему летают шарики, вот как оптимальнее всего это перерисовывать, среди варинатов
1)gameCanvas + перерисовывание только измениний, то есть зарисовывание шарики, отрисовка его в новой позиции, ну и измениния в поле если есть
2) свой канвас с двойной буферизацией, плюс измениния поля, потом выкладывания этого на экран а на это уже на прямую на экран нарисовать шарики, или будет эффект мерцания?
3) теоретически тоже что и пункт два только тройная буферизация, то есть поле храниться не изменным, в своей картинке, и изменяется в ней же, потом это рисуется в двойной буфер, по верх этого шарики, и потом flushGraphics, но ДУМАЮ Будет оч медленно.
4) TiledLayer и просто рисование шариков как картинок
5) TiledLayer и шарики в виде спрайтов

какой будет оптимальнее? или если можно предложите что нибудь своеsmile 
а еще расскажите как оптимальнее всего обновлять экран если перерисовываются его части, но flushGraphics(int,int,int,int) я пробывал прироста не дал...на оборот только еще тормознее стало...телефон на котором тестилось Siemens CX75 среднее время которое уходило на отрисовку экрана было 45 мс...что конечно многовато..Заранее благодарен!
PM MAIL   Вверх
W0LF
Дата 19.11.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



На мой взгляд, лучше всего первый вариант, тем более gameCanvas включает в себя двойную буфферизацию
Цитата(voltaren @  18.11.2007,  19:49 Найти цитируемый пост)
а на это уже на прямую на экран нарисовать шарики,

2.Напрямую плохо. скорее всего будет эффект мерцания, ну если это эффектом назвать.
3. flushgraphics - плохо
4,5 - не юзал - ответить не могу



--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
eugine_s
Дата 19.11.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Начнем с того, что нужно начать с оптимизации приложения. Если по полю летают шарики, то это не должно тормозить. Разгрузить память, например, если у тебя есть меню, то при переходе из меню в игру выгрузи из памяти все ресурсы (картинки, тексты и т.д.) которые связаны с меню. В самой игре тоже провести оптимизацию: убрать все лишнее.

Теперь по вариантам, которые ты предложил.

Общее для всех вариантов: в игре нужно ВСЕГДА перерисовывать ВЕСЬ экран, делать это нужно для того чтобы в игре у тебя не было "рывков", например  1-я,2-я,3-я перерисовки экрана рисуют весь экран, потом одна перерисовка, только маленькую часть, так как быстро перерисовался  экран, то может получится указанный выше эффект.

1) GameCanvas - можно использовать, но отрисовка всего экрана.
2) Canvas + двойная буферизация: можно использовать, но опять же: отрисовка всего экрана.
Работа с двойной буферизацией:
Код


Image bufferImg = Image.createImage(screenWidth, screenHeight);
Graphics bufferGr = bufferImg.getGraphics();

public void paint(Graphics g)
{
//тут делаются какие-то действия по отрисовки экрана на bufferGr

....

//буфер выподим на экран
g.drawImage(bufferImg, 0, 0, 0);

}


3) 3-я буферизация - нет не нужно, хватит 2-йного буфера.

4,5) - Нет, не нужно такого использовать.

Я точно не знаю, что у тебя в проекте используется, но предполагаю, что шарики это Sprite ? 
Лучше обойтись без Sprite....
PM MAIL   Вверх
voltaren
Дата 19.11.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я не много не понял что подразумевается под перерисовкой всего экрана...
у меня вообще в игровом цикле такая отрисовка происходит...используется GameCanvas и никаких TiledLayer'ов и Sprite'ов:
сначала стираем шарик то есть один fillRect потом перемещаем и drawImage вот впринцыпе и вся отрисовка. 
  Над оптимальностью программы я еще работаю, но вообщем то написана она оптимально smile
и просто смотря что считать тормозить...для меня полная отрисовка 6 шариков на поле со среднем временем 43 мс это тормоза...мне хотелось бы 30 фпс smile
а вообще какой фпс нормальным считается? я читал где то что имено 30
PM MAIL   Вверх
W0LF
Дата 19.11.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Нормальный фпс, в смысле с которым можно уже играть это 12 и выше


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
voltaren
Дата 20.11.2007, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а не маловат ли фпс 12 кадров для игры где шарики летают...?
а больше ни у кого предложений не будет?...просто сами расчеты 7 мс а прорисовка всего двух шариков 33 мс...это же просто не реально :((
PM MAIL   Вверх
voltaren
Дата 20.11.2007, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



и все таки мне одно не понятно...время обновления самой игры 7-10 мс а вот время одной функции flushGraphics которая правда весь экран обновляет целиком занимает 33 мс :( и как быть в такой ситуации? как бороться с такими тормозами?
PM MAIL   Вверх
shomer
Дата 20.11.2007, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



12 fps с шариками, на моем не шустром телефоне - это тоска smile 
Присоединяюсь.. ( может репайнтить быстрее будет?)


Это сообщение отредактировал(а) shomer - 20.11.2007, 23:59

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  DemoBall.rar 15,71 Kb
PM MAIL   Вверх
shomer
Дата 21.11.2007, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проверил - paint в Canvase отрисовывает быстрее. ( чуть быстрее..)

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  DemoBall_2.rar 15,71 Kb
PM MAIL   Вверх
voltaren
Дата 21.11.2007, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



>> 12 fps с шариками, на моем не шустром телефоне - это тоска 
что ты имел ввиду?
PM MAIL   Вверх
shomer
Дата 21.11.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В динамичных играх скорость перемещения и плавность перемещения объекта важна беспорно.
Отчего она зависит?
1. При малых значениях приращения координат ( качественная реализация - плавное, не прерывистое движение) одназначно от скорости обсчета и отрисовки объекта.
Сталкиваемся с проблемой - физические ограничения скорости прорисовки аппаратной составляющей, и возможная неоптимальность программной реализации JVM. Это не зависящие от нас причины.
2. Скорость перемещения увеличиваем за счет увеличения приращения координат - получаем не движение а скачки игрового объекта.
Куда не кинь - везде клин. Но поскольку визуальное восприятие это чуть ли не самое главное в игровом процессе ( созревший клиент скорей телефон поменяет чем забудет то что ему понравилось), требуется по возможности улучшать графическую составляющую проекта.
От нас завит не много:
Оптимальность алгорима игрового процесса, выбор и использование максимально быстрых вариантов работы с классами, методами, членами классов ..
Кстати drawImage медленней drawRGB.
paint в Canvase быстрее чем flushgraphics в GameCanvase.
Clipping при отрисовке заметно на скорость не влияет..
и кое что еще..(надо пробовать)
-------------------------------------------
Извиняюсь - если загрузил smile 
-------------------------------------------
Отвлекся  smile . 12 fps с мечущимися по экрану шариками - смотреть противно. 70 fps на эмуляторе - красота smile 

Это сообщение отредактировал(а) shomer - 21.11.2007, 11:20
PM MAIL   Вверх
voltaren
Дата 21.11.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а какой у тебя телефон?
кстати я не понял но почему то твои программы DemoBall'ы работаю даже в эмуляторе не быстро, 16 мс на все дела...хотя может быть конечно это меня проглючило с утра, надо вечером будет еще посмотретьsmile
PM MAIL   Вверх
shomer
Дата 21.11.2007, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Toshiba TS2050, CLDC-1.1 MIDP-2.0,  176x220 AlphaLevels=2, 350kb-jar,  JAVA RAM-1Mb
---------------------------------------------------------------------------------------------
Код

import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

public class Play extends Canvas implements Runnable
{
    public boolean f_run = true;
    static private int width, height;
    static private int w_im, h_im;
    static private Image img, im_x;
    static private int[] ar_im;
    static private long t2;
    static private int x_im1 = 20, y_im1 = 50;
    static private int x_im2 = 30, y_im2 = 30;
    static private int spx1 = 5, spx2 = 2;
    static private int spy1 = 8, spy2 = 1;

    public Play( Display display)
    {
        super( );
        setFullScreenMode( true);
        width  = getWidth();
        height = getHeight();
       
    }
    
    public void start()
    {
        try { img = Image.createImage("/ball.png");     
        im_x = Image.createImage("/bamps.png");
        } catch( Exception eio){  };
        w_im = img.getWidth();                                
        h_im = img.getHeight();
        ar_im = new int[w_im * h_im];
        img.getRGB( ar_im, 0, w_im, 0, 0, w_im, h_im);    // в массив
        img = null;                                       // image в null        
        Thread t = new Thread( this);
        t.start();
    }
    public void run()
    {
        //Graphics g = getGraphics();
        while( f_run)
        {
            repaint();
            try{ Thread.sleep(0);}
            catch (Exception ex) {};
        }        
    }
    public void paint( Graphics g)
    {
        long t1 = java.lang.System.currentTimeMillis();
        g.setColor( 0xaaaaff);
        g.fillRect(g.getClipX(), g.getClipY(), g.getClipWidth(), g.getClipHeight());
        //g.fillRect(0, 0, width, height);
        if ( x_im1 > (width-w_im) || x_im1 < 5)  spx1 *= -1;
        if ( y_im1 > (height-h_im) || y_im1 < 8) spy1 *= -1;
        if ( x_im2 > (width-w_im) || x_im2 < 2)  spx2 *= -1;
        if ( y_im2 > (height-h_im) || y_im2 < 1) spy2 *= -1;
        x_im1 += spx1;
        y_im1 += spy1;
        x_im2 += spx2;
        y_im2 += spy2;
        g.drawRGB( ar_im, 0, w_im, x_im1, y_im1, w_im, h_im,  true);
        g.drawRGB( ar_im, 0, w_im, x_im2, y_im2, w_im, h_im,  true);
        //g.drawImage(  img, x_im1, y_im1, g.TOP | g.LEFT);
        //g.drawImage(  img, x_im2, y_im2, g.TOP | g.LEFT);
        if (( x_im1 >= (x_im2 - w_im) &&  x_im1 <= (x_im2 + w_im)) 
            && ( y_im1 >= (y_im2 - h_im) &&  y_im1 <= (y_im2 + h_im))) 
            g.drawImage( im_x, x_im1, y_im1, g.TOP | g.LEFT);
        g.setColor( 0xffffff);
        g.drawString("time " + (t1-t2) + " ms", 2, 2, g.TOP | g.LEFT);
        //flushGraphics();
        t2 = t1;
    }
}

------------------------------------------------------------------------------------------------
В данном варианте на WTK ~ 0 ms, Sjboy эмулятор- 47 ms, TS2050 - 82 ms. Убираю 
Код

 try{ Thread.sleep(0);}
 catch (Exception ex) {};

Получаю WTK ~ 0 ms, Sjboy - 94 ms, TS2050 - 220 ms.
Вот такие кругом тормоза  smile 
------------------------------------------------------------------------
как только Thread.sleep > 0 вылазят эти 16 ms

        


Это сообщение отредактировал(а) shomer - 21.11.2007, 23:56
PM MAIL   Вверх
voltaren
Дата 22.11.2007, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



на сколько я понял в реальност победить тормоза с flushGraphics нельзя, можно лишь сделать все что касается игрого цикла оптимально и радоваться smile или не писать на j2me если есть возможностьsmile скажим для ташибы проще написать на C++ smile
PM MAIL   Вверх
eugine_s
Дата 22.11.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



voltaren:

На каком телефоне ты проводил тестирование? 
Случайно не нокия s60 ?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




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


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

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