0 / 0 / 0
Регистрация: 31.01.2018
Сообщений: 16
1

Godot Оптимизация 2D

10.02.2023, 10:05. Показов 1219. Ответов 2

Author24 — интернет-сервис помощи студентам
Всем доброго дня!

Столкнулся с серьезной проблемой, которую пытаюсь решить уже несколько дней. Создаю игру танчики, игровое поле разделено на клетки 32х32 пикселя. Танчик передвигается по клеткам - одна клетка за один шаг. (передвижение не резкое, а плавное с дельтой и заданой скорость. Есть счетчик, который следит сколько пикселей пройдено и когда танк прошел больше 32пикселей, он останавливаеся и центрируется по клетке )

Вся механика управления. передвижения и т.д.

Создал массив в котором хранится информация какие клетки заняты всеми танчиками.

Когда танчик хочет сделать шаг, он смотрит этот массив со смещением по X и Y, +1 и -1, проверяя есть ли занятые клетки слева, справа, сверху , снизу. Исходя из результатов проверки танчик выбирает куда поедет и сразу ставит отметку "занято" на эту клетку в массиве, если направление отличается проигрывается анимация поворота и танчик делает шаг в нужную сторону. По окончании шага, танчик освобождает ранее занимаемую им клетку в массиве.

ШАГ состоит из трех основных частей:
- определяется расстояние "микрошага" в этой итерации в соответствии с дельтой
- это расстояние прибавляется к счетчику, который проверяет что танчик не прошел более 32 пикселей
- Это расстояние прибавляется к позиции танчика

Если счетчик становится более 32 Пикселей, шаг считается завершенным и танчик снова проверяет массив и цикл повторяется.


ПРОБЛЕМА:
при запуске с телефона 100 таких танчиков - фпс улетает до 30 и меньше. При запуске на пк 400-500 таких танчиков фпс проседает до 5-10

Для решения пробовал:
- Сделать так, чтобы танчики за пределами экрана передвигались не плавно, а сразу на 32 пикселя - не помогло, лишние вычисления даже сделали хуже
- Загрузить обработку движения танчика в новый виртуальный поток - не помогло, ФПС низкий, хоть и игра стала ощущаться плавнее из-за того что основной поток этим не грузится, но слайдшоу осталось
- Загрузить обработку движения танчика в свой собственный виртуальный поток (создать кучу потоков в надежде, что система их сама равномерно распределит между ядрами процессора) - результат аналогичен предыдущему
- Вручную поставить значение дельты на 1 или 0.1 - не помогло
- вручную поставить значение дельты на 0.01 - ПОМОГЛО! фпс теперь 40-50 НО танчики движутся как черепахи и это не подходи, но читайте дальше..
- Закомментировать строчку отвечающую за прибавление ""микрошага" к позиции танчика - ПОМОГЛО! фпс 55-60, каждый танчик отрабатывает полный цикл проверки свободного места и делает шаг с прибавление "микрошагов" и расчетами с реальной дельтой - только он никуда не двигается.

ФАКТЫ:
- Думаю, версию с слишком тяжелой обработкой каждого шага можно откинуть, потому, что без команды прибавления микрошага к позиции все остальное танчик обрабатывал, он крутился, он занимал и освобождал клетки, он проверял сколько ему осталось до конца шага. Он просто при этом стоял на месте.
- Считаю что искать проблему нужно именно от фактического изменения положения объекта танчика. Потому что замедление скорости его движения или остановка - приводит повышению фпс.

НЫНЕШНИЕ ГИПОТЕЗЫ:
Предположение сейчас только одно - чем быстрее танчик движется, тем чаще он заканчивает ход и начинает все эти проверки, тем больше выполняется операций. Но оно рушится сразу же, потому что с закомментированной строчкой движения танчик выполнял все операции с такой-же частотой, потому что дельта в расчетах никак не изменилась просто не прибавлялась к его положению.

КОНЕЦ


Очень жду советов и подсказок - спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2023, 10:05
Ответы с готовыми решениями:

Godot Оптимизация 2D
Всем доброго дня! Столкнулся с серьезной проблемой, которую пытаюсь решить уже несколько дней....

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии "оптимизатора" в какой то умной книжке был...

Godot AcceptWindow
Всем доброго дня, разрабатываю приложение на Годоте, нужно реализовать запрос подтверждения...

Godot. Движение игрока
Добрый вечер всем. Пытаюсь сейчас делать движение персонажа. Передвижение вправо срабатывает как...

GODOT AudioStreamPlayer html5
Добрый день! Возникла проблема с проигрыванием звука в экспортированном экземпляре игры. Звук...

2
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
10.02.2023, 14:42 2
Где-то когда-то я нашёл этот клон танчиков на PyGame. Почти всё реализовано точно также как в оригинальной игре. Здесь все исходники в одном файле tanks.py - 2100 строк кода. Если вы Python никогда не изучали, то ничего страшного, потому что GDScript - это почти тоже самое, что и Python, а в PyGame почти всё интуитивно понятно, а если что, то можно документацию почитать, правда, через VPN. О том, что GDScript почти тоже самое, что и Python в документации на GDScript написано:

GDScript is a high-level, dynamically typed programming language used to create content. It uses a syntax similar to Python (blocks are indent-based and many keywords are similar). Its goal is to be optimized for and tightly integrated with Godot Engine, allowing great flexibility for content creation and integration.
Translate Google:

GDScript — это высокоуровневый язык программирования с динамической типизацией, используемый для создания контента. Он использует синтаксис, аналогичный Python (блоки основаны на отступах и многие ключевые слова похожи). Его цель состоит в том, чтобы быть оптимизированным и тесно интегрированным с Godot Engine, что обеспечивает большую гибкость для создания и интеграции контента.
Я вам очень советую поиграть в эту демку. Для её запуска нужно скачать и установить интерпретатор Python: https://www.python.org/downloads/ и установить PyGame, скачав Release: https://github.com/pygame/pygame/releases и установить командой:

pip install pygame-2.1.2-cp38-cp38-win_amd64.whl
Потом зайти в директорию проекта и кликнуть два раза по скрипту tansk.py. Прикрепил архив с проектом.

Скопировал код tanks.py на Gist
Вложения
Тип файла: zip battle-city-tanks-pygame.zip (132.3 Кб, 2 просмотров)
1
0 / 0 / 0
Регистрация: 31.01.2018
Сообщений: 16
10.02.2023, 18:45  [ТС] 3
ОТВЕЧАЮ САМ ДЛЯ ДРУГИХ ИСКАТЕЛЕЙ

Еще пол дня копался и наконец нашел в чем дело!

Каждый шаг танчик генерирует спрайт следов от гусениц, который в последующем с помощью Tween растворяется в течении 6 секунд и удаляется. Так вот как только я отключил генерацию следов - все просто начало летать, с оптимизацией другого кода и многопоточностью ПК стал показывать 70-75 фпс из 60 возможных..

Поэтому когда у танчика была маленькая скорость или он вообще не двигался фпс был гораздо выше - следов генерировалось гораздо меньше.

Сейчас буду разбираться дело в том, что я использую Tween или в том что слишком много объектов..
0
10.02.2023, 18:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2023, 18:45
Помогаю со студенческими работами здесь

Cocos2d-x или Godot
Не могу определиться с игровым движком. Сначала cocos заинтересовал но у меня с ним много вопросов,...

Java в ядре Godot 2 d
Пожалуйста напишите код для предмета который всегда будет телепортировать игрока в 1 точку при...

Godot масштабирование элементов
Добрый день! Создаю андроид приложение в Godot с вертикальной ориентацией. В приложении...

Godot - звуки перемещения
Доброго времени суток всем участникам форума! Хочу узнать ваше мнение. Во время разработки игры на...

Вращение объекта мышью в Godot
Привет всем! Чтобы было короче: представьте себе Google Earth с максимально отдаленной планетой. Вы...

O3DE или Godot Engine?
Мне предстоит разрабатывать систему 3D-визуализации, отображающую мир (открытое пространство с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru