【问题标题】:SFML thread synchronization?SFML 线程同步?
【发布时间】:2018-10-02 06:52:01
【问题描述】:

我是 SFML 新手,一直在尝试拥有一个多线程游戏系统(所有游戏逻辑都在主线程上,并使用 sf::Thread 在专用线程中进行渲染; 主要用于练习线程)如in this page 所述(“使用线程绘图”部分):

不幸的是,我的程序在 update() 期间的处理时间很长,并且使渲染过程完全失控,显示一些帧已绘制,而另一些则完全为空。如果不是很明显,我的渲染线程正在尝试绘制甚至没有计算过的东西,从而留下这种癫痫效果。

我正在寻找的是仅在计算了主逻辑时才允许线程渲染。这是我到目前为止得到的:

void renderThread()
{
    while (window->isOpen())
    {
            //some other gl stuff
            //window clear
            //window draw
            //window display
    }
}

void update()
{
    while (window->isOpen() && isRunning) 
    {
        while (window->pollEvent(event)) 
        {
            if (event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) 
            {
                isRunning = false;
            }
            else if (m_event.type == sf::Event::Resized) 
            {
                glViewport(0, 0, m_event.size.width, m_event.size.height);
            }

        }

        // really resource intensive process here

        time = m_clock.getElapsedTime();
        clock.restart().asSeconds();
    }
}

提前致谢。

【问题讨论】:

    标签: c++ multithreading sfml


    【解决方案1】:

    我猜错误的发生是因为你操作了同时被渲染的元素。您需要研究互斥锁。 互斥锁锁定您要操作的元素(或在另一个线程中绘制),只要操作需要并在之后释放它。 当元素被锁定时,它不能被其他线程访问。

    伪代码示例:

    updateThread(){
        renderMutex.lock();
        globalEntity.manipulate();
        renderMutex.unlock();
    }
    
    renderThread(){
        renderMutex.lock();
        window.draw(globalEntity);
        renderMutex.unlock();
    }
    

    【讨论】:

    • 我会在有时间的时候研究一下。感谢您的信息!
    • 解决了!谢谢!
    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2016-01-20
    • 1970-01-01
    相关资源
    最近更新 更多