前言
在了解了主循环之后,接下去看的就是引擎的渲染部分~
RenderCommand
首先要提的是RenderCommand这个类,它主要是将每个对象的渲染函数进行封装,并加到渲染队列里面。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| var RenderCommand = (function () { function RenderCommand() { }
RenderCommand.prototype.call = function (renderContext) { var o = this; if (o.callback) { o.callback.call(o.thisObject, renderContext); } }; RenderCommand.prototype.dispose = function () { this.callback = null; this.thisObject = null; RenderCommand.__freeList.push(this); };
RenderCommand.push = function (callback, thisObject) { var cmd; if (RenderCommand.__freeList.length) { cmd = RenderCommand.__freeList.pop(); } else { cmd = new egret.RenderCommand(); } cmd.callback = callback; cmd.thisObject = thisObject; egret.MainContext.__DRAW_COMMAND_LIST.push(cmd); }; RenderCommand.__freeList = []; return RenderCommand; })(); egret.RenderCommand = RenderCommand;
|
渲染流程
渲染流程的主要代码都在这两个函数里面。
- MainContext.prototype.renderLoop
- MainContext.prototype._draw
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| MainContext.prototype.renderLoop = function (frameTime) { ... var context = this.rendererContext; context.onRenderStart(); context.clearScreen(); MainContext.__DRAW_COMMAND_LIST = []; MainContext._renderLoopPhase = "updateTransform"; stage._updateTransform(); ... this._draw(context); ... }; MainContext.prototype._draw = function (context) { var list = MainContext.__DRAW_COMMAND_LIST; var length = list.length; for (var i = 0; i < length; i++) { var cmd = list[i]; cmd.call(context); cmd.dispose(); } };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| DisplayObjectContainer.prototype._updateTransform = function () { var o = this; if (!o._visible) { return; } if (o._filter) { egret.RenderCommand.push(this._setGlobalFilter, this); } if (o._colorTransform) { egret.RenderCommand.push(this._setGlobalColorTransform, this); } var mask = o.mask || o._scrollRect; if (mask) { egret.RenderCommand.push(this._pushMask, this); } _super.prototype._updateTransform.call(this); if (!this["_cacheAsBitmap"] || !this._texture_to_render) { for (var i = 0, length = o._children.length; i < length; i++) { var child = o._children[i]; child._updateTransform(); } } if (mask) { egret.RenderCommand.push(this._popMask, this); } if (o._colorTransform) { egret.RenderCommand.push(this._removeGlobalColorTransform, this); } if (o._filter) { egret.RenderCommand.push(this._removeGlobalFilter, this); } };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| DisplayObject.prototype._updateTransform = function () { var o = this; if (!o._visible) { return; } o._calculateWorldTransform(); if (egret.MainContext._renderLoopPhase == "updateTransform") { if (o.needDraw || o._texture_to_render || o._cacheAsBitmap) { egret.RenderCommand.push(this._draw, this); } } };
|
DisplayObject.prototype._draw
1 2 3 4 5 6 7 8
| DisplayObject.prototype._draw = function (renderContext) { ... this._render(renderContext); ... };
|
从这个方法看到,真正的渲染都放在_render里面,这也是官方文档给出 下面这些提示的原因。
1 2 3 4 5 6
| * 任何继承自DisplayObject的类都必须实现以下方法 * _render(); * _measureBounds() * 不允许重写以下方法 * _draw(); * getBounds();
|
小结
整个渲染的流程,差不多就是这个样子。Bitmap、Sprite、MovieClip之类的对象,它们的_render方法都不大一样,这里就不展开讨论了。大家可以自己去看它们的js源码。
转载本站文章请注明作者(xtutu)和出处 xtutu