各位大神:
小弟在用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();
而且这种释放,尽量不要放在循环中。