我之前解析过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 }
View Code

相关文章:

  • 2021-12-28
  • 2021-04-07
  • 2021-11-05
  • 2022-02-08
  • 2022-01-10
  • 2022-12-23
  • 2021-12-21
  • 2022-12-23
猜你喜欢
  • 2021-12-28
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-28
  • 2022-12-23
  • 2021-10-31
相关资源
相似解决方案