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

我想实现在osgearth上动态画线,就是实现表示两个飞机之间关系线,因为飞机实时运动,所以给了两个坐标一个startLLA,一个endllA里面包括,经纬度以及高度,最后一个参数是表示飞机之间是否是同一编队的,我这样画13条线后,界面就开始有卡顿延迟了,我把这些加入mapnode后会在别的地方remove掉,然后重复这个循环,但是还是卡顿
关注🕒上午好,题主!目前:🟢[在线]
📢参考GPT-4o mini 模型、由清水白石008整理提供!
📣今日金句:“生活就像骑自行车。要保持平衡,就得不断前进。” — 阿尔伯特·爱因斯坦
在使用 osgEarth 动态绘制线条时,尤其是在实时更新飞机之间的关系线时,可能会遇到性能问题。以下是一些优化建议,可以帮助你减少卡顿和延迟:
每次更新时,创建新的 FeatureNode 和 Feature 可能会导致性能下降。考虑以下方法:
FeatureNode 和 Feature 对象,而不是每次都创建新的。这可以通过维护一个对象池来实现。如果可能,尝试将多个线条的更新合并为一次绘制调用。这样可以减少渲染的开销。
如果飞机之间的关系线不需要每帧都更新,可以考虑降低更新频率。例如,每隔几帧更新一次。
如果线条的细节不需要太高,可以考虑使用更简单的几何体来表示线条,或者减少线条的分段数。
如果你的应用程序允许,可以将计算和更新逻辑放在一个单独的线程中,以避免阻塞主渲染线程。
以下是你提供的代码的一个优化示例,重用 FeatureNode 和 Feature:
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); // 将节点放回列表
}
使用性能分析工具(如 Visual Studio 的性能分析器或其他工具)来识别瓶颈,看看是否有特定的代码段导致了性能问题。
通过这些优化,你应该能够减少在动态绘制线条时的卡顿和延迟。