Рисование карты, оптимизация алгоритма

SFML и C++ Уроки \ Разработка игр Форумы SFML Graphics Рисование карты, оптимизация алгоритма

В этой теме 14 ответов, 5 участников, последнее обновление RazorNd RazorNd 7 года/лет, 8 мес. назад.

Просмотр 15 сообщений - с 1 по 15 (из 15 всего)
  • Автор
    Сообщения
  • #4037
    +1

    bg
    Участник
    Сообщений:4

    Зарегистрирован:
    19.07.2016

    Репутация:1

    Всем привет!

    Как можно оптимизировать программу? У меня есть функция которая рисует карту, размер карты 30×50, т.е в ней 1500 элементов. Эта функция вызывается много-много раз в секунду из главного цикла функции main. На каждый ее вызов расходуется  много времени

    Есть идея чтобы создать задний (невидимый) буфер и сначала рисовать на нем, а после полной прорисовки скопировать его содержимое на главное окно.

    Но как это сделать? Какой тип данных должен быть у буфера? sf::Texture или может sf::Window? Не знаю как всё это правильно организовать.

    Дайте советы

    #4039
    +1
    LastikPro
    LastikPro
    Участник
    Сообщений:93

    Зарегистрирован:
    09.07.2015

    Репутация:61

    Легче просто отрисовать спрайты в определенном радиусе вокруг центра камеры.

    #4040
    LastikPro
    LastikPro
    Участник
    Сообщений:93

    Зарегистрирован:
    09.07.2015

    Репутация:61

    а лучше даже так:

     

    #4041

    bg
    Участник
    Сообщений:4

    Зарегистрирован:
    19.07.2016

    Репутация:1

    Дело в том, что у меня в окне вся карта видна. Т.е. в камеру вся карта попадает. Так что это не выход.

    #4042

    bg
    Участник
    Сообщений:4

    Зарегистрирован:
    19.07.2016

    Репутация:1

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

    Как создать невидимый буфер и сначала на нем нарисовать, а после прорисовки скопировать его в главное окно?

    #4043

    bg
    Участник
    Сообщений:4

    Зарегистрирован:
    19.07.2016

    Репутация:1

    У меня только что еще вопрос появился)) Смотрите, в каком месте происходит рисование в окне?

    Функция window.dispaly() ведь рисует в окне? Другие функции тоже рисуют на главном окне или нет? Вот

    #4044
    +1
    LastikPro
    LastikPro
    Участник
    Сообщений:93

    Зарегистрирован:
    09.07.2015

    Репутация:61

    Нет display отображает на екране, а рисует Draw. А разве 1500 элементов много ? Например у меня карта 50*80 с физикой и освещением. Проц нагружен на 30% видеокарта на 40%, 75 000 кадров в секунду.

    #4045
    LastikPro
    LastikPro
    Участник
    Сообщений:93

    Зарегистрирован:
    09.07.2015

    Репутация:61

    Насколько я понял вы хотите 1500 тайлов сначала слепить в 1 ,и потом рисовать как 1 ?

    #4046

    bg
    Участник
    Сообщений:4

    Зарегистрирован:
    19.07.2016

    Репутация:1

    Сейчас посмотрел в диспетчере задач, нагрузка от этой программы маленькая. Так что наверно не буду менять функцию. Пусть так остается) Спасибо

    #4050

    Max
    Участник
    Сообщений:8

    Зарегистрирован:
    27.07.2016

    Репутация:0

    Всем привет! Подскажите как вид камеры расположить так, чтобы игрок вместе с картой двигался не вправо, а вперед, т.е. это будет не игра типа марио,а обычная ходилка

    #4069

    barbar
    Участник
    Сообщений:36

    Зарегистрирован:
    27.06.2015

    Репутация:16

    Есть у меня подобная проблема. Отрисовываются 21к спрайтов размером 16Х16. Вроде производительность нормальная, но когда пытаюсь рисовать 21к rectangleShape начинаются лаги, как исправить?

    #4071

    barbar
    Участник
    Сообщений:36

    Зарегистрирован:
    27.06.2015

    Репутация:16

    В общем я решил склеить, алгоритм такой

    стало намного быстрее, но сама склейка идёт долго, так что скорее всего подойдёт только для статических карт, и для меня в перспективе не подходит, хочется туман войны и чтобы водичка плескалась.

    #4080
    RazorNd
    RazorNd
    Участник
    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

    Вообще есть класс sf::RenderTexture. С ним можно работать так же как и с sf::RenderWindow. Вот ссылка на доку с примером.

    #4094

    barbar
    Участник
    Сообщений:36

    Зарегистрирован:
    27.06.2015

    Репутация:16

    Ну у класса sf::RenderTexture есть недостаток, например максимальный размер в 8192×8192

    #4095
    RazorNd
    RazorNd
    Участник
    Сообщений:46

    Зарегистрирован:
    04.02.2016

    Репутация:38

    barbar, данная проблема не у sf::RenderTexture. То о чем вы говорите это проблема sf::Texture. Кстати, там необязательно 8192×8192, это зависит от видеокарты. В любом случае вы не сможете целиком загрузить ваше большое изображение в текстуру и вам так же придется создавать отдельные текстуры под разные части изображения.

Просмотр 15 сообщений - с 1 по 15 (из 15 всего)

Для ответа в этой теме необходимо авторизоваться.