如何使用SFML 2.2切换OpenGL上下文的线程?

时间:2015-05-19 08:18:29

标签: c++ multithreading sfml openglcontext

我想在我的主线程中使用我的窗口事件循环,而其他所有东西都在一个单独的线程中运行。

循环如下:

void loop(sf::RenderWindow& window)
{
    //I need the context here

    while (window.isOpen())
    {
        //Do stuff here
    }
}

int main()
{
    sf::RenderWindow window(...);

    std::thread lthread(&loop, std::ref(window));

    while (window.isOpen())
    {
        sf::Event event;
        while (window.waitEvent(event))
        {
            //Handle events
        }
    }

    lthread.join();
}

如何切换上下文的线程?

1 个答案:

答案 0 :(得分:0)

void renderingThread(sf::Window* window)
{
    // activate the window's context
    window->setActive(true);

    // the rendering loop
    while (window->isOpen())
    {
        // draw...

        // end the current frame -- this is a rendering function (it requires the context to be active)
        window->display();
    }
}

int main()
{
    // create the window (remember: it's safer to create it in the main thread due to OS limitations)
    sf::Window window(sf::VideoMode(800, 600), "OpenGL");

    // deactivate its OpenGL context
    window.setActive(false);

    // launch the rendering thread
    sf::Thread thread(&renderingThread, &window);
    thread.Launch();

    // the event/logic/whatever loop
    while (window.isOpen())
    {
        ...
    }

    return 0;
}

http://www.sfml-dev.org/tutorials/2.0/window-opengl.php