收藏
回答

Canvas 2D 的clip()函数有非常严重的性能问题

框架类型 问题类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本
小游戏 Bug Canvas2D clip 客户端 最新 最新

Canvas 2D 的clip()函数有非常严重的性能问题,

导致现在所有的游戏引擎(cocos2d-js,白鹭,laya)

都不推荐大家使用默认的"2D"模式,而是推荐大家使用WebGL模式.


小游戏的Canvas2D的clip()函数在,path很复杂的情况下,性能非常低下,不知道官方是否有针对Canvas2D的

Path函数进行过性能测试,实际游戏的场景是惨不忍睹的.


比如我要在主场景绘制一个不断摇摆的小人,通常这个人物的眼睛,手臂,身体,头部等,都是放在一个大图上的.

在Canvas2D模式下,我需要使用clip()函数,将这些图片分别裁剪下来,然后再贴到主场景下.

但是这样下来,主场景的帧率非常低! 完全没办法正常运行. 但是在手机浏览器下却非常流畅~


希望官网能够正视下这个问题,能够快速解决,这样Canvas2D模式才能被正常使用!




贴一个可以测试clip()函数的case,希望官方能够重视下.

 链接在:https://testdrive-archive.azurewebsites.net/Graphics/CanvasPad/Default.html

                   // Create a timer
var index = 0;
timer1 = setInterval(renderLoop, 16);
 
function renderLoop()
{
  if (index > 600) index = 0;
  index += 4;
  draw(index);
}
 
function draw(x)
{
  ctx.fillStyle = "black";
  ctx.fillRect(0, 0, 400, 500);
 
  // Create a clipping region
  ctx.save();
  ctx.beginPath();
  ctx.arc(x, x, 200, 0, Math.PI * 2, true);
  ctx.clip();
 
  // Create a white background
  ctx.fillStyle = "white";
  ctx.fillRect(0, 0, 400, 500);
 
  // Draw smiley
  drawSmiley();
  
  // Restore state
  ctx.restore();
}        
 
function drawSmiley()
{
  // Draw eye
  ctx.lineWidth = 20;
  ctx.beginPath();
  ctx.moveTo(230, 130);
  ctx.bezierCurveTo(230, 130, 230, 130, 230, 210);
  ctx.stroke();
 
  // Draw eye
  ctx.beginPath();
  ctx.moveTo(170, 130);
  ctx.bezierCurveTo(170, 130, 170, 130, 170, 210);
  ctx.stroke();
 
  // Draw smile
  ctx.beginPath();
  ctx.moveTo(100, 230);
  ctx.bezierCurveTo(100, 230, 200, 380, 300, 230);
  ctx.stroke();
 
  // Draw tongue
  ctx.beginPath();
  ctx.moveTo(219, 298);
  ctx.bezierCurveTo(278, 351, 315, 315, 277, 258);
  ctx.stroke();
}

   

回答关注问题邀请回答
收藏

2 个回答

  • damonlei
    damonlei
    2018-05-14

    感谢反馈。2d接口中path相关的接口,性能确实有问题。我们计划在未来的版本中彻底替换掉现有2d的实现。但是目前还没有准确的时间线。请持续关注。

    2018-05-14
    有用
    回复
  • 白开水
    白开水
    2018-05-14

    感谢反馈,我们会在对该问题进行讨论。

    2018-05-14
    有用
    回复
登录 后发表内容