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 到底是啥呢?下一节我再深入的探讨。
Away3D 的实体收集器流程1的更多相关文章
- Away3D 的实体收集器流程2
带着上次的疑问我们继续探讨Away3D 的渲染流程. 在Away3D中所有的显示对象都是继承Object3D 的我们先看看显示对象和继承关系. Object3D |---ObjectContainer ...
- Away3D 的实体收集器Bug
最近在改Away3D源码的时候遇到个很郁闷的问题,发现创建的Mesh 释放不掉. 分析源码发现 EntityListItemPool 类中逻辑Bug在getItem()函数中发现_poolSize 对 ...
- 万能日志数据收集器 Fluentd - 每天5分钟玩转 Docker 容器技术(91)
前面的 ELK 中我们是用 Filebeat 收集 Docker 容器的日志,利用的是 Docker 默认的 logging driver json-file,本节我们将使用 fluentd 来收集容 ...
- [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念
本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...
- 【5】JVM-垃圾收集器
通过学习了解到现在商用的JVM中的垃圾收集采用的是分代收集算法,即针对不同年代采用不同的收集算法.在JVM中,GC主要作用于堆内存中,堆内存又被划分为新生代和老年代,由于新生代对象绝大多数是朝生夕死, ...
- 垃圾收集器之:CMS收集器
HotSpot JVM的并发标记清理收集器(CMS收集器)的主要目标就是:低应用停顿时间.该目标对于大多数交互式应用很重要,比如web应用.在我们看一下有关JVM的参数之前,让我们简要回顾CMS收集器 ...
- JVM(四) G1 收集器工作原理介绍
此篇文章半原创是对参考资料中的知识点进行总结,欢迎评论指点,谢谢! 部分知识点总结来自R大的帖子,下文有参考资料的链接 概述 G1 收集是相比于其他收集器(可见 上一篇文章),可以独立运 ...
- Stream01 定义、迭代、操作、惰性求值、创建流、并行流、收集器、stream运行机制
1 Stream Stream 是 Java 8 提供的一系列对可迭代元素处理的优化方案,使用 Stream 可以大大减少代码量,提高代码的可读性并且使代码更易并行. 2 迭代 2.1 需求 随机创建 ...
- java8学习之自定义收集器实现
在上次花了几个篇幅对Collector收集器的javadoc进行了详细的解读,其涉及到的文章有: http://www.cnblogs.com/webor2006/p/8311074.html htt ...
随机推荐
- 冒泡排序(C++)
冒泡排序(C++) 冒泡排序(C++): 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换, ...
- php 连接mysql数据库并显示数据 实例 转载
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- (转)应用内存优化之OnLowMemory&OnTrimMemory
1.应用内存onLowMemory& onTrimMemory优化 onLowMemory& onTrimMemory简介:OnLowMemory是Android提供的API,在系统内 ...
- (转)JSP中四种传递参数的方法:
1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="index.jsp"?a= ...
- Unity_与android交互
Unity调用Android代码 方法一: //using让 Local Ref 回收 using(AndroidJavaClass javaClazz = new AndroidJavaClass( ...
- 禁用微信 webview 调整字体大小
原文:http://www.grycheng.com/?p=2411 微信 webview 内置了调整字体大小的功能,对于网页的可用性来说是一个很实用的功能.一些网页的字体设置过小导致用户看不清文字, ...
- Day15 HTML补充、初识JavaScript
一.上节回顾 上节回顾: HTML 头部信息:编码.title.style.link(导入css文件) 身体: 内联 块级 --->inline-block(既有内联效果又有块级效果) a标签: ...
- 横向浅谈移动技术------( 原生,混合,web --- 谁能问鼎移动开发的明天)
目前移动互联网基本采用了NativeApp.WebApp.HybridApp三种开发模式,很难说这三种模式那种更优越,目前的情况可以说是三分天下吧,不同的开发者可以根据自己的实际情况选择不同的开发模式 ...
- 网络流(最大流):CodeForces 499E Array and Operations
You have written on a piece of paper an array of n positive integers a[1], a[2], ..., a[n] and m goo ...
- java Spring使用配置文件读取jdbc.properties
Spring使用配置文件读取jdbc.properties 在beans.xml中加入两个必须的bean [html]<bean id="propertyConfigurer" ...