ycc-engine
Version:
Mini and powerful canvas engine for creating App or Game.
195 lines (160 loc) • 5.04 kB
HTML
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name=viewport content="width=device-width,initial-scale=1,user-scalable=0,viewport-fit=cover">
<title>性能监测-下落的二维码</title>
<link rel="stylesheet" href="../style.css">
</head>
<body>
<div class="return-btn">
<a href="../">
返回首页
</a>
</div>
<div class="tip">
<h3>示例说明:</h3>
<div>
1、这个示例用于展示框架的性能。<br>
2、设置UI数量和下落速度,再点击开始即可查看示例。<br>
3、二维码图片在下落的过程中,可以通过鼠标点击来消除它。<br>
4、舞台可见UI数量小于最大数量是正常现象,因为有部分图片已经超出了舞台。<br>
5、建议渲染UI数量保持在500左右,这样可以保证帧率稳定在60fps;如果界面的UI较多(1000+),建议通过ticker降低帧率至30fps或者更低。<br>
6、下落中的二维码是我个人公众号,试试看下落过程中能不能扫到,关注一波就更好啦!
</div>
<br>
<hr>
<div>
设置UI数量上限:<input type="number" id="max-number" value="500">
设置速度:<input type="number" id="speed" value="2">
<button onclick="onStartClick()" id="start">开始</button>
<button onclick="onStopClick()" id="stop">结束</button>
</div>
<br>
</div>
</body>
</html>
<script src="../common.js"></script>
<script src="../../build/ycc.js"></script>
<script>
// 全局的ycc,只能有一个
var global_ycc = null;
onStopClick();
function onStopClick(){
document.querySelector('#start').style.display = 'inline';
document.querySelector('#stop').style.display = 'none';
// 清空上次的绘制记录
if(global_ycc) {
document.body.removeChild(global_ycc.canvasDom);
global_ycc.ticker.stop();
global_ycc.layerManager.deleteAllLayer();
global_ycc.clearStage();
global_ycc = null;
}
}
/**
* 点击开始
*/
function onStartClick(){
console.log('开始!');
document.querySelector('#start').style.display = 'none';
document.querySelector('#stop').style.display = 'inline';
// 清空上次的绘制记录
if(global_ycc) {
document.body.removeChild(global_ycc.canvasDom);
global_ycc.ticker.stop();
global_ycc.layerManager.deleteAllLayer();
global_ycc.clearStage();
global_ycc = null;
}
// 初始化ycc及其绑定的舞台
var ycc = new Ycc();
var stage = ycc.createCanvas({width:333,height:555,dpiAdaptation:true});
ycc.bindCanvas(stage);
document.body.appendChild(stage);
ycc.ticker.start(60);
ycc.ticker.addFrameListener(update);
global_ycc = ycc;
// 新建一个图层
var layer = ycc.layerManager.newLayer({enableEventManager:true});
// 已加入舞台的img列表
var imgList = [];
// 加入舞台img的最大数量
var maxImgCount = document.querySelector('#max-number').value;
// 速度
var speed = parseInt(document.querySelector('#speed').value);
// 调试的文字
var textDebug = new Ycc.UI.MultiLineText({
content:'render:10ms max:20ms min:3ms',
rect:new Ycc.Math.Rect(0,0,ycc.getStageWidth(),20),
fontSize:'12px',
wordBreak:'break-word',
color:'red',
rectBgColor:'rgba(0,0,0,0.6)',
overflow:'auto',
ghost:true
});
// 资源是否加载完成
var hasLoad = false;
// 资源列表
var resArr = [{name:"gzh",url:"../zgh.png"}];
// 加入文字
layer.addUI(textDebug);
// 加载资源
ycc.loader.loadResOneByOne(resArr,onLoad);
/**
* 每帧的更新函数
*/
function update(){
// 保证图片能够绘制
if(!hasLoad) return;
addImageUI();
for(var i =0;i<imgList.length;i++){
var img = imgList[i];
if(img.rect.y>ycc.getStageHeight())
img.rect.y=-100;
else{
var ratio = (ycc.ticker.deltaTime/16.67);
ratio = (ratio>1?1:ratio);
img.rect.y+=Math.ceil(speed*ratio);
// img.rect.y+=speed;
}
}
// if(ycc.ticker.deltaTime>17) console.log('此帧超出',ycc.ticker.deltaTime);
textDebug.content=' 每帧心跳间隔:'+(ycc.ticker.deltaTime.toFixed(2))
+'\r\n 舞台可见UI数量:'+ycc.layerManager.renderUiCount
+'\r\n 实时绘制时间:'+ycc.layerManager.renderTime
+'\r\n 最大绘制时间:'+ycc.layerManager.maxRenderTime;
ycc.layerManager.reRenderAllLayerToStage();
}
/**
* 加入一个UI,位置随机
* */
function addImageUI(){
if(imgList.length>=maxImgCount) return;
var w = Math.ceil(Math.random()*50+40);
var x = parseInt(Math.random()*ycc.getStageWidth());
var img = new Ycc.UI.Image({
rect:new Ycc.Math.Rect(x,-100,w,w),
fillMode:'scale',
res:resArr[0].res,
ontap:function () {
var index = imgList.indexOf(this);
if(index!==-1)
imgList.splice(index,1);
layer.removeUI(this);
}
});
imgList.push(img);
layer.addUI(img,textDebug);
}
/**
* 资源加载成功
* @param resArr
*/
function onLoad(resArr) {
hasLoad = true;
console.log('数量:',maxImgCount,'速度',speed);
}
}
</script>