Away3D 的实体收集器流程1

View3D 顾名思义 它就是一个3D视口,视口的默认值是无穷大的,即相当于“窗口”是无限大的,我们看到的将是外面的所有景物
即flash尺寸是视口的有效视域.传统电视的高宽比为4:3,现在的高清电视的高宽比为16:9,你也可以如此这般地去设置。
它是一个Sprite 的子类。主要用于创建 3D场景 相机 及渲染。相信很多人都和我一样在想
View3D 它究竟做了什么?很多人估计想都不用想可以回答这个问题 “渲染”!那么它是如何渲染的?除了渲染它还干了什么?
带着这些问题打开 Away3d 源码 View3D.as 寻找真相。
源码打开乍眼一看几百行代码晕了。无从下手!学java 和C 的程序员都知道要运行程序先得找到main函数。同样先找找主入口吧,既然都知道它是做渲染的先看看render()函数。
下面从render()函数下手逐步分析。
以下是render()函数源码:

public function render() : void
{
     //if context3D has Disposed by the OS,don't render at this frame
     if (!stage3DProxy.recoverFromDisposal())

   {
        _backBufferInvalid = true;
        return;
     }
   
     // reset or update render settings
     if (_backBufferInvalid)
        updateBackBuffer();
   
     if (_shareContext && _layeredView)
        stage3DProxy.clearDepthBuffer();

     if (!_parentIsStage)

   {
        var globalPos : Point = parent.localToGlobal(_localPos);
        if (_globalPos.x != globalPos.x || _globalPos.y != globalPos.y)

      {
           _globalPos = globalPos;
           _globalPosDirty = true;
        }
     }
   
     if (_globalPosDirty)
        updateGlobalPos();

     updateTime(); //更新本地运行时间

     updateViewSizeData();

     _entityCollector.clear();

     // collect stuff to render 收集的东西呈现
     _scene.traversePartitions(_entityCollector);

     // update picking
     _mouse3DManager.updateCollider(this);

     if (_requireDepthRender)
        renderSceneDepthToTexture(_entityCollector);

     // todo: perform depth prepass after light update and before final render
     if (_depthPrepass)
        renderDepthPrepass(_entityCollector);

     _renderer.clearOnRender = !_depthPrepass;

     if (_filter3DRenderer && _stage3DProxy._context3D)

   {
        _renderer.render(_entityCollector, _filter3DRenderer.getMainInputTexture(_stage3DProxy), _rttBufferManager.renderToTextureRect);
        _filter3DRenderer.render(_stage3DProxy, camera, _depthRender);
     }

   else

   {
        _renderer.shareContext = _shareContext;
       if (_shareContext)

      {
           _renderer.render(_entityCollector, null, _scissorRect);
        }

      else

     {
           _renderer.render(_entityCollector);
       }

     }
   
     if (!_shareContext) {
        stage3DProxy.present();

      // fire collected mouse events
      _mouse3DManager.fireMouseEvents();
     }

     // clean up data for this render
     _entityCollector.cleanUp();
   
     // register that a view has been rendered
     stage3DProxy.bufferClear = false;
  }

分析:
if (!stage3DProxy.recoverFromDisposal())
{
  _backBufferInvalid = true;
  return;
}
stage3DProxy 是Away3D提供一个代理类来管理一个Stage3D实例,对Context3D的常用操作进行了封装。
recoverFromDisposal() 函数对显卡驱动程序的类型进行了检测。
这个判断意思就是如果你的显卡驱动不是context3D支持的就不在此帧渲染了.

if (_backBufferInvalid)
    updateBackBuffer();
    
updateBackBuffer函数用于更新后台缓存区。

if (!_parentIsStage)
    updateGlobalPos();

如果当前的View3D所在的父容器不是Stage上那么Away就会调用updateGlobalPos()函数来更新获取全局坐标。

updateTime();函数是用来统计上一帧所渲染的时间。

好了其他的就不多废话了大家有兴趣可以去看看源码,下面重点介绍Away3D的一项重要功能实体收集器。

在updateTime函数下方有一段代码 _entityCollector.clear();表示每次在渲染的前期会清空实体收集器,然后再进行新的一轮收集。

 _scene.traversePartitions(_entityCollector);

scene 表示是当前渲染的场景。下面就跟着traversePartitions 函数一步步去跟进看看他是如何收集的。

每一个 Scene3D 在初始化的时候都会创建一个_partitions:Vector.<Partition3D>。Partition3D是一个空间的分区系统的核心。

它用于将三维场景分级成多个互不重叠的子空间,从而形成一个树型数据结构。

在Scene3D类中的 traversePartitions 函数可以看见 每次在收集的时候 都会循环_partitions 然后 调用了 Partition3D 类的

traverse 函数进行收集。到目前为止我们视乎还是没有搞清楚entityCollector到底是如何收集的。细心的朋友可能已经发现了

 traverse 函数里的 _rootNode.acceptTraverser(traverser); 这段代码。那这个_rootNode 到底是啥呢?下一节我再深入的探讨。

 

转载于:https://www.cnblogs.com/ch06src/p/3874360.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Away3D傻瓜系列教程(3)》是一本与Away3D技术相关的教程书籍,旨在以简明易懂的方式向读者介绍Away3D引擎的基本概念和使用方法。 该教程第三部分主要涵盖了一些高级主题,帮助读者深入了解Away3D的强大功能和应用。首先,教程介绍了顶点动画的概念和实现方法,通过示例代码演示了如何在3D场景中创建逼真的动画效果。然后,教程介绍了光照和阴影的原理与实现,帮助读者了解如何在场景中模拟真实的光照效果,并创建逼真的阴影效果。 教程的下一部分涵盖了粒子系统的使用方法。它详细介绍了如何使用Away3D的粒子系统功能创建各种各样的粒子效果,例如烟雾、火焰和爆炸效果。通过学习这一部分, 读者将能够使用粒子系统为3D场景增添更加生动和逼真的效果。 此外,教程还介绍了相机控制和用户交互的方法。通过学习这些内容,读者将能够掌握如何自由控制相机的位置和视角,以及如何通过鼠标和键盘与场景进行交互。 《Away3D傻瓜系列教程(3)》对于想要深入学习Away3D技术的读者来说是一本很有价值的教程书籍。它通过简单明了的讲解和丰富的示例代码,帮助读者逐步掌握和应用Away3D引擎的核心功能,从而能够创建出令人印象深刻的3D场景和动画效果。无论是新手还是有一定经验的开发者,都可以通过这本教程书籍获得宝贵的学习经验和技巧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值