登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

[转]XNA Framework Content Pipeline简介  

2009-12-01 18:02:48|  分类: Game |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    让我们来谈谈XNA Game Studio Express产品中的另外一块——也就是,XNA Framework Content Pipeline(XNA框架素材流水线)。我在Gamefest的幻灯片里注意到,对XNA Framework Content Pipeline的最佳描述是:

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

    这可能没法告诉你关于这项技术你需要知道或者想知道的一切。所以还是让我们试着从头开始吧。

    素材(content)是如今的游戏中很大的一个组成部分,将素材导入游戏并不容易——事实上,相当棘手。不管你是要找一个导出软件(exporter),还是要找一个合适的工具来辅助导出软件,你都会面临许多问题。之后你还得找工具来处理这些素材,然后用这些工具来为你的游戏创建数据。你还需要担心这些素材是不是能在你的游戏里正常显示。我总结起来看上去很快,但这有一大堆工作要做。事实上,大型的工作室,仅仅是将这些结构摆布到位,都有专门的人员来处理。

    有了XNA Framework Content Pipeline,过程就变得不同(更好)了。它更易用,有高度的扩展性,能根据你当前的工作进行定制,当你要把游戏拼接起来时,对你使用的工具或者引擎,它都给你更多的选择。我们都知道,其实你更想把精力放在你的游戏本身上面,去创建一个素材架构并不激动人心。XNA Framework Content Pipeline就是来让你做到这点的:专注开发你的游戏!

    最先值得讨论的事情之一就是你如何在游戏中运用你的素材。有了XNA Framework Content Pipeline,你的素材是在Visual C# Express内进行管理的。你将会像现在添加代码文件一样来添加素材。这让事情都归拢在一块,你可以有任意数量的项目,都能够在一个解决方案中组织你的整个游戏。你将能为你的素材设定行为,比如它所使用的导入导出工具。(很快我们会展开这个话题!)

    XNA Framework Content Pipeline是由很多不同的组件组成的。我们谈到的每一个组件,我都会用它的(正规)名字。熟悉这些术语能让你更好地理解XNA Framework Content Pipeline。

    当你第一次添加你的素材的时候,你需要选择一个导入工具(importer)。导入工具负责接收数据,并且将其标准化(normalize)。这意味着你不必再担心向你的素材面向哪个方向,或者在你创建素材的工具中哪个面是朝上这样的问题。导入工具接收你保存或者从素材创建工具中导出的文件,将它们导入到Visual C# Express中。随着你逐渐理解这个系统,你会清楚这么做的原因。但我想指出的是,我们更关心的是文件中的数据。换句话说,我们不会被创建这些数据的素材创建工具所束缚。

    那么在XNA Game Studio Express V1中现有的导入工具有哪些呢?来看一下这个小巧的图表。

[转]XNA Framework Content Pipeline简介 - 秒大刀 - 秒大刀的城堡

    你很可能熟悉这些导入工具中的大多数,但有一个值得一提——Autodesk FBX。FBX是一种转移3D(3D transport)文件格式,你可以用它在多个不同的素材创建工具中转移3D场景中的数据。不仅多数商业3D软件支持FBX,很多共享和免费软件也支持这种格式。除此以外,我们花了很大的精力来挑选可以被多种工具使用和读写的格式。

    在导入工具完成它的任务以后,数据就存在了我们的素材DOM(Document Object Model,文件对象模型)中。DOM这个术语用来代表一组类或者一个模式(比如一个XML文件)。数据被牢牢地保存在素材DOM中,就像打字生成的数据一样稳妥。这意味这数据是由一种为人熟知的格式保存的。比如说,一组(同样的)向量或者贴图数据,不管它们来自于什么样文件,(在XNA中)它们看起来都是一样的。这一点对下一步的正常工作至关重要。这个文件可以以XML文件导出到硬盘来除错,但它是“缺失”的,意味着导入工具仅仅保存它所关心的数据。

    处理工具负责从素材DOM中接收数据,创建你在运行时需要的使用的对象。这个对象可以简单到像一个模型,也可以复杂到像你游戏的多重处理单元(multiple processor)。XNA Framework Content Pipeline在发布时包含一组处理工具,比如Model(带有贴图的简单对象),Texture2D(图样,或者同Model结合使用),以及Effect(用来处理Model的材质)。这意味着你再也不必担心,向量缓冲或者三角条纹之类的问题,但你可能仍需要对于素材更大的灵活性,因为你的游戏可能不止是靠简单模型搭建起来的。

    这里有一个我所讲这些的例子。如果你在创作一款竞速游戏,你很可能要一些素材来组成赛道。你可能希望赛道有各种各样的数据,比如起终点,计时点的位置,决定赛道路径的曲线,你可能写一个简单的处理工具来消化所有的这些数据,然后“吐”出一个赛道对象来。是的,你的引擎需要理解什么是赛道对象,但是处理工具为你所使用的任何种类素材提供了高度的灵活性和定制性。

    处理工具也被设计得易于改写,易于共享和重用。记得我说过处理工具从素材DOM中提取数据这一点是很重要的么?那是因为你的处理工具可以忽略文件的格式来工作。因为所有的数据都是以同样的格式来保存的,你不必担心要为.x或者.tga文件来重新定制一个处理工具。此外,你还有辅助的函数,来帮助你操作和从素材DOM中生成新的数据。如果你用过D3DX,那么这些如出一辙的函数一定会让你似曾相识。生成mipmaps(制作一个更小版本的图片)就是一个简单的例子。

    由编译协调工具(build coordinator)来处理的素材编译同样是我们系统中重要的一部分。因为你的素材是在Visual C# Express中,当你点击编译的时候,你所有的素材都会被编译,保存在硬盘上,以备你在运行时使用。我们还提供了素材的增量(incremental)编译。这意味着,如果你修改了一块贴图,我们只会重新编译使用到这块贴图项(item)。

    最后,你需要将这些数据带回到你的游戏里。这是Content Manager(素材管理工具)的任务。这个工具是用来在不涉及到太多的细节的情况下,快速加载素材(assets)的。它会自动处理这些细节,比如确保所有相关的素材在同时加载。这篇介绍仅仅是作为一个概论,下面是一些代码,来展示这一切都是多么地简单!
        ContentManager myManager = new ContentManager(GameServices);
        model = myManager.Load
<Model>("ship");

    有时描述一件事情的时候,最好有些什么东西看看,所以我在这里放了一个表,展示这些部分是如何被拼接在一起的:

[转]XNA Framework Content Pipeline简介 - 秒大刀 - 秒大刀的城堡

    扩展性同样是XNA Content Pipeline中很重要的一部分。所有我们谈到的组件,你都可以进行扩展。我们会在另外的文章里再做更多的介绍。

    [译注:略去当时作者针对Content Pipeline在beta期间的相关部分。]

    最后,作为额外的奖赏,我在这里放了一段XNA Framework Content Pipeline的短小的演示。我在Gamefest上展示了这段视频,它并没有太多地深入到代码里——已经有太多的文章在谈代码了——但它仍然展示了XNA Framework Content Pipeline的运行,能给你一个整体的印象。

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

    我希望这些能够照亮XNA Game Studio Express的另外的角落。随着时间的推移,我们会有更多的技术文章,但我想从一篇概论开始,因为有着太多的新概念需要掌握。

 

译文原地址:http://xnachina.blogspot.com/2007/09/xna-framework-content-pipeline.html (注:链接可能已经过期,本文也是从Google快照中挽救过来的)

原文地址:http://blogs.msdn.com/xna/archive/2006/08/29/730168.aspx

推荐阅读:http://msdn.microsoft.com/en-us/library/bb203887.aspx



20091201

XNA 3.1 Content Pipeline结构图

原文地址:http://blogs.msdn.com/shawnhar/archive/2009/06/15/content-pipeline-types-updated.aspx

缩略图中的标准资源编译器可以参考《Standard Importers and Processors

 


20100223

    今日看到一篇《XNA-Content Pipeline》,对XNA Content的一些观点讲的比较透,其中一些重要的信息摘录如下:

    XNA从读入原始数据开始就做了一连串的工作,最终将档案转成xnb,其流程如下:

Source File

Content Importer

DOM Object

Content Processor

Game Object Model

ContentTypeWriter

XNB file

ContentTypeReader

Game Object

读入源文件后会经过Content Importer转换成DOM Object,此步骤主要专注于将源文件转成我们需要的格式(对象),

再经由Content Processor转换成Game Object Model,这里主要的工作就是处理成我的想要的效果,

最后被ContentTypeWriter存成xnb文件

而游戏执行时期,会由ContentTypeReader将xnb文件读入。

文章《XNA-使用xml》中讲到xml已经有固定格式,我们不用再对xml文件做特殊处理。对于游戏内使用的方式,或是说需要用到此xml的对象却是程序设计者自定义的对象,所以只需要写ContentTypeWrite和ContentTypeReader。

 

关于XML-Content可以参考:

    《XML and the Content Pipeline

    《How to use XnaContent XML Files

    《Customizing IntermediateSerializer》Part 1, Part 2

    另外有一个开源的序列化辅助库“Karvonite - Agile Persistence Framework” http://code.msdn.microsoft.com/karvonite     (网易博客在这里有个bug,如果加上超链接,则文章发布后链接会自动被转换为“http://co%3cwbr%3ede.msdn.microsoft.com/karvonite”,神了)

  评论这张
 
阅读(2078)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018