当前位置: 代码迷 >> C# >> Arcgis Engine开发在Scenecontrol上平添text动态更新时内存不断增长
  详细解决方案

Arcgis Engine开发在Scenecontrol上平添text动态更新时内存不断增长

热度:56   发布时间:2016-05-05 04:38:48.0
Arcgis Engine开发在Scenecontrol上添加text动态更新时内存不断增长
各位大神:
小弟在用vs2012下C#写基于arcgis 的一个三维应用程序。
需求很简单,需要讲一个人的位置和运行时间计算出来,在scenecontrol上动态显示。
于是我创建了一个graphicslayer,然后定义了一个graphicscontainer = graphicslayer as Igraphicscontainer 
于是又创建了一个text3delement,定义了这个text的各种属性,当然也包括一些symbol等等,
最后把这个text3delement给graphicscontainer.addelement(text3delement);
this.axscenecontrol.scene.addlayer(graphicslayer );
然后刷新该图层;
这样添加了一个三维文字,因为秒表要定时刷新,因此我采用了两个办法,一个是定时器,一个是开线程后thread.sleep(1000);
在timer或者thread的响应函数中,分别使用过委托/消息 的办法去刷新text3delement,
当然重要的是,我刷新的办法:将text3delement定义成全局,然后在刷新的这里重新将text3delement的位置和text属性赋值,然后text3delement.update();然后刷新
这时,我的应用程序内存暴涨,好像完全没有释放的意思,但是我想,我在刷新这块应该只是update了一些啊,没有创建什么新的东西啊
后来我测试了一下,如果我改变text3delement的内容少一些,内存增长就少一些,如果不变 ,内存就不涨,即使执行text3delement.update();
那么问题来了,是我不会用这个update呢,还是我应该怎么去主动释放一下内存呢?
------解决思路----------------------
接上文,
GC.Collect()就是通知清洁工可以进行清理了
它不代表清洁工就马上会来,但是总是比不知道他什么时候有心情了来一趟要快一些就是了

清洁工什么时候开始清理呢?定时清理;空间不足时清理
那么很显然的,定时的时间和空间不足的剩余量,这些肯定会和你空间总大小是有关的
如果你内存足够大,就不需要清理的太频繁,清理太频繁反而吃CPU,降低效率
------解决思路----------------------
你的内存常占用到80%左右,是么??
arcgis本来就需要很多内存,就算你不做什么处理,也是。
而且三维的占用内存就更多了。

你可以试试写二维的文字,看看占用情况,再做分析。

ArcGIS Engine开发中,一般cursor相关我都释放;
using(ComReleaser pComReleaser=new ComReleaser())
{
ICursor queryCursor = queryTableSort.Rows;
 pComReleaser.ManageLifetime(queryCursor);
}

我现在采用这种释放资源的方式,是engine中自己的资源释放方式。

但不是所有的都要释放。

你如果用.net的释放方式:
System.Runtime.InteropServices.Marshal.ReleaseComObject(queryCursor);
 System.GC.Collect();

而且这种释放,尽量不要放在循环中。
  相关解决方案