WorldWind系列六: 渲染过程解析篇
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WorldWind系列六:渲染过程解析篇
来源:博客园作者:无痕客
今天主要是分析学习了Render问题,搞明白了WorldWind中整个Render绘制处理过程。其中关键类是:
RenderableObject.cs ,RenderobjectList.cs.
WW中所有需要绘制的对象都RenderableObject,WW的各功能的执行显示都是不断地调用相应的Render方法。
1.RenderableObject整个绘制对象继承图
WW绘制都是通过RenderableObject类,将所有的要绘制对象都看做是RenderableObject,从而统一了整个系统WW的绘制对象的绘制过程。
2.RenderableObjectList也继承自RenderableObject,先看看它的继承图
摘录内容:
“实际的点线,平面纹理等渲染对象都是从RenderableObject继承,最终的渲染实现也是在从它继续下来的类中,RenderableObjectList的成员m_children (protected ArrayList m_children = new ArrayList();)包含WW中所有的渲染对象,绘制过程中按如下的优先级进行:
public enum RenderPriority
{
SurfaceImages = 0,
TerrainMappedImages = 100,
AtmosphericImages = 200,
LinePaths = 300,
Icons = 400,
Placenames = 500,
Custom = 600
}
这里对WW调试过程中的m_children的成员做个截图,需要注意的是m_children的成员大部分还是RenderableObjectList对象,向下包含的层次很多,但只有最底层的从RenderableObject继续的对象才是渲染的最终实现。”摘自:
/s/blog_467b6cd601008mmd.html~type=v5 _one&label=rela_nextarticle
RenderableObjectList可以简单看作RenderableObject对象的集合,但实质上存储RenderableObject对象集合的仅仅是其中的属性m_children,它有很多特有的针对m_children管理的方法,如:Add(RenderableObject ro)、Remove(RenderableObject layer)。RenderableObjectList里通过
该Timer.Elapsed 事件实现了自动刷新渲染的功能。这里还有个知识点,我们可以学习一下,就是Timer.Elapsed 事件使用,请参考MS的
/zh-cn/library/system.timers.timer.elaps ed(VS.80).aspx。
3.下面让我们一起看看WW实现渲染绘制的整个代码调用流程,主要分为两部分:一、获取到所有的要绘制对象集合,二、绘制所有要绘制的对象。分析入口还是从WorldWind.cs的MainAppliaction()方法开始的。
3.1获取到所有的要绘制对象集合,存放到World.cs中的RenderableObjects属性里
MainAppliaction()中调用OpenStartupWorld()
——》2974行OpenWorld( curWorldFile );调用了private void OpenWorld(string worldXmlFile)方法
——》3049行worldWindow.CurrentWorld =
WorldWind.ConfigurationLoader.Load(worldXmlFile, worldWindow.Cache);调用了CongfigurationLoader.cs的public static World Load(string filename, Cache cache)方法
——》CongfigurationLoader.cs 的110行
newWorld.RenderableObjects = getRenderablesFromLayerDirectory(layerDirectory, newWorld, cache); 看代码
加载渲染对象代码
public static World Load(string filename, Cache cache)
{
Log.Write(Log.Levels.Debug, "CONF", "Loading " + filenam e);
// get the World Wind Settings through reflection to avoi d changing the signature of Load().
Assembly a = Assembly.GetEntryAssembly();
Type appType = a.GetType("WorldWind.MainApplication");
System.Reflection.FieldInfo finfo = appType.GetField("Set tings", BindingFlags.Static | BindingFlags.Public | BindingFlags.GetF ield);
WorldWindSettings settings = finfo.GetValue(null) as Worl dWindSettings;
XmlReaderSettings readerSettings = new XmlReaderSettings