昂德森科技 2024-08-13 17:24 采纳率: 0%
浏览 7

osgearth画动态线

img

我想实现在osgearth上动态画线,就是实现表示两个飞机之间关系线,因为飞机实时运动,所以给了两个坐标一个startLLA,一个endllA里面包括,经纬度以及高度,最后一个参数是表示飞机之间是否是同一编队的,我这样画13条线后,界面就开始有卡顿延迟了,我把这些加入mapnode后会在别的地方remove掉,然后重复这个循环,但是还是卡顿

  • 写回答

1条回答 默认 最新

  • 清水白石008 2024-08-15 05:53
    关注
    🕒上午好,题主!目前:🟢[在线]
    📢参考GPT-4o mini 模型、由清水白石008整理提供!
    📣今日金句:“生活就像骑自行车。要保持平衡,就得不断前进。” — 阿尔伯特·爱因斯坦
    

    在使用 osgEarth 动态绘制线条时,尤其是在实时更新飞机之间的关系线时,可能会遇到性能问题。以下是一些优化建议,可以帮助你减少卡顿和延迟:

    1. 减少绘制调用

    每次更新时,创建新的 FeatureNodeFeature 可能会导致性能下降。考虑以下方法:

    • 重用对象:在每次更新时,重用现有的 FeatureNodeFeature 对象,而不是每次都创建新的。这可以通过维护一个对象池来实现。

    2. 批量更新

    如果可能,尝试将多个线条的更新合并为一次绘制调用。这样可以减少渲染的开销。

    3. 降低更新频率

    如果飞机之间的关系线不需要每帧都更新,可以考虑降低更新频率。例如,每隔几帧更新一次。

    4. 使用简化的几何体

    如果线条的细节不需要太高,可以考虑使用更简单的几何体来表示线条,或者减少线条的分段数。

    5. 线程处理

    如果你的应用程序允许,可以将计算和更新逻辑放在一个单独的线程中,以避免阻塞主渲染线程。

    6. 代码优化

    以下是你提供的代码的一个优化示例,重用 FeatureNodeFeature

    void MainWindow::DrawRelationshipBetweenPlanes(const osg::Vec3d& startLLA,
                                                   const osg::Vec3d& endLLA,
                                                   bool Friendsign) {
        // 检查是否已经存在对应的 FeatureNode
        osg::ref_ptr<FeatureNode> fnode;
        if (!featureNodeList.empty()) {
            fnode = featureNodeList.back(); // 获取最后一个节点
            featureNodeList.pop_back(); // 从列表中移除
        } else {
            // 如果没有可重用的节点,则创建新的
            fnode = new FeatureNode();
        }
    
        osg::ref_ptr<Feature> feature = new Feature();
        osg::ref_ptr<Geometry> geom = new osgEarth::Polygon();
        geom->push_back(startLLA);
        geom->push_back(endLLA);
        feature->setGeometry(geom);
        feature->setGeoInterp(GEOINTERP_RHUMB_LINE);
    
        Style geomStyle;
        if (Friendsign) {
            geomStyle.getOrCreate<LineSymbol>()->stroke()->color() = Color::Yellow;
        } else {
            geomStyle.getOrCreate<LineSymbol>()->stroke()->color() = Color::Orange;
        }
        geomStyle.getOrCreate<LineSymbol>()->stroke()->width() = 1.0f;
        geomStyle.getOrCreate<LineSymbol>()->tessellationSize()->set(730, Units::METERS);
    
        fnode->setFeature(feature, geomStyle);
        m_mapNode->addChild(fnode);
        featureNodeList.push_back(fnode); // 将节点放回列表
    }
    

    7. 性能分析

    使用性能分析工具(如 Visual Studio 的性能分析器或其他工具)来识别瓶颈,看看是否有特定的代码段导致了性能问题。

    8. 其他建议

    • 确保你的图形驱动程序是最新的。
    • 检查是否有其他资源(如纹理、模型等)在同时消耗性能。

    通过这些优化,你应该能够减少在动态绘制线条时的卡顿和延迟。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月13日

悬赏问题

  • ¥15 WPF动态创建页面内容
  • ¥15 如何对TBSS的结果进行统计学的分析已完成置换检验,如何在最终的TBSS输出结果提取除具体值及如何做进一步相关性分析
  • ¥15 SQL数据库操作问题
  • ¥100 关于lm339比较电路出现的问题
  • ¥15 Matlab安装yalmip和cplex功能安装失败
  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线