Решил заняться написанием псевдографического движка. Имеется трехмерная матрица[z][y][x], наполненная объектами, хранящими символ, цвет фона и т.д.. Сейчас метод выведения данных - просто прорисовка каждого слоя поочередно, заметил проблему когда решил опробовать в действии смену слоев на ходу - все дико тормозит и мерцает. Постоянно вырисовывать каждый слой при малейших изменениях - затратно. Каким лучше способом выводить и обновлять текст?
Дата: Воскресенье, 31.05.2015, 11:01 | Сообщение # 2
( Не ленимся =) )
Сообщений: [1854]
В текстовом решении все достаточно просто. В трехмерном массиве, как у тебя и сделано, хранишь слои и полезные данные. При прорисовке не нужно рисовать то, что будет скрыто, поэтому происходит мерцание и небольшие лаги. К чему столько слоев рисовать и перекрывать друг друга?
Решение: 1. Создай двумерный массив с данными, аналогичными что в трехмерном. 2. Перед рендером пройдись по трехмерному массиву и заполни двумерный итоговой картинкой. Т.е. тебе нужно пройтись самому по слоям в трехмерном массиве и найти символы, которые в определенном положении будут лежать выше всех. После просто выводишь уже подготовленный двумерный массив на экран. 3. Для оптимизации алгоритма можно хранить переменные, отвечающие за изменения слоя. Иными словами, если слои не изменились, то рендерить можно старый двумерный массив и не заполнять его данными снова. 4. Не выделять каждый раз новый массив, выделить 1 раз при инициализации и использовать только его. Работаю над Каваей.
Дата: Воскресенье, 31.05.2015, 11:12 | Сообщение # 3
Сообщений: [473]
Конструктор, Спасибо за ответ! 1 - если имеешь ввиду массив, где хранится сама картинка - так уже сделано. 2 - пережуй пожалуйста, не понял. у меня есть цикл, записывающий данные из массива с картинкой в основной. "После просто выводишь уже подготовленный двумерный массив на экран." - без записи в основной массив? 3 - спасибо, так и сделаю! 4 - так сделано. Ностальгирую
Дата: Воскресенье, 31.05.2015, 11:16 | Сообщение # 4
( Не ленимся =) )
Сообщений: [1854]
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
( Не ленимся =) )
Сообщений: [1854]
3dmaker, Я имею ввиду реализовать аля BackBuffer. Который хранит окончательную, готовую к рендеру картинку, поэтому данный массив должен быть двумерным. Получаем мы этот массив из анализа трехмерного массива(массива слоев). Уже реализовано? Работаю над Каваей.
Дата: Воскресенье, 31.05.2015, 11:38 | Сообщение # 6
Сообщений: [473]
Конструктор, все, теперь понял про итоговый буффер. нет, не реализовано. большое спасибо =) по поводу bbox - спасибо, что рассказал, может, пригодится. но у меня изначально заполняется все пробелами, 20 на 20, например. так сделано, чтобы был фон из пробелов для цвета и перемещения по полю. Ностальгирую
Сообщение отредактировал: 3dmaker - Воскресенье, 31.05.2015, 11:39
Дата: Воскресенье, 31.05.2015, 20:30 | Сообщение # 7
( Не ленимся =) )
Сообщений: [1854]
3dmaker, для фона достаточно и одного слоя, остальные ведь прозрачные и по идеи должны содержать только перекрывающиеся объекты =) Ну тут уже смотри сам, а так получится хорошая оптимизация. Работаю над Каваей.
Дата: Воскресенье, 07.06.2015, 14:54 | Сообщение # 10
Сообщений: [473]
Конструктор, да, "получается". сейчас увлекся другим - изучаю opengl, показалось более интересным и полезным. но все равно думаю закончить.. еще раз спасибо за помощь =)