Генераторы рун теряются в действиях

SFML и C++ Уроки \ Разработка игр Форумы Логика игр Генераторы рун теряются в действиях

В этой теме 4 ответа, 1 участник, последнее обновление Heisenberg Heisenberg 3 года/лет, 4 мес. назад.

Просмотр 5 сообщений - с 1 по 5 (из 5 всего)
  • Автор
    Сообщения
  • #1194
    Heisenberg
    Heisenberg
    Участник
    Сообщений:323

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

    Репутация:145

    Написал систему генерации бонуснах рун, которые появляются в генераторах случайным образом. Но где-то теряется логика условий, и они перестают их генерировать.
    Ещё если немного подождать, то начинает просидать fps, до тех пор пока не поднимешь хотябы одну руну.

    #1196
    +1
    Heisenberg
    Heisenberg
    Участник
    Сообщений:323

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

    Репутация:145

    Проблема решена на половину, теперь всё работает как и задумано, но FPS всё ещё падает. Игра буквально начинает дёргаться.

    Проблема заключалась в том, что генераторы (Класс Distributor) обрабатывали сразу все существующие руны, из которых брали значения применяемые в условиях, тем самым теряя собственную логику переставали подчиняться.

    Решил путём перевода из list в vector, для доступности контроля последнего созданного объекта (Руны)
    Rune *r = rune.back()

    А так-же во избежании последующего бага с обращением к несуществующему адресу памяти добавил защитные условия if(!rune.empty) которое проверяет на пустоту вектора.

    Может кто знает почему падает FPS? Ведь у меня стоит лимит на создание рун по 20 шт. на каждый генератор * 4. Это совсем немного, ранее я запускал программу с 300 элементами, ничего подобного не встречалось.

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

    Пробовал заранее выделять память под объекты rune.reserve(20), но это не помогло.

    Самый необъяснимый факт, если поднять одну любую руну, то лаги на время пропадают.

    #1201
    Heisenberg
    Heisenberg
    Участник
    Сообщений:323

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

    Репутация:145

    Избавился от микрозадержки при создании нового объекта рун.
    Ошибка была в загрузке новой текстуры каждый раз при создании.
    Избавился от этого путём однократной загрузки файла и передачей ссылки в качестве аргумента конструктору. Мой косяк.

    Но FPS со временем продолжает падать :(
    даже комментировал подозрительные действия, такие как проверка на столкновения героя с руной и её отображение.

    #1202
    +1
    Heisenberg
    Heisenberg
    Участник
    Сообщений:323

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

    Репутация:145

    Всё, я решил весь список своих проблем.
    Заметки на будущее для вас.

    Никогда не используйте внутри цикла метод:

    Это напрягает процессор. Используйте эту функцию только по надобности.

    Если вы используете std::vector, или std::list, и вам нужно обратиться к последнему созданному элементу отдельно, не проходя по всем элементам. Используйте волшебные методы этих инструментов:

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

    Но есть одна важная вещь, о которой вам стоит помнить.
    Используя этот метод вам нужно дополнительное условие:

    Это условие поможет избежать обращение к пустому списку, иначе вылетит ошибка с обращением к несуществующему адресу памяти.

    Ещё одно правило, которое следует выполнять, это загружать не более одной текстуры на все <<одноподобные>> объекты. Иначе ресурсы компьютера могут не осилить вашу 2D игру.
    Что уж там о GTA V говорить…
    Загруженную текстуру можно передавать в качестве аргумента в виде ссылки.

    Выше в теме я сказал что заменил std::list на std::vector, чтобы обратиться к последнему элементу. Знайте – std::list тоже так умеет.

    Выполняя ряд этих правил ваша игра будет летать, а не ползать :)

    Спасибо за внимание и помощь 😀

    #1203
    +1
    Heisenberg
    Heisenberg
    Участник
    Сообщений:323

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

    Репутация:145

    Если кому интересно, можете протестировать и сказать у кого как работает.
    Распакуйте архив, запустите debug.exe

    https://yadi.sk/d/65rABFynhpUaL

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

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