Away3D 的实体收集器流程2
带着上次的疑问我们继续探讨Away3D 的渲染流程。
在Away3D中所有的显示对象都是继承Object3D 的我们先看看显示对象和继承关系。
Object3D
|---ObjectContainer3D (3D显示容器)
|---Entity (所有的3D实体对象的抽象基类)
|---Mesh (网格对象)
|---Camera3D (摄影机[非显示对象])
|---SegmentSet (线段的集合可以绘制线)
|---Sprite3D (公告板始终面向摄像机)
以上显示对象中最常用的 是 Mesh 我们想看看Mesh 的结构。
Mesh 是由多个SubMesh 组成的,每个 SubMesh 可以拥有自己的 Geometry 和 Material。很多朋友说 Away3D 的mesh不支持多材质,其实是错误的。
你可以对 Mesh进行改造单独设置他的 SubMesh 即可。Geometry 和 Material这里占时不多说了大家自己用用就知道了。 每个Mesh都有一个MeshNode。
我们要寻找的答案也就在这里面。
我们搞清楚了显示对象下面就来了解下这些显示对象是如何被addChild 到舞台的。
ObjectContainer3D 类中实现了一个 addChild 的函数。在这个函数里大部分代码都是在做对象的管理,关键一步是 child.scene = _scene;
ObjectContainer3D 只是做了赋值处理并没有真正意义上的把对象添加到场景上。Entity类重写了scene的set 函数。
override public function set scene(value : Scene3D) : void
{
if (value == _scene)
return;
if (_scene)
_scene.unregisterEntity(this);
// callback to notify object has been spawned. Casts to please FDT
if (value)
value.registerEntity(this);
super.scene = value;
}
重写的scene set 函数 调用了 registerEntity 函数 把当前对象最为参数传递给了scene3d.由scene3d调用了添加到Partition3D中了。
但是添加到 Partition3D 中的时候并不是直接的添加当前对象 而是 添加了 当前对象的 node对象。至于为什么我们后面再说。
先回过头来看看之前收集器进过Partition3D 的 traverse函数。
if (_updatesMade)
updateEntities();
当有新的显示对象添加到了Partition3D中 Partition3D 将 _updatesMade自动设置为true了 这时候开始跟新显示对象以及该显示对象的子对象。
最后把所有要显示的对象的Node 都添加到了_rootNode中。然后开始 调用 acceptTraverser函数。前面说到了 Partition3D 中并不是直接的添加当前对象 而是 添加了 当前对象的 node对象。原因是Away3d 为了分离渲染和对象收集 把视锥剔除的逻辑在 node 中实现了。而对象本身是没有这个逻辑的。再进一步的debug 跟进发现进入了enterNode函数 开始计算视锥剔除。如果当前显示对象不在 视锥范围内 将不会被渲染。
下面再补充一下Away3D在渲染的过程中会先检查对象是否被 visible=false;如果是false 将不会被渲染。很多人在实际开发中把TextureMaterial 中的 alpha 设置等于0;但实际上这个显示对象还是会被渲染的。
Away3D 的实体收集器流程2的更多相关文章
- Away3D 的实体收集器流程1
View3D 顾名思义 它就是一个3D视口,视口的默认值是无穷大的,即相当于“窗口”是无限大的,我们看到的将是外面的所有景物即flash尺寸是视口的有效视域.传统电视的高宽比为4:3,现在的高清电视的 ...
- 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 ...
随机推荐
- nullptr和NULL 区别
注:本文内容摘自网络,准确性有待验证,现阶段仅供学习参考.尊重作品作者成果,原文链接 :http://www.2cto.com/kf/201302/190008.html 1.为什要有nullptr ...
- Chrome退出全屏问题
最近做了一个号称很炫的B/S展示软件,展示所用浏览器为Google Chrome. 要求展示时全屏,但是页面要有退出全屏按钮(液晶屏没有键盘). 搜索实现方式几乎前篇一律,即两个JS函数一个实现全屏一 ...
- IS脚本学习
OnFirstUIBefore:函数块用于第一安装应用时安装部件前所要完成的任务.一般在这里进行下列设: 1. 设置屏蔽 2. 显示欢迎信息,软件协议书或关于软件安装的其他说明信息 3. 从用户处获取 ...
- ajax请求遇到服务器重启或中断
常会有不断轮询发送ajax请求,处理一些业务的场景. 要考虑到: 1. 服务器重启,中断,恢复后仍然能恢复正常业务处理. 服务器重启过程中,再次发送请求,请求状态将变为net::ERR_CONNECT ...
- WPF Navigation导航
WPF导航这个话题,网上的解决方法有很多种,有点吃猪脚的感觉,弃之可惜,食之乏味. 不过还是简单聊聊吧. 常见的导航: 利用HyperLink导航,可以到某一个Page页面,也可以是外部链接,当然也可 ...
- log4j详细配置说明
log4j配置祥解 第一步:加入log4j-1.2.8.jar到lib下.第二步:在CLASSPATH下建立log4j.properties.内容如下:1 log4j.rootCategory=INF ...
- resolvconf: Error: /etc/resolv.conf isn't a symlink, not doing anything.
一.问题出现的原因 resolv.conf默认是个软链接,resolvconf默认会检查resolv.conf不是软链接就报错 默认的情况是这样的: #ls -l /etc/resolv.conflr ...
- linq 多个left join 和 sql union all -> linq union 方法
( from s in Base_SysMenus join r in Base_RoleRights on s.Menu_Id equals r.Menu_Id into temp f ...
- 关于一个简单面试题(。net)
猫大叫一声,主人被惊醒,所有的小老鼠开始逃窜. 期初想到的是事件调用方法. 在猫叫的事件中调用一对方法就可以了. 但是,当事件很多的时候 难保大家写着写着就忘记了. 总不能有 10000个人的时候调用 ...
- 使用Windbg来检查内存
Windbg是一款微软开发的调试windows代码的工具,水很深,不过使用windbg来进行clr的调试则比较简单,windbg使用之前需要进行配置. File->Symbol path-> ...