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

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 静电纺丝煅烧后如何得到柔性纤维
  • ¥15 (标签-react native|关键词-镜像源)
  • ¥100 照片生成3D人脸视频
  • ¥15 伪装视频时长问题修改MP4的时长问题,
  • ¥15 JETSON NANO
  • ¥15 VS开发qt时如何在paintgl函数中用pushbutton控制切换纹理
  • ¥20 关于 openpyxl 处理excel文件地问题
  • ¥15 MS中不知道高分子的构型怎么构建模型
  • ¥60 QQOP数据,什么是op数据号,怎么提取op数据!能不能大量提取(语言-c语言)
  • ¥15 matlab代码 关于微分方程和嵌套的分段函数。