Content Pipeline 

2006-12-31 14:26 发布

引擎学习交流 /[PC游戏编程]
4420 0 0

Content Pipeline 译注:以后该名词本人统一翻译成素材管道,它应该是XNA管理游戏里的图像等资源的一个框架,因为官方也没给出具体中文翻译所以只是暂定。

 

   关于XNA Game Studio Express我们已经讨论过了。前几天Mitch的文章里对XNA Game Studio的使用讲了很多。现在让我们来谈谈XNA Game Studio产品的另一部分,也就是XNA Framework素材管道。如同我在我的Gamefest 幻灯片里说的,XNA Framework的素材管道可以用下面的话来描述:

   “一个由C# Express管理的可扩展素材处理框架。”

   如果你想要更全面的了解这项技术,那么就让我从头开始讲述。

 

   目前素材(Content)是游戏的很大一部分,而在游戏中使用素材并不简单,实际上是很别扭。有如此多的问题要处理,无论怎样你始终要确定使用某种导出器(exporter,程序中素材的输出模块)或者要找到合适的工具来支持所选择的导出器。然后你不得不使用一些工具来处理素材,接着使用其它的工具来讲素材转化为你的游戏中可用的数据形式,你还要为正确的载入素材操心。实现了以上步骤你才能使你的素材在游戏中正确的呈现。别看我总结的很快,但是这里要作很多的工作。实际上大型的游戏工作室,有一批人专门从事这一块的专业工作。

   使用XNA Framework素材管道,这样的处理过程就有点不同而有所改进。首先它很容易使用;它很容易按你的需求扩展和定制;在组装你的游戏时提供了生成工具和引擎的可选择性。众所周知当你只想专注于你的游戏的时候,还要操心构建游戏的素材基础,这可不让人舒服。而XNA Framework内容管理系统正是让你做到:专注于游戏本身。

   首先需要来谈一谈的是在你的游戏中如何使用素材。通过XNA Framework素材管道,你的素材在Visual C# Express中得到管理,所以你加入素材和加入代码文件的操作类似。这可以帮助你保持系统的整合,而且让你可以在一个解决方案里组织它们,或者如果你愿意放在几个工程里。(译注:这里的名词应该是对应的Visual Studio开发软件)你可以为你的素材设置动作(actions)例如使用什么样的导入器和导出器等等。(更多的设置也很容易!)

   许多不同的组件构成了XNA Framework 素材管道。每一个组件都有一个很容易理解的专业名称。熟悉这些专业名称可以帮助你更好的理解XNA素材管道。

   当你第一次加入你的素材的时候,你需要选择一个导入器(Importer)。导入器的作用在于得到数据和预处理(normalizing)数据。这就意味着你可以不必在意一些细节。例如你的素材要发往何处,以及素材创建工具怎么样可以得到最优的素材。导入器从保存好的文件或者是你的素材生成工具中得到素材,然后把它们导入到Visual C# Express中。随着你对这个系统其它部分的了解深入,你就会明白这样做的理由。但是在这里我要指出我们更多的是关注文件中的那些数据。也就是说,这里我们并不要在意用来生成数据的素材制作工具。

 

   那么在第一版的XNA Game Studio Express中导入器是那些呢?请看下面的列表图表。

 

   其中大多数的导入器你可能已经熟悉了,但是这里的Autodesk FBX值得拿出来介绍一下。FBX是一种可以在许多不同的素材生成工具中使用的3D场景文件存储格式。无论商业软件还是共享软件和自由软件都支持FBX格式。我们试图挑选出一个种能被大多数工具处理和改写的格式。

   在导入器完成了它的工作以后,数据保存在我们的素材DOM(文档对象模型?)中。DOM可以很容易的用来生成一系列类或者一个模式(schema(如同一个XML文件)。通过DOM中的内容,数据成为一种强类型的数据。这意味中数据以一个明显可知的格式描述。这样一系列的顶点或者贴图数据看起来是同样的,而不论文件是从何而来的。这一点对于下一步工作的有效进行尤为重要。为了便于调试这个文件也可以以XML的形式写到磁盘上。不过这样做比起原始文件的信息来会有些“损耗”,因为导入器只会存储那些它关心的数据。

   处理器(processor)用来从素材DOM中的得到数据,然后给你创建一个可以在运行时使用的对象。该对象可以简单到就是一个模型(model),或者复杂到你的游戏中的多个处理器(processors)。XNA Framework 素材管道包含了一些封装好的处理器:例如模型(model用来表示简单的物体和贴图),Texture2D(用做精灵(sprites)或者和一个模型联合),还有特效(用来处理你的模型材质)。这样你不再需要关心例如顶点缓存或者是triangle strips(三角多边形)。同时也许你的游戏世界并不是建立在简单的模型上的,你也可以得到对素材的必要的更大弹性。

   这里有一个这方面的例子。例如你正在组建一个竞速游戏,你会有一些用来组成赛道的素材文件。在这样的赛道(译注:一个整体)中,你会包含各种类型的数据,例如起点/终点,检查站的地点以及一个赛道的路径。这些数百个模型不间断的出现的赛道中,而你可以简单的写一个处理器处理这所有的数据并生成一个赛道对象。是的,尽管你的引擎还是需要“理解”赛道对象是什么,但是处理器为你想使用的素材提供了高度的弹性和可定义能力。

   处理器同时被设计为可以简便的进行改写,分享和重用的。记住处理器是从素材DOM中导出数据的。理解这点之所以重要因为你的处理器将不在意文件来源和格式。在这一层因为所有的数据以相同的格式存储,你不需要对你的处理器针对x. .tag文件精心特别的设置。另外你还可以通过一些类似D3DX的函数来获得辅助功能。这里可以去看一个生成微缩的例子。(译注:不太知道作者指的是什么。)

   素材编译也是我们的系统中的一个重要部分,它由编译的辅助模块处理。在Visual C# Express中,当你点击编译,你的素材都会被编译保存在磁盘上以准备在运行时使用。我们也提供一个增量性的素材编译。这意在味这如果你改变了一个贴图,我们只要重编译这一部分用到的材质。

   最终,你需要用某种方法在你的游戏中得到这些数据。这里你可以使用Content Manager。该组件设计用来快速有效的载入资源。它处理了在载入过程中的大量细节问题,例如关联的资源要同时载入等等。这篇文章也只是一个概述,下面的简短代码演示了Content Manager是多么的便捷。

ContentManager myManager = new ContentManager(GameServices);

model = myManager.Load<Model>("ship");

有时候图表更能够说明问题,下面这张图表示了各部分的组成关系。

 

   扩展性也是XNA素材管道的一个重要方面。我们以上所讨论的所有组件都是被设计为可以扩展继承的。在以后的文章中我们会进一步谈到。

   请注意XNA Framework素材管道是一项庞大而全新的技术。尽管我们有很多人已经在上面付出了艰辛的劳动,但在星期三的beta版中它还是存在一定问题。所以XNA Framework素材管道还没有包含在beta版里,直到830号你才能下载它。在beta版本里也可以使用素材,但是只比手动操作好一点。同时在Spacewar Starter Kit中也演示了开发人员如何使用素材管道的外部文件为素材。我们还在考虑在release版中使用其它的途径来实现这一功能,但是这都不是强制使用的。

   最后我放上了一个使用XNA 内容管理的可运行小例子作为附件。我在Gamefest中演示了这个例子,并且特别的为我们的团队blog的读者作了保存。再次说明这个demo并没有绞缠在代码上,有许多的文章讨论这些问题,它只是体现了XNA内容管理给你的一个大体感觉。

XNA Framework Content Pipeline Demo (Streaming)
XNA Framework Content Pipeline Demo (Downloadable)

   我希望XNA的这次发布让我们看到XNA Game Studio Express的另一面。随着时间的流逝我们在技术上越转越深,但是我希望再次获得一个概观的体验,因为实在是有太多的新的理念要去揣摩。

 

Michael Klucher
Program Manager - XNA Game Studio

B Color Smilies

你可能喜欢

Content Pipeline 
联系
我们
快速回复 返回顶部 返回列表