Создать игру, создание игр, конструктора игр, игровые движки, разработка игр, сделать игру
Приветствую Вас Гость · Вход · Регистрация  ·  Новые сообщения · Участники · Правила · Поиск · RSS
Страница 1 из 11
Форум разработчиков игр » Программирование » Java » Правильная перерисовка (Как?)
Правильная перерисовка
3dmaker Дата: Суббота, 30.05.2015, 13:56 | Сообщение # 1
Просмотр профиля: 3dmaker

Сообщений: [470]
Решил заняться написанием псевдографического движка. Имеется трехмерная матрица[z][y][x], наполненная объектами, хранящими символ, цвет фона и т.д.. Сейчас метод выведения данных - просто прорисовка каждого слоя поочередно, заметил проблему когда решил опробовать в действии смену слоев на ходу - все дико тормозит и мерцает.
Постоянно вырисовывать каждый слой при малейших изменениях - затратно. Каким лучше способом выводить и обновлять текст?
Прикрепления к посту: TextEngine.jar(15Kb)




Сообщение отредактировал: 3dmaker - Суббота, 30.05.2015, 13:59
Конструктор Дата: Воскресенье, 31.05.2015, 11:01 | Сообщение # 2
( Не ленимся =) )
Просмотр профиля: Конструктор

Сообщений: [1852]
В текстовом решении все достаточно просто. В трехмерном массиве, как у тебя и сделано, хранишь слои и полезные данные.
При прорисовке не нужно рисовать то, что будет скрыто, поэтому происходит мерцание и небольшие лаги. К чему столько слоев рисовать и перекрывать друг друга?

Решение:
1. Создай двумерный массив с данными, аналогичными что в трехмерном.
2. Перед рендером пройдись по трехмерному массиву и заполни двумерный итоговой картинкой. Т.е. тебе нужно пройтись самому по слоям в трехмерном массиве и найти символы, которые в определенном положении будут лежать выше всех. После просто выводишь уже подготовленный двумерный массив на экран.
3. Для оптимизации алгоритма можно хранить переменные, отвечающие за изменения слоя. Иными словами, если слои не изменились, то рендерить можно старый двумерный массив и не заполнять его данными снова.
4. Не выделять каждый раз новый массив, выделить 1 раз при инициализации и использовать только его.


Работаю над Каваей.
3dmaker Дата: Воскресенье, 31.05.2015, 11:12 | Сообщение # 3
Просмотр профиля: 3dmaker

Сообщений: [470]
Конструктор, Спасибо за ответ!
1 - если имеешь ввиду массив, где хранится сама картинка - так уже сделано.
2 - пережуй пожалуйста, не понял. у меня есть цикл, записывающий данные из массива с картинкой в основной.
"После просто выводишь уже подготовленный двумерный массив на экран." - без записи в основной массив?
3 - спасибо, так и сделаю!
4 - так сделано.


Конструктор Дата: Воскресенье, 31.05.2015, 11:16 | Сообщение # 4
( Не ленимся =) )
Просмотр профиля: Конструктор

Сообщений: [1852]
3dmaker, К слову сказать, мерцание из-за того, что когда берешь определенный слой и сливаешь его на экран, то он моментально отрисовывется, после чего делаешь аналогичные действия с последующими и получаешь эффект мерцания.
Именно поэтому нужен итоговый буффер(массив), который будет хранить в себе уже готовую, сформированную картинку. С правильными оптимизациями это очень быстро =)

Кстати, для мощной текстовой, многослойной системы можно еще сделать bbox-ы. Для каждого слоя добавить 2-е координаты, отвечающие за минимальное и максимальное расположение символов. Поэтому при переборке координат не проходить по всему слою, а только там, где находятся символы, полсе чего переходить к следующему.

Пример:

123456789
2
3 ------
4 ----
5 --
6
7
8
9

К примеру данный слой использует не все клетки, поэтому его bbox будет = начальная координата(2,3), конечная координата(5,5).
Следовательно при переборе массива нужно начинать с начальной координаты и заканчивать конечной, пустое(а значит прозрачное) пространство нас не интересует, его пропускаем =)
Если слой пустой то координаты можно задать как (-1,-1) (-1,-1), если отчет координат с 0 или (0,0) (0,0) если отчет координат с 1. Тем самым если слой будет пустым достаточно проверить конечную координату на равенство (-1,-1) или (0,0).


Работаю над Каваей.
Конструктор Дата: Воскресенье, 31.05.2015, 11:20 | Сообщение # 5
( Не ленимся =) )
Просмотр профиля: Конструктор

Сообщений: [1852]
3dmaker, Я имею ввиду реализовать аля BackBuffer. Который хранит окончательную, готовую к рендеру картинку, поэтому данный массив должен быть двумерным. Получаем мы этот массив из анализа трехмерного массива(массива слоев). Уже реализовано?

Работаю над Каваей.
3dmaker Дата: Воскресенье, 31.05.2015, 11:38 | Сообщение # 6
Просмотр профиля: 3dmaker

Сообщений: [470]
Конструктор, все, теперь понял про итоговый буффер. нет, не реализовано. большое спасибо =)
по поводу bbox - спасибо, что рассказал, может, пригодится. но у меня изначально заполняется все пробелами, 20 на 20, например. так сделано, чтобы был фон из пробелов для цвета и перемещения по полю.




Сообщение отредактировал: 3dmaker - Воскресенье, 31.05.2015, 11:39
Конструктор Дата: Воскресенье, 31.05.2015, 20:30 | Сообщение # 7
( Не ленимся =) )
Просмотр профиля: Конструктор

Сообщений: [1852]
3dmaker, для фона достаточно и одного слоя, остальные ведь прозрачные и по идеи должны содержать только перекрывающиеся объекты =)
Ну тут уже смотри сам, а так получится хорошая оптимизация.


Работаю над Каваей.
3dmaker Дата: Понедельник, 01.06.2015, 16:10 | Сообщение # 8
Просмотр профиля: 3dmaker

Сообщений: [470]
Конструктор, спасибо!



Конструктор Дата: Воскресенье, 07.06.2015, 09:49 | Сообщение # 9
( Не ленимся =) )
Просмотр профиля: Конструктор

Сообщений: [1852]
3dmaker, как дела с написанием, получается?

Работаю над Каваей.
3dmaker Дата: Воскресенье, 07.06.2015, 14:54 | Сообщение # 10
Просмотр профиля: 3dmaker

Сообщений: [470]
Конструктор, да, "получается". сейчас увлекся другим - изучаю opengl, показалось более интересным и полезным. но все равно думаю закончить.. еще раз спасибо за помощь =)



Форум разработчиков игр » Программирование » Java » Правильная перерисовка (Как?)
Страница 1 из 11
Поиск:

При полном или частичном копировании материалов сайта ссылка на Make-Games.ru обязательна. Make-Games.ru © 2008 - 2016 Хостинг от uWeb
Топ Разработка игр Рейтинг@Mail.ru