我之前解析过Starling的核心渲染流程,相比Away3D而言Starling真的是足够简单,不过幸运的是两者的渲染流程是大体上相似的;Starling的渲染是每帧调用Starling类中的render方法,类似的Away3D的渲染是每帧调用View3D类中的render方法,那我们要了解Away3D的渲染就需要从这个方法入手了。
View3D的render方法源码:
1 /** 2 * Renders the view. 3 */ 4 public function render():void 5 { 6 //if context3D has Disposed by the OS,don't render at this frame 7 if (!stage3DProxy.recoverFromDisposal()) { 8 _backBufferInvalid = true; 9 return; 10 } 11 12 // reset or update render settings 13 if (_backBufferInvalid) 14 updateBackBuffer(); 15 16 if (_shareContext && _layeredView) 17 stage3DProxy.clearDepthBuffer(); 18 19 if (!_parentIsStage) { 20 var globalPos:Point = parent.localToGlobal(_localPos); 21 if (_globalPos.x != globalPos.x || _globalPos.y != globalPos.y) { 22 _globalPos = globalPos; 23 _globalPosDirty = true; 24 } 25 } 26 27 if (_globalPosDirty) 28 updateGlobalPos(); 29 30 updateTime(); 31 32 updateViewSizeData(); 33 34 _entityCollector.clear(); 35 36 // collect stuff to render 37 _scene.traversePartitions(_entityCollector); 38 39 // update picking 40 _mouse3DManager.updateCollider(this); 41 _touch3DManager.updateCollider(); 42 43 if (_requireDepthRender) 44 renderSceneDepthToTexture(_entityCollector); 45 46 // todo: perform depth prepass after light update and before final render 47 if (_depthPrepass) 48 renderDepthPrepass(_entityCollector); 49 50 _renderer.clearOnRender = !_depthPrepass; 51 52 if (_filter3DRenderer && _stage3DProxy._context3D) { 53 _renderer.render(_entityCollector, _filter3DRenderer.getMainInputTexture(_stage3DProxy), _rttBufferManager.renderToTextureRect); 54 _filter3DRenderer.render(_stage3DProxy, camera, _depthRender); 55 } else { 56 _renderer.shareContext = _shareContext; 57 if (_shareContext) 58 _renderer.render(_entityCollector, null, _scissorRect); 59 else 60 _renderer.render(_entityCollector); 61 62 } 63 64 if (!_shareContext) { 65 stage3DProxy.present(); 66 67 // fire collected mouse events 68 _mouse3DManager.fireMouseEvents(); 69 _touch3DManager.fireTouchEvents(); 70 } 71 72 // clean up data for this render 73 _entityCollector.cleanUp(); 74 75 // register that a view has been rendered 76 stage3DProxy.bufferClear = false; 77 }