查看: 4869|回复: 8

[注意]多线程渲染需要注意的问题

[复制链接]
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2008-4-29 13:13:10 | 显示全部楼层 |阅读模式
    在这个论坛上,我改了官方的一个单文档框架,无论是单文档的还是多文档的还是Array的OCX控件使用的都是下面的线程进行渲染
    //------------------------------//------------------------------
    //渲染线程,独立的
    void CCoreOSG::Render(void* ptr)
    {
        CCoreOSG* osg = (CCoreOSG*)ptr;

        osgViewer::Viewer* viewer = osg->getViewer();

        //可以这样
        //      viewer->run()   or
        //      while(!viewer->done()) { viewer->frame(); }

        //viewer->run();

            //也可以这样,我建议这样
        while(!viewer->done())
        {
            osg->PreFrameUpdate();
            viewer->frame();
            osg->PostFrameUpdate();
            //Sleep(10);         // 让其它程也占用CPU,放出10MS
        }

        //退出了程序,弹出个对话框说一下
        AfxMessageBox("线程退出");

            //线程退出
        _endthread();
    }


    该程序很禁得起考验,读入2G数据,跑了一天一夜基本上没有什么变化,速度方面相当可观,与开始时占用的内存大小也没什么变化,故只可能存在极小的泄漏,小到可以忽略,

    但多线程控制有一个地方让人担扰,在对viewer与root进行频繁的addSlave removeSlave pick removeChild等等操作时Render究竟走到哪里了,会不会暴死,

    肯定是会的,尤其在对图形上下文操时,暴死频繁,这就需要在对Render进行处理,在进行暴死的操作时LOCK它

    希望对Render的这些暴死点有所突破,

    该用户从未签到

    发表于 2008-4-29 15:29:48 | 显示全部楼层
    原帖由 FreeSouth 于 2008-4-29 13:13 发表
    在这个论坛上,我改了官方的一个单文档框架,无论是单文档的还是多文档的还是Array的OCX控件使用的都是下面的线程进行渲染


    该程序很禁得起考验,读入2G数据,跑了一天一夜基本上没有什么变化,速度方面相当可观 ...


    用UpdateCallback之类的来完成这些工作怎么样?这个时候线程应该自己锁住了的
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2008-4-29 15:37:59 | 显示全部楼层
    嗯,,,逻辑设计真是个难题,因为交互所采用的菜单,对话框之类的,与OSG什么时候搞切合点在多线程时显得重要起来,程序大了才发现,这下完了

    该用户从未签到

    发表于 2008-4-29 16:08:13 | 显示全部楼层
    多线程渲染,一个比较难以控制的问题的~~~~~~~~~~~

    该用户从未签到

    发表于 2008-5-3 16:28:37 | 显示全部楼层
    OSG渲染本身是多线程吧
    我采用的办法是 另启一个线程进行数据调度 利用OSG默认的渲染线程进行渲染
    这样在debug下会有debug assertion failed的错误
    release 版本运行正常

    该用户从未签到

    发表于 2008-5-19 06:50:56 | 显示全部楼层
    这个问题是个很严重的问题,我前几天也碰到过,读入大量数据的时候会暴死,一点反应都没有,再就是在运行的时候调整单线程到多线程也会突然就死了!

    该用户从未签到

    发表于 2008-5-19 09:31:47 | 显示全部楼层
    这个问题是个很严重的问题,我前几天也碰到过,读入大量数据的时候会暴死,一点反应都没有,再就是在运行的时候调整单线程到多线程也会突然就死了


    可能是你的线程配置有问题吧~~~~~~线程比较让你难以控制~~~~~

    该用户从未签到

    发表于 2010-1-23 19:42:05 | 显示全部楼层
    最好像王锐说的那样,一般放到UpdateCallback或事件的处理中进行增加、删除节点等操作安全性高,不会出现问题,OSG例子的处理方式是不能直接用到项目中的。

    该用户从未签到

    发表于 2010-1-23 20:19:47 | 显示全部楼层
    最好像王锐说的那样,一般放到UpdateCallback或事件的处理中进行增加、删除节点等操作安全性高,不会出现问题,OSG例子的处理方式是不能直接用到项目中的。
    donghua 发表于 2010-1-23 19:42



    这样实现的话,实现起来有点麻烦。。。
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    OSG中国官方论坛-有您OSG在中国才更好

    网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

    联系我们

    • 工作时间:09:00--18:00
    • 反馈邮箱:1315785073@qq.com
    快速回复 返回顶部 返回列表