- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在开发一个使用 Cesium Viewer 的应用程序。我需要能够显示将动态更新的形状集合。我无法理解执行此操作的最佳方法。
我目前正在使用实体并使用 CallbackProperties 来更新形状。
你可以通过这个沙堡来了解我是如何做到这一点的。有一个多边形对象被用作 cesiumCallback 的基础,并且它正在由另一段代码进行编辑。 (用setTimeout模拟)
var viewer = new Cesium.Viewer('cesiumContainer', {});
var polygon = {};
polygon.coordinates = [
{longitude: 0, latitude: 0, altitude: 0},
{longitude: 10, latitude: 10, altitude: 0},
{longitude: 10, latitude: 0, altitude: 0}
];
// converts generic style options to cesium one (aka color -> material)
var polOpts = {};
// function for getting location
polOpts.hierarchy = new Cesium.CallbackProperty(function() {
var hierarchy = [];
for (var i = 0; i < polygon.coordinates.length; i++) {
var coordinate = polygon.coordinates[i];
hierarchy.push(Cesium.Cartesian3.fromDegrees(coordinate.longitude, coordinate.latitude, coordinate.altitude));
}
return hierarchy;
}, false);
viewer.entities.add({polygon: polOpts});
setInterval(function(polygon){
polygon.coordinates[0].longitude--;
}.bind(this, polygon), 1000);
传入的多边形是一个一般描述多边形的类,因此它有一个坐标和样式选项数组,以及一个调用此方法的渲染方法 renderPolygon 传入其本身。这种渲染形状的方法适用于我需要的一切,但性能不是很好。形状更新有两种情况,一种形状会在很长一段时间内更新,更新速度很慢,比如每隔几秒更新一次。另一种形状将在几秒钟内更新多次,例如数千次,然后很长一段时间不会再次更改(如果有的话)。
对于如何解决这个问题,我有两个想法。
想法1:有两个方法,一个 renderDynamicPolygon 和一个 renderStaticPolygon。renderDynamicPolygon 方法将使用 cesiumCallbackProperties 执行上述功能。这将用于在短时间内更新多次的形状。更新完成后,renderStaticPolygon 方法将使用常量值替换使用callbackProperties 的实体属性。
这会产生大量其他工作来确保形状处于正确状态,并且对长期缓慢更新的形状没有帮助。
想法2:与基元的工作方式类似,我尝试删除旧实体,并在每次需要更新时再次添加其更新的属性,但这会导致闪烁,并且与基元不同,我找不到实体的异步属性。
我也尝试过使用原语。它对于折线非常有效,我只需删除旧的折线并添加具有更新属性的新折线即可。我还使用 async = false 来确保没有闪烁。我在这里遇到的问题是并非所有形状都可以使用基元创建。 (这是真的吗?)
我尝试的另一件事是使用几何实例,使用几何和外观。在浏览完 cesium 网站上的教程后,我能够渲染一些形状,并可以更新外观,但发现几乎不可能弄清楚如何正确更新形状,并且也很难让它们看起来正确。形状需要具有正确的形状、填充颜色和不透明度以及描边颜色、不透明度和粗细。我尝试使用 PolygonOutlineGeometry,但没有成功。
实现这一点的最佳方法是什么?这些选项之一是否朝着正确的方向发展,或者还有其他我尚未发现的方法吗?
<小时/>[编辑]我添加了我得到的答案,但仍然不完整并正在寻找答案。
最佳答案
我已经想出了一个很好的解决方案,但仍然有一个小问题。
我也做了一些显示实体的方法。我正在调用一种渲染和一种绘制。渲染使用 Cesium.CallbackProperty
和 isConstant
属性 true
,并使用 isConstantProperty
false 进行绘制
.
然后我创建了一个函数来将实体从渲染更改为绘制,反之亦然。它遍历实体回调属性,并使用 setCallback 属性用正确的函数和 isConstant 值覆盖该属性。
示例:我根据定义的圆形对象创建了一个椭圆。
// isConst is True if it is being "painted" and false if it is being "rendered"
ellipse: lenz.util.extend(this._getStyleOptions(circle), {
semiMinorAxis: new Cesium.CallbackProperty(
this._getRadius.bind(this, circle),
isConst
),
semiMajorAxis: new Cesium.CallbackProperty(
this._getRadius.bind(this, circle),
isConst
),
})
因此,当更新形状时(当用户绘制形状时),形状将在 isConstant 为 false 的情况下呈现。然后,当绘图完成时,使用如下代码将其转换为绘制版本:
existingEntity.ellipse.semiMinorAxis.setCallback(
this._getRadius.bind(this, circle),
isConst
);
existingEntity.ellipse.semiMajorAxis.setCallback(
this._getRadius.bind(this, circle, 1),
isConst
);
这在性能方面非常有效。我能够绘制数百种形状,而框架根本不会下降太多。我附上了更改前后包含 612 个实体的 cesium 贴图的屏幕截图,使用 chrome 渲染工具时的帧速率位于右上角。
之前:锁定在 fps 0.9注意:我编辑了用户界面的其余部分,女巫让地球仪看起来被切断了,抱歉
更改后:fps 保持在 59.9,几乎完美!
每当实体从使用常量回调属性“转换”为非常量回调属性时,它和同一类型的所有其他实体都会闪烁然后再次亮起。我找不到更好的方法来进行这种转换。我觉得我一定还缺少一些东西。
关于cesiumjs - 铯中动态形状的最佳且性能最高的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32869814/
背景: 我最近一直在使用 JPA,我为相当大的关系数据库项目生成持久层的轻松程度给我留下了深刻的印象。 我们公司使用大量非 SQL 数据库,特别是面向列的数据库。我对可能对这些数据库使用 JPA 有一
我已经在我的 maven pom 中添加了这些构建配置,因为我希望将 Apache Solr 依赖项与 Jar 捆绑在一起。否则我得到了 SolarServerException: ClassNotF
interface ITurtle { void Fight(); void EatPizza(); } interface ILeonardo : ITurtle {
我希望可用于 Java 的对象/关系映射 (ORM) 工具之一能够满足这些要求: 使用 JPA 或 native SQL 查询获取大量行并将其作为实体对象返回。 允许在行(实体)中进行迭代,并在对当前
好像没有,因为我有实现From for 的代码, 我可以转换 A到 B与 .into() , 但同样的事情不适用于 Vec .into()一个Vec . 要么我搞砸了阻止实现派生的事情,要么这不应该发
在 C# 中,如果 A 实现 IX 并且 B 继承自 A ,是否必然遵循 B 实现 IX?如果是,是因为 LSP 吗?之间有什么区别吗: 1. Interface IX; Class A : IX;
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在阅读标准haskell库的(^)的实现代码: (^) :: (Num a, Integral b) => a -> b -> a x0 ^ y0 | y0 a -> b ->a expo x0
我将把国际象棋游戏表示为 C++ 结构。我认为,最好的选择是树结构(因为在每个深度我们都有几个可能的移动)。 这是一个好的方法吗? struct TreeElement{ SomeMoveType
我正在为用户名数据库实现字符串匹配算法。我的方法采用现有的用户名数据库和用户想要的新用户名,然后检查用户名是否已被占用。如果采用该方法,则该方法应该返回带有数据库中未采用的数字的用户名。 例子: “贾
我正在尝试实现 Breadth-first search algorithm , 为了找到两个顶点之间的最短距离。我开发了一个 Queue 对象来保存和检索对象,并且我有一个二维数组来保存两个给定顶点
我目前正在 ika 中开发我的 Python 游戏,它使用 python 2.5 我决定为 AI 使用 A* 寻路。然而,我发现它对我的需要来说太慢了(3-4 个敌人可能会落后于游戏,但我想供应 4-
我正在寻找 Kademlia 的开源实现C/C++ 中的分布式哈希表。它必须是轻量级和跨平台的(win/linux/mac)。 它必须能够将信息发布到 DHT 并检索它。 最佳答案 OpenDHT是
我在一本书中读到这一行:-“当我们要求 C++ 实现运行程序时,它会通过调用此函数来实现。” 而且我想知道“C++ 实现”是什么意思或具体是什么。帮忙!? 最佳答案 “C++ 实现”是指编译器加上链接
我正在尝试使用分支定界的 C++ 实现这个背包问题。此网站上有一个 Java 版本:Implementing branch and bound for knapsack 我试图让我的 C++ 版本打印
在很多情况下,我需要在 C# 中访问合适的哈希算法,从重写 GetHashCode 到对数据执行快速比较/查找。 我发现 FNV 哈希是一种非常简单/好/快速的哈希算法。但是,我从未见过 C# 实现的
目录 LRU缓存替换策略 核心思想 不适用场景 算法基本实现 算法优化
1. 绪论 在前面文章中提到 空间直角坐标系相互转换 ,测绘坐标转换时,一般涉及到的情况是:两个直角坐标系的小角度转换。这个就是我们经常在测绘数据处理中,WGS-84坐标系、54北京坐标系
在软件开发过程中,有时候我们需要定时地检查数据库中的数据,并在发现新增数据时触发一个动作。为了实现这个需求,我们在 .Net 7 下进行一次简单的演示. PeriodicTimer .
二分查找 二分查找算法,说白了就是在有序的数组里面给予一个存在数组里面的值key,然后将其先和数组中间的比较,如果key大于中间值,进行下一次mid后面的比较,直到找到相等的,就可以得到它的位置。
我是一名优秀的程序员,十分优秀!