WorldWind系列六: 渲染过程解析篇

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档