Project1

标题: 有大神知道到底发生了啥么 [打印本页]

作者: 清澈淌漾    时间: 2022-2-7 15:28
标题: 有大神知道到底发生了啥么
Sprite每帧改变_blendColor并_refresh掉帧掉到姥姥家

我直接懵逼  就一个Sprite刷这个特效能这么卡么
作者: 仇九    时间: 2022-2-8 13:35
_blendColor这个东西吧……的确最好不要用。
当你每设置一次_blendColor时,都会执行sprite的_refresh函数(1.6.2版的rpg_core.js第4179行)。
在_refresh函数中会执行_executeTint函数(1.6.2版的rpg_core.js第4277行)。
这个函数是这样:

JAVASCRIPT 代码复制
  1. Sprite.prototype._executeTint = function(x, y, w, h) {
  2.     var context = this._context;
  3.     var tone = this._colorTone;
  4.     var color = this._blendColor;
  5.  
  6.     context.globalCompositeOperation = 'copy';
  7.     context.drawImage(this._bitmap.canvas, x, y, w, h, 0, 0, w, h);
  8.  
  9.     if (Graphics.canUseSaturationBlend()) {
  10.         var gray = Math.max(0, tone[3]);
  11.         context.globalCompositeOperation = 'saturation';
  12.         context.fillStyle = 'rgba(255,255,255,' + gray / 255 + ')';
  13.         context.fillRect(0, 0, w, h);
  14.     }
  15.  
  16.     var r1 = Math.max(0, tone[0]);
  17.     var g1 = Math.max(0, tone[1]);
  18.     var b1 = Math.max(0, tone[2]);
  19.     context.globalCompositeOperation = 'lighter';
  20.     context.fillStyle = Utils.rgbToCssColor(r1, g1, b1);
  21.     context.fillRect(0, 0, w, h);
  22.  
  23.     if (Graphics.canUseDifferenceBlend()) {
  24.         context.globalCompositeOperation = 'difference';
  25.         context.fillStyle = 'white';
  26.         context.fillRect(0, 0, w, h);
  27.  
  28.         var r2 = Math.max(0, -tone[0]);
  29.         var g2 = Math.max(0, -tone[1]);
  30.         var b2 = Math.max(0, -tone[2]);
  31.         context.globalCompositeOperation = 'lighter';
  32.         context.fillStyle = Utils.rgbToCssColor(r2, g2, b2);
  33.         context.fillRect(0, 0, w, h);
  34.  
  35.         context.globalCompositeOperation = 'difference';
  36.         context.fillStyle = 'white';
  37.         context.fillRect(0, 0, w, h);
  38.     }
  39.  
  40.     var r3 = Math.max(0, color[0]);
  41.     var g3 = Math.max(0, color[1]);
  42.     var b3 = Math.max(0, color[2]);
  43.     var a3 = Math.max(0, color[3]);
  44.     context.globalCompositeOperation = 'source-atop';
  45.     context.fillStyle = Utils.rgbToCssColor(r3, g3, b3);
  46.     context.globalAlpha = a3 / 255;
  47.     context.fillRect(0, 0, w, h);
  48.  
  49.     context.globalCompositeOperation = 'destination-in';
  50.     context.globalAlpha = 1;
  51.     context.drawImage(this._bitmap.canvas, x, y, w, h, 0, 0, w, h);
  52. };



如果是单纯设置一次sprite的_blendColor,之后不每帧都设置,那还好说,但是一直设置的话就会一直执行_refresh,一直执行_executeTint,就会掉帧。
修改sprite的其他属性,例如bitmap,frame等,也会执行_refresh……

根据你具体想实现的效果来想解决办法。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1