waveLineImage = {
chart: {
renderTo: 'waveImage', //绘制到DIV容器中,根据ID
defaultSeriesType: 'line', //绘制类型 目前是曲线
plotBorderWidth: 1,
plotBorderColor: '#99CC99',
marginRight: 12,
showAxes: true
},
title: {
text: '',
x: -20 //center
},
xAxis: {
tickWidth: 0,
tickInterval: 5,
gridLineWidth: 1,
gridLineColor: '#99CC99',
categories: []
},
yAxis: {
title: {
text: ''
},
min: -1,
tickInterval: 5,
gridLineWidth: 1,
gridLineColor: '#99CC99'
},
plotOptions: {
series: {
animation: false,
marker: {
enabled: false
}
}
},
tooltip: {
enabled:false,
formatter: function(){
return null;
}
},
legend: {
enabled: false
},
exporting: {
enabled: false
},
series: [{
name: "monitor",
data: []
}, {
name: "temp",
data: []
}]
}
var tempArray = null;function drawOscillogram(waveData){
if (waveData) { //传输过来的JSON数据
var dataArray = new Array();
var array = null, point = null, num = null,item = null;
var waveDataLength = waveData.length;
for (var i = 0; i < waveDataLength; i++) {
array = waveData[i].split(",");
point = 1 / array.length;
for (var j = 0; j < array.length; j++) {
num = i + Math.round((point * j) * 10) / 10;
item = parseFloat(array[j]);
dataArray.push([num, item]);
num = null;
}
array = null; item = null; point = null;
}if (waveDataLength < 60) { //当不足60个点时,创建一个临时的数据,绑定到temp当中 if (tempArray == null) { tempArray = new Array(); for (var i = 0; i < 61; i++) { tempArray.push([i, -6]); } } if(!waveLineImage.series[1]) waveLineImage.addSeries("",true,false); waveLineImage.series[1].data = tempArray; } else { tempArray = null; waveLineImage.series[1].remove(); } waveLineImage.series[0].data = dataArray; dataArray = null; waveDataLength = null; waveLineImage.redraw(); //重新绘制HighCharts图形 new Highcharts.Chart(waveLineImage); //绘制HIghcharts图形,这一句会生成大内
//存,想直接调用redraw重绘方法,完成绘图,这样不用重新刷新区域,而是在旧的基础上绘制,会减少内存,但
//是曲线什么都显示不出来
}
}
怎么没人回复啊 泪奔、、 | 太遗憾了吧 |
waveLineImage = new Highcharts.Chart({直接实例化绘图对象
chart: {
renderTo: 'waveImage', //绘制到DIV容器中,根据ID
defaultSeriesType: 'line', //绘制类型 目前是曲线
plotBorderWidth: 1,
plotBorderColor: '#99CC99',
marginRight: 12,
showAxes: true
},
title: {
text: '',
x: -20 //center
},
xAxis: {
tickWidth: 0,
tickInterval: 5,
gridLineWidth: 1,
gridLineColor: '#99CC99',
categories: []
},
yAxis: {
title: {
text: ''
},
min: -1,
tickInterval: 5,
gridLineWidth: 1,
gridLineColor: '#99CC99'
},
plotOptions: {
series: {
animation: false,
marker: {
enabled: false
}
}
},
tooltip: {
enabled:false,
formatter: function(){
return null;
}
},
legend: {
enabled: false
},
exporting: {
enabled: false
},
series: [{
name: "monitor",
data: []
}, {
name: "temp",
data: []
}]
});
var tempArray = null;
function drawOscillogram(waveData){if (waveData) { //传输过来的JSON数据 var dataArray = new Array(); var array = null, point = null, num = null,item = null; var waveDataLength = waveData.length; for (var i = 0; i < waveDataLength; i++) { array = waveData[i].split(","); point = 1 / array.length; for (var j = 0; j < array.length; j++) { num = i + Math.round((point * j) * 10) / 10; item = parseFloat(array[j]); dataArray.push([num, item]); num = null;item=null; } array = null; item = null; point = null; } array = null; item = null; point = null; num = null; item=null; if (waveDataLength < 60) { //当不足60个点时,创建一个临时的数据,绑定到temp当中 if (tempArray == null) { tempArray = new Array(); for (var i = 0; i < 61; i++) { tempArray.push([i, -6]); } } if(!waveLineImage.series[1]) waveLineImage.addSeries("",true,false); waveLineImage.series[1].setData(tempArray); } else { tempArray = null; waveLineImage.series[1].remove(); } waveLineImage.series[0].setData(dataArray); //在这里通过setData方法设置数据 dataArray = null; waveDataLength = null; waveLineImage.redraw(); //这样调用图例对象的重绘方法可以找的到数据,以前数
//据是设置到JSON里面了,这个对象的数据应该没有更新
}
}
哦哦。。。原来是HighCharts
官方声称是有解决内存泄漏问题,但关键是。。。它指的泄漏是关闭浏览器仍不释放的泄漏,而非运行中释放
基本上,想要解决难度很大,几乎底层代码都要过一遍,加上清理事件、解除Dom引用的逻辑。
好像excanvas也需要一同改进
HighCharts代码不便放出(就算放出也没用,版本低,改动大),但还是能做到将近0增长的。
P.S. 推荐使用sIEve查看IE下Dom节点释放情况,JS本身的GC是很完善的,但与Dom循环引用就无能为力了。所以查看Dom节点的释放情况就知道是哪里有泄漏了。
这个图表真的很蛋痛!
想让大家说什么呢,图太少,不给力。
highChart我也在用,倒是没深究内存增长的问题。它也是vml+svg。内存不释放跟js代码和浏览器自身实现方式都有关系,有些情况你是无法有效释放内存的:比如在ie中,希望刷新释放内存是无法实现的,你可以到taobao、google地图等网站验证下,它默认将所有的页面元素都缓存起来,因此即使js完全没有问题它所占的内存也会越来越大。但chrome就好得多,每次刷新都显著地释放一些内存。至于highChart你可以到官网上反映下,看是否是内存泄露导致的。
我建议你用FusionCharts,你可以在网上搜一下,他的图表显示就很好,我用的就是这个,很简单的,你可以再往上找一个破解版的,但是破解版的柯南找的时候有点不好找。
JavaEye/ItEye
1号群 现招人 QQ 群号:39211996
女程序员群7736086
发完帖子我的号就没了,哎!
[quote="奥义之舞"][quote="yintingbird"]我建议你用FusionCharts,你可以在网上搜一下,他的图表显示就很好,我用的就是这个,很简单的,你可以再往上找一个破解版的,但是破解版的柯南找的时候有点不好找。[/quote]
这个项目 已经基本完成了,这时候在动这个技术不太可可能,有可能到最后的时候 换成 SVG + VML了,
觉得这个 可以 控制,但是 AJAX 刷新时,内存也是嗖嗖的网上长啊,一秒10几KB 这还只是 小图形。
不过应该比当年用DIV时候强吧、、 8) [/quote]
HighCharts 商业用的话要收费吧。
你们买了授权还是做的是国内项目?
http://www.open-lib.com/Type/164-1.jsp
这里面或许有你要找的。大家都共享一下自己项目用的图标组件吧。
我以前和你遇到过同样的问题,amcharts可以解决。
HighCharts所renderer出来的每个Element都是可以destroy的,每个element都有destroy方法。HighCharts封装了VML和SVG,基本上能够跨浏览器。
用过Flex as3脚本写过一个监控的,内存占用是用仪表盘形式做的。也试过用pushlet+highchart写过(不是很理想,抛弃)
[quote="奥义之舞"][quote="sunofsummer"]我以前和你遇到过同样的问题,amcharts可以解决。[/quote]
性能方面可以解决么,内存长的快不,和AJAX交互怎么样,[/quote]
amcharts是基于flash实现的 如果网页游戏不存在内存问题的话 它也不会有的。
频繁的jquery.ajax也会出现问题 。。对象销毁不干净 。
回个帖子,存个档,以后或许会用到
一帮人在这里解决问题,都不看楼主的代码,new Highcharts.Chart(waveLineImage); 你每次都会创建对象,浏览器能不崩溃吗?不要把页面初始化和实时请求混到一起,声明全局highchart对象,页面初始化的时候new一个highcharts对象,后面的实时请求只需要对series set数据就可以,然后调用redraw函数,或者先destroy highchart 然后在new。
PS:pushlet+highcharts 效果还是挺理想的