<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Visualization tool for Memory]]></title><description><![CDATA[<p>I write a Memory analyzer.
Based on Echarts, Memory visualization tool</p>
<p><img src="/forum/assets/uploads/files/1619015689826-67c2f638-dc77-45a0-9735-a83c14cbca13-image-resized.png" alt="0_1619015689937_67c2f638-dc77-45a0-9735-a83c14cbca13-image.png" class="img-responsive img-markdown" />
<img src="/forum/assets/uploads/files/1619016620277-92a692af-96bb-4b56-b5fe-33d781c66452-image-resized.png" alt="0_1619016618465_92a692af-96bb-4b56-b5fe-33d781c66452-image.png" class="img-responsive img-markdown" /></p>
]]></description><link>http://screeps.com/forum/topic/3168/visualization-tool-for-memory</link><generator>RSS for Node</generator><lastBuildDate>Fri, 12 Jun 2026 17:14:40 GMT</lastBuildDate><atom:link href="http://screeps.com/forum/topic/3168.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 21 Apr 2021 14:37:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Visualization tool for Memory on Wed, 21 Apr 2021 14:58:46 GMT]]></title><description><![CDATA[<p>I write a Memory analyzer.
Based on Echarts, Memory visualization tool</p>
<p><img src="/forum/assets/uploads/files/1619015689826-67c2f638-dc77-45a0-9735-a83c14cbca13-image-resized.png" alt="0_1619015689937_67c2f638-dc77-45a0-9735-a83c14cbca13-image.png" class="img-responsive img-markdown" />
<img src="/forum/assets/uploads/files/1619016620277-92a692af-96bb-4b56-b5fe-33d781c66452-image-resized.png" alt="0_1619016618465_92a692af-96bb-4b56-b5fe-33d781c66452-image.png" class="img-responsive img-markdown" /></p>
]]></description><link>http://screeps.com/forum/post/16354</link><guid isPermaLink="true">http://screeps.com/forum/post/16354</guid><dc:creator><![CDATA[6g3y]]></dc:creator><pubDate>Wed, 21 Apr 2021 14:58:46 GMT</pubDate></item><item><title><![CDATA[Reply to Visualization tool for Memory on Wed, 21 Apr 2021 14:51:17 GMT]]></title><description><![CDATA[<pre><code class="language-html">&lt;html style=&quot;height: 100%&quot;&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;utf-8&quot;&gt;
    &lt;/head&gt;
    &lt;body style=&quot;height: 100%; margin: 0&quot;&gt;
	
Memory: &lt;input type=&quot;text&quot; name=&quot;fname&quot; id=&quot;jsonStr&quot; /&gt;
&lt;button type=&quot;submit&quot; id=&quot;btn&quot;&gt;分析&lt;/button&gt; 使用方法：控制台运行【JSON.stringify(Memory)】然后复制输出到这里点击分析就可以了

        &lt;div id=&quot;container&quot; style=&quot;height: 100%&quot;&gt;&lt;/div&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js&quot;&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot;&gt;
var dom = document.getElementById(&quot;container&quot;);
var myChart = echarts.init(dom);
var app = {};

var option;

let json = &quot;{}&quot;

myChart.showLoading();
myChart.hideLoading();

let oriData = JSON.parse(json)
console.log(oriData)

let diskData = []

function getType(obj){
 return &quot;&quot; + Object.prototype.toString.call(obj).replace(&quot;[object &quot;,&quot;&quot;)+&quot;&quot;;
}

		
function getChildrens(data,name,len){
	let out = {
          name: name,
		  value: len,
		  datas:name+&quot;:&quot;+data,
          children: []
	}
	let da = JSON.parse(data);
	let obj = &quot;[&quot; + Object.prototype.toString.call(da).replace(&quot;[object &quot;,&quot;&quot;)+&quot;&quot;;
	//Object.prototype.toString.call(da)
	//out.name+=obj;
	if(typeof(da)=='object'){
		for(let k in da){
			//if(!da[k])continue;
			let subJson = JSON.stringify(da[k]);
			//console.log(k,typeof(subJson),da)
			let keyLen = obj != &quot;[Array]&quot;? (&quot;&quot;+k).length : 0; //  如果是数组不用key
			keyLen += getType(k) == &quot;Number&quot;?0:2 // 不是数字要加双引号
			let namet = obj == &quot;[Array]&quot;? &quot;[&quot;+k+&quot;]&quot;:k // 数组 [ 0 ]
			if(da[k]==undefined)out.children.push({name:namet,value:keyLen})
			else out.children.push(getChildrens(subJson,namet,keyLen+(subJson?subJson.length:0)))
		}
	}else{
		out.name+=&quot;:&quot;+data
	}
	if(out.children.length==0) delete out.children;
	return out;
}
diskData = getChildrens(json,&quot;Memoey&quot;,json.length).children
//console.log(diskData)

function colorMappingChange(value) {
	var levelOption = getLevelOption(value);
	chart.setOption({
		series: [{
			levels: levelOption
		}]
	});
}

var formatUtil = echarts.format;


function getLevelOption() {
	return [
            {
                itemStyle: {
                    borderColor: '#777',
                    borderWidth: 0,
                    gapWidth: 1
                },
                upperLabel: {
                    show: false
                }
            },
            {
                itemStyle: {
                    borderColor: '#555',
                    borderWidth: 5,
                    gapWidth: 1
                },
                emphasis: {
                    itemStyle: {
                        borderColor: '#ddd'
                    }
                }
            },
            {
                colorSaturation: [0.35, 0.5],
                itemStyle: {
                    borderWidth: 5,
                    gapWidth: 1,
                    borderColorSaturation: 0.7
                }
            }
        ].concat(([...Array(12).keys()]).map(e=&gt;{
			return {
				colorSaturation: [0.35, 0.5],
				itemStyle: {
					borderWidth: 5,
					gapWidth: 1,
					borderColorSaturation: 0.75-e*0.05
				}
			}
		}));
}

console.log(getLevelOption())


function transform(datas){
	if(datas.length&gt;2500/2){
		datas=datas.substr(0,2500/2-4)+&quot;...&quot;
	}
	out = &quot;&quot;
	for(let i = 0;i&lt;datas.length;i+=50){
		
		out+='&lt;div class=&quot;tooltip-title&quot;&gt;' + datas.substr(i,50) + '&lt;/div&gt;'
	}
	
	return out;
}


function update(json){

	diskData = getChildrens(&quot;&quot;+json,&quot;Memoey&quot;,json.length).children
	
	
	myChart.setOption(option = {


		tooltip: {
			formatter: function (info) {
				var value = info.value;
				var datas = info.data.datas;
				var treePathInfo = info.treePathInfo;
				var treePath = [];
				//if(datas.length&gt;50)datas=datas.substr(0,50)+&quot;...&quot;
				datas=transform(datas)

				for (var i = 1; i &lt; treePathInfo.length; i++) {
					treePath.push(treePathInfo[i].name);
				}

				return [
					'&lt;div class=&quot;tooltip-title&quot;&gt;' + (formatUtil.encodeHTML(treePath.join('.')).replace(&quot;.[&quot;,&quot;[&quot;).replace(&quot;.[&quot;,&quot;[&quot;).replace(&quot;.[&quot;,&quot;[&quot;).replace(&quot;.[&quot;,&quot;[&quot;)) + '&lt;/div&gt;',
					'&lt;div class=&quot;tooltip-title&quot;&gt;' + datas + '&lt;/div&gt;',
					'Memory Usage: ' + formatUtil.addCommas(value) + ' 字符占用',
				].join('');
			}
		},
	   // visualMap: [{
				//type: 'continuous',//连续型
				//dimension: 2,//对应的数组维度
				//show: false,//颜色范围选择的小工具不显示
				//color: ['#1710c0', '#0b9df0', '#00fea8', '#00ff0d', '#f5f811', '#f09a09', '#fe0300'].reverse(),//颜色过渡，可自选
			  //}],
		series: [
			{
				name: 'Memory',
				type: 'treemap',
				visibleMin: 5000,
				label: {
					show: true,
					formatter: '{b}'
				},
				upperLabel: {
					show: true,
					height: 30,
				},
				itemStyle: {
					borderColor: '#fff'
				},
				levels: getLevelOption(),
				data: diskData
			}
		]
	});

	if (option &amp;&amp; typeof option === 'object') {
		myChart.setOption(option);
	}

	
}
//update(json);


document.getElementById('btn').addEventListener('click', function(){
try{
update(document.getElementById('jsonStr').value)
}catch(e){
	//alert(&quot;代码错误,如果不是JSON问题,请联系6g3y&quot;)
	console.log(e)
}
try{
update(document.getElementById('jsonStr').value)
}catch(e){
	alert(&quot;代码错误,如果不是JSON问题,请联系6g3y&quot;)
	console.log(e)
	console.log(document.getElementById('jsonStr').value)
}
});
        &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;
</code></pre>
]]></description><link>http://screeps.com/forum/post/16355</link><guid isPermaLink="true">http://screeps.com/forum/post/16355</guid><dc:creator><![CDATA[6g3y]]></dc:creator><pubDate>Wed, 21 Apr 2021 14:51:17 GMT</pubDate></item><item><title><![CDATA[Reply to Visualization tool for Memory on Invalid Date]]></title><description><![CDATA[<p>Run JSON.stringify(Memory)</p>
<p>And Copy all to HTML , Click Button</p>
<p>I think this tool can check for memory leaks. And analyze which memory can be placed in the global. This will be useful.</p>
<p>I hope I can share it with everyone, and hope everyone can make some suggestions</p>
]]></description><link>http://screeps.com/forum/post/16356</link><guid isPermaLink="true">http://screeps.com/forum/post/16356</guid><dc:creator><![CDATA[6g3y]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Reply to Visualization tool for Memory on Invalid Date]]></title><description><![CDATA[<p>very good to use. thanks a lot!</p>
]]></description><link>http://screeps.com/forum/post/16590</link><guid isPermaLink="true">http://screeps.com/forum/post/16590</guid><dc:creator><![CDATA[PythonBeatJava]]></dc:creator><pubDate>Invalid Date</pubDate></item></channel></rss>