Потоки, отрисовка в потоках и как вообще их правильно создавать?

SFML и C++ Уроки \ Разработка игр Форумы SFML System, Window и другие вопросы Потоки, отрисовка в потоках и как вообще их правильно создавать?

В этой теме 1 ответ, 2 участника, последнее обновление  Croessmah 7 года/лет, 9 мес. назад.

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

    Lactusspooch
    Участник
    Сообщений:1

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

    Репутация:0

    <p class=”crayon-selected”>Есть алгоритм создания пуль из урока про пули. Когда я его добавил, этот алгоритм резко тормознул игру. Посоветовали две вещи – 1. Паттерн пул объектов. полазил, почитал, там темный лес и я решил ну его) И 2. Потоки. Это понравилось больше, и в общем я использую для них библиотеку thread из VS 2015. Ну вообще она появилась в С++ 11 но это не важно. Так вот, вопросы. Первое- как их правильно создавать ? Я создаю как показано в куче примеров из нета, т.е.

    void VoiD() {}

    int main()
    {
    thread T(VoiD, все параметры);
    T.join();
    }

    Между объявлением треда и джойном у меня основной цикл while(window.isOpen()) . Так вот, этим можно легко нагрузить комп. Фрапс показывает иногда 300 – 500 фпс. Плюс может кратковременно просесть. Если ту же функцию впихнуть вне потока – 1200 стабильно. Это раз, второй вопрос. Как отрисовывать из потока другого? Я знаю что надо где-то прописать window.setActive(false);
    Вот только где? Перед чем ? Куда не тыкал все не работает. И последнее.
    Алгоритм появления врагов (пуль) по-лучше есть? Я когда в тот проверку на столкновения добавил он вообще залагал.
    В коде моем куча всякого мусора, который был когда-то в нем протестирован, и вообще он крупный, но если надо пришлю его</p>

    #4032
    +1

    Croessmah
    Участник
    Сообщений:2

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

    Репутация:2

     

    Фрапс показывает иногда 300 – 500 фпс. Плюс может кратковременно просесть. Если ту же функцию впихнуть вне потока – 1200 стабильно.

    А что Вы хотели? Многопоточность требует расходов,

    так что если использовать её неправильно,

    то можно наоборот сделать всё тормознутей, чем с одним потоком.

    Вот только где? Перед чем ? Куда не тыкал все не работает.

    Для начала: http://www.sfml-dev.org/tutorials/2.0/graphics-draw.php

    Здесь ясно сказано:

    SFML supports multi-threaded drawing, and you don’t even have to do anything to make it work. The only thing to remember is to deactivate a window before using it in another thread. That’s because a window (more precisely its OpenGL context) cannot be active in more than one thread at the same time.

    так что пусть отрисовкой занимается один поток,

    иначе у Вас будут проблемы с отрисовкой/синхронизацией.

    Там же есть и пример с использованием потоков, в т.ч. вызов sf::Window::setActive

    1. Паттерн пул объектов. полазил, почитал, там темный лес и я решил ну его) И 2. Потоки. Это понравилось больше, и в общем я использую для них библиотеку thread из VS 2015.

    В общем случае, пул потоков будет эффективнее и лучше.

    Плюс учтите, что нельзя в SFML постоянно создавать новые потоки,

    которые будут работать с ресурсами, это приведет к “мнимой” утечке ресурсов.

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

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