SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Оптимизация
Помечено: Оптимизация
В этой теме 6 ответов, 3 участника, последнее обновление Deffoe 6 года/лет, 1 месяц назад.
-
АвторСообщения
-
Возникла проблема при создании игры. При создании мапы 500 х 500 клеток, игра начинает лагать.
Пк не слабый, лагает не из за текстур (пробовал их убирать). При создании мапы использую двумерный массив.
Что можно сделать для оптимизации игры? И что если мне нужно в будущем делать мапы не 500 на 500, а, например, 10000 на 10000 (или чуть меньше)?
Здесь может быть много вариантов, скиньте код. Возможно лаги из-за того, что создаёте карту в цикле, и да, игра будет становиться всё медленнее и медленнее, так как строки кода увеличиваются, при этом будет лагать, а в процессах всё в порядке, памяти мало занимает. Чтобы код читался быстрее, нужно использовать потоки, чтобы параллельно выполнялось, тогда и скорость быстрей будет. Но всё же скиньте код, а то так не понятно, что там
Чтобы помочь, нужно увидеть код вашей программы.
Первое что пришло на ум, это никому не нужная отрисовка объектов вне камеры вида.Именно, прорисовка вне камеры вида. А вы не могли бы подкинуть идею, как прорисовывать только то, что я вижу?
В коде смотреть нечего, просто цикл который проходит по всем элементам массива, чекая id каждой клетки карты. Дальше в связи с id рисует определенный объект. Впрочем все.
C++123456789sf::FloatRect System::getVisible() // Return size view{return sf::FloatRect(cam_p.x - scr_W/2, cam_p.y - scr_H/2, scr_W, scr_H);}if(getVisible().intersects(shape.getGlobalBounds())){wnd->draw(shape);}Это было так очевидно 😀
Спасибо большое, сам бы не дошел до этого)
В общем, сделал по своему, но за идею огромное спасибо. Не сделал так как вы предложили, только из за того что не опытен и не очень знаю, как это правильно написать. Но суть понял.
Итак, если кому то понадобится, вот мой код реализации прорисовки карты, только “в” камере вида:
C++1234567891011121314Vector2f center = window.getView().getCenter();Vector2f size = window.getView().getSize();// проход по массиву мапыfor (int i = (center.y - size.y / 2) / 128; i <= (center.y + size.y / 2) / 128; i++)for (int j = (center.x - size.x / 2) / 128; j <= (center.x + size.x / 2) / 128; j++)// все делю на 128, потому что цикл должен проходить по клеткам карты (т.е. массива), а не по пикселям// а текстура для каждой клетки у меня как раз 128 пикселей{if (map[i][j] == 0) spriteMap.setTextureRect(IntRect(0, 0, 128, 128)); // присвоение текстурыspriteMap.setPosition(j * 128, i * 128);window.draw(spriteMap);} -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.