SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Потоки, отрисовка в потоках и как вообще их правильно создавать?
В этой теме 1 ответ, 2 участника, последнее обновление Croessmah 7 года/лет, 2 мес. назад.
-
АвторСообщения
-
<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>Фрапс показывает иногда 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 постоянно создавать новые потоки,
которые будут работать с ресурсами, это приведет к “мнимой” утечке ресурсов.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.