Egret社区
本帖最后由 lixianjing 于 2014-7-27 10:14 编辑

昨天在尝试把我写的GameUI控件库添加到Egret时,发现不管我这样设置控件的坐标,它总是偏移了大约canvas的一半宽度和高度。后来发现如果把项目默认加的那些Sprite去掉,就正常了。所以我想应该是那些sprite没正确恢复renderContext的状态。看了一下DisplayObject.prototype._draw,发现mask为空时,根本没用保存和恢复renderContext的状态。如果this._render(renderContext)修改了matrix,那就会影响后面的Sprite的坐标了。

  1.         DisplayObject.prototype._draw = function (renderContext) {
  2.             if (!this.visible) {
  3.                 this.destroyCacheBounds();
  4.                 return;
  5.             }
  6.             var hasDrawCache = this.drawCacheTexture(renderContext);
  7.             if (hasDrawCache) {
  8.                 this.destroyCacheBounds();
  9.                 return;
  10.             }
  11.             var o = this;
  12.             renderContext.setAlpha(o.worldAlpha, o.blendMode);
  13.             renderContext.setTransform(o._worldTransform);
  14.             var mask = o.mask || o._scrollRect;
  15.             if (mask) {
  16.                 renderContext.pushMask(mask);
  17.             }

  18.             this._render(renderContext);

  19.             if (mask) {
  20.                 renderContext.popMask();
  21.             }

  22.             this.destroyCacheBounds();
  23.         };
复制代码




添加了保存和恢复renderContext的状态,一切正常了。

  1.        DisplayObject.prototype._draw = function (renderContext) {
  2.             if (!this.visible) {
  3.                 this.destroyCacheBounds();
  4.                 return;
  5.             }
  6.             var hasDrawCache = this.drawCacheTexture(renderContext);
  7.             if (hasDrawCache) {
  8.                 this.destroyCacheBounds();
  9.                 return;
  10.             }
  11.             var o = this;
  12.             renderContext.setAlpha(o.worldAlpha, o.blendMode);
  13.             renderContext.setTransform(o._worldTransform);
  14.             var mask = o.mask || o._scrollRect;
  15.             if (mask) {
  16.                 renderContext.pushMask(mask);
  17.             }else {
  18.                 renderContext.save();
  19.             }
  20.             this._render(renderContext);

  21.             if (mask) {
  22.                 renderContext.popMask();
  23.             }
  24.            else {
  25.                 renderContext.restore();
  26.             }
  27.             this.destroyCacheBounds();
  28.         };
复制代码



我想这应该是个BUG。


error

error

ok

ok
分享到 :
0 人收藏

2 个回复

倒序浏览
Wander  官方团队 | 2014-7-28 10:21:47
Egret 是故意设计为在这里不 save 和 restore 以优化性能的,请问你写的控件是不是直接调用过 renderContext.drawImage 或者 RenderFilter.drawImage 了
lixianjing  登堂入室 | 2014-7-28 18:55:06
呵呵,这样啊。

是的,用了renderContext.drawImage ,那应该怎么drawImage呢?

除非Profile之后确定这里耗时明显,否则冒这个风险是值得商榷的,它带来的问题可能比解决的问题更严重。根据我开发GUI的经验的来看,绘图函数占了70%以上的时间,save/restore耗时可以忽略不计。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部