SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Thread
В этой теме 17 ответов, 2 участника, последнее обновление val67 7 года/лет, 8 мес. назад.
-
АвторСообщения
-
C++1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162class Main{private:sf::CircleShape shape1, shape2;sf::ContextSettings settings;sf::Clock clock;sf::RenderWindow window;sf::Event event;sf::Mutex mut;float _time;public:Main();void PlayMain();void THREAD_Draw();};Main::Main(){settings.antialiasingLevel = 8;window.create(sf::VideoMode(1600, 900), "SFML works!");window.clear(sf::Color::White);_time = 0;PlayMain();}void Main::PlayMain(){shape1.setRadius(100.f);shape1.setFillColor(sf::Color::Green);shape2.setRadius(100.f);shape2.setFillColor(sf::Color::Red);shape2.setPosition(100, 0);sf::Thread drawThread(&Main::THREAD_Draw, this);while (window.isOpen()){_time = clock.getElapsedTime().asMicroseconds();_time /= 800;clock.restart();while (window.pollEvent(event)){if (event.type == sf::Event::Closed)window.close();}window.clear();window.setActive(false);drawThread.launch();drawThread.wait();window.display();}}void Main::THREAD_Draw(){mut.lock();window.draw(shape1);window.draw(shape2);mut.unlock();}
Пользовался темой: https://kychka-pc.ru/sfml/sfml-mnogopotochnost.html
Результат на скрине, помогите разобраться.
Вложения:
You must be logged in to view attached files.C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778#include<SFML\Graphics.hpp>#define PI 3.1415926535class Main{private:sf::CircleShape* shape1, *shape2;sf::ContextSettings* settings;sf::Clock* clock;sf::RenderWindow* window;sf::Event* evt;sf::Mutex* mut;sf::Thread* drawThread;float time;public:Main(){settings = new sf::ContextSettings(16,24,2,0,8);clock = new sf::Clock;window = new sf::RenderWindow(sf::VideoMode(800, 600), "SFML works!", sf::Style::Close, *settings);mut = new sf::Mutex;drawThread = new sf::Thread(&Main::THREAD_Draw, this);evt = new sf::Event;shape1 = new sf::CircleShape(100);shape2 = new sf::CircleShape(100);shape1->setFillColor(sf::Color::Green);shape2->setFillColor(sf::Color::Red);shape1->setPosition(100, 0);shape2->setPosition(300, 0);time = 0;PlayMain();}void PlayMain(){while (window->isOpen()){time = (float)clock->getElapsedTime().asMicroseconds()/800;clock->restart();while(window->pollEvent(*evt)){if(evt->type == sf::Event::Closed)window->close();}window->clear();window->setActive(false);drawThread->launch(); drawThread->wait();window->display();}}void THREAD_Draw(){mut->lock();window->draw(*shape1);window->draw(*shape2);mut->unlock();}};int main(){Main xMain;return 0;}Вот
Вложения:
You must be logged in to view attached files.Скопировал просто код, не пашет. Не понимаю почему.
Вложения:
You must be logged in to view attached files.Попробуйте запустить код на SFML версии 2.0
Все тоже
Вложения:
You must be logged in to view attached files.https://yadi.sk/d/lHaRolMGjPDxW Исходник на 2.0
Запустил exe вашего проекта, тоже работает.
Вложения:
You must be logged in to view attached files.мдэ, чудеса…
Если выявишь проблему напиши что да как. Интересно же)
Может у тебя комп не поддерживает многопоточность? xD4 ядра, проверял еще давно – поддерживает.
В общем если верить http://en.sfml-dev.org/forums/index.php?topic=5673.0
в каждом потоке нужно деактивировать окно
Basically, a window must be deactivated (SetActive(false)) in the thread where it is active, before being used in another thread.
Я добавил
C++123456void Main::THREAD_Draw(){window->draw(*shape1);window->draw(*shape2);window->setActive(false);}и вроде как работает, и память жрет
Там ток на скрине не то подчеркнул)
Вложения:
You must be logged in to view attached files.Так пробовал?
C++12345678void THREAD_Draw(){mut->lock();window->setActive(false);window->draw(*shape1);window->draw(*shape2);mut->unlock();}Странно всё это)
Попробуй вынести из конструктора drawThread = new sf::Thread(&Main::THREAD_Draw, this);
И перенести его в главный цикл, после выполнения вызывай деструктор threadC++123drawThread = new sf::Thread(&Main::THREAD_Draw, this);drawThread->launch(); drawThread->wait();drawThread->~Thread();У меня таким образом тоже работает.
Работает, но озу в геометрической прогрессии занимает
В общем поспрашивал я на форумах, проблема нашлась:
Собственно проблема в том, что при создании чего-то в потоке, создается скрытый контекст opengl, оно пихается в “глобальную корзину” (std::set <GlContext*> internalContext) и при уничтожении потока не освобождается. Освобождение произойдет только когда больше не останется контекстов(в Context.cpp есть переменная count, когда станет ноль, то будет вызвана функция globalCleanup, которая почистит эту “корзинку”).
Ну и так пользоваться потоками очень не советуют.
Ну и так пользоваться потоками очень не советуют.
Как “так”? И почему у меня с оперативкой всё нормально? -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.