游戏内容管理,概念与源代码

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

    

    在这之前我要稍微介绍下XNA(微软的一套游戏开发框架,如果有兴趣可以百度一下)的素材管道,XNA有着很棒的素材处理流程,首先它很容易使用;它很容易按你的需求扩展和定制;在组装你的游戏时提供了生成工具和引擎的可选择性。众所周知当你只想专注于你的游戏的时候,还要操心构建游戏的素材基础,这可不让人舒服。而XNA Framework内容管理系统正是让你做到:专注于游戏本身,你将会像现在添加代码文件一样来添加素材。这让事情都归拢在一块,你可以有任意数量的项目,都能够在一个解决方案中组织你的整个游戏。。

 

游戏内容管理,概念与源代码

 

   它的处理过程分为俩种类型:已经处理好的内容与运行时处理的内容。

   关于具体的内容请查看:  http://msdn.microsoft.com/en-us/library/bb447745.aspx

 

  

    现在我们知道了为何需要内容管道与内容管道的大体作用 — 对我们的素材进行预处理并很好很容易的使用它们,如果你对以上内容有兴趣的话,请继续往下看,接来下我将对XNA的素材管道做一个具体的分析,并给出一套简单的素材管理实现方法与源代码。

   

    An Asset :

         Source Asset  顾名思义,它一个具体的资产,我并不了解ms build内部如何对它处理的,在Design Time中存在一个Importer模块,我更愿意把它理解成是项目管理中的那个具体文件,通过importer在导成具体实例,在以下我构思中的这套建议的内容管理框架中,我把任何一个资产都当成一个object实例,省略了引入器。

   

   Design Time:

         Importer  导入器,也许是把文件流导出成具体实例,有兴趣可以查询具体资料。

         Content DOM Types  文档内容类型,通过上一步导入器,便可以得到它。

         Content Processor 与 Processor Out Types  文档内容处理器与处理器导出类型。

         Intermediate Format  中间格式,在这之前我们得到了具体的处理器和导出类型,那么我们就可以通过处理的方法把资产编译成中间格式,其中的一点好处就是只要我们实现了读取方法,就可以再任何平台上使用这种资产,我相信任何平台都能做IO吧。

 

   Game Runtime:

         Content Loader 内容读取器,我相信这个就没什么好解释的了,具体还是我们实现的方法与编译时的配上对,当然一些让读取更加方便的方法什么的都要有,性能什么的越快越好 ^ ^。

 

 

  稍微解释了下,这个流程图,那么我们现在开始进入正题,如何去实现这套流程来为我们的项目进行服务。

         

          游戏内容管理,概念与源代码

 

 

 

 

    相对XNA不同的是,XNA在处理内容时比我提供的更加方便,XNA可以选择任意的导入器(Importer)在选择处理器(Processor)进行处理,它可以让一个内容使用多种方法去编译成中间码,而我提供的这套简单的内容处理器是在开始时对内容管理器进行初始化,初始一些我们所需要用到的处理器类型。

           游戏内容管理,概念与源代码

在添加处理器后我们使用(处理成默认类型资产中间码)

        游戏内容管理,概念与源代码

或者(处理成指定类型资产中间码)

游戏内容管理,概念与源代码

    这个处理成指定类型中间码,只是在写入的流中,添加了一个Type的fullname,在runtime load时,会通过一个方法把它读出来并转换成该类型,取得该类型读取器读取返回一个stream流,实际上更像是挂羊头卖狗肉,不过这个简单的内容管理器就勉勉强强的用下就好了,在未来也许我会去完善它。

 

    现在我们开始第一步,一个asset source,在这里我选择了一个位图

     var bitmap = Bitmap.FromFile(AppDomain.CurrentDomain.BaseDirectory + "1.jpg");

    有了资产源,并且我们之前添加了bitmap的处理器 –ImageProcessor

     游戏内容管理,概念与源代码

现在我们开始处理这个bitmap,让它编译成我们需要用到的中间码并返回stream流,这里的typeof(Textur2D),是让它在runtime load时用支持Textrue2D类型的读取器对该流进行读取并返回Texture2D实例。

    var stream = ContentPiplineManager.Process(bitmap, typeof(Texture2D));

           

游戏内容管理,概念与源代码

游戏内容管理,概念与源代码

 

 

 

 

   Procss方法,并结合之前ImageProcessor 我们清楚了处理的全过程,填入处理器到管理器内,并且根据处理的数据类型得到支持的处理器后处理,比如 —

       ImageProcessor : ContentProcessor<Bitmap> 中 泛型被指定了Bitmap

       ContentProcessor<T> 继承了 ContentProcessor 而它的构造函数是需要一个Type参数,在使用ContentPipeline.AddProcessor时,会得到该Type并添加到对类型支持中。

       我们在处理Bitmap时,它的类型便是ImageProcessor的目标类型。

 

    这时我们已经或得到了中间码的数据流,接下来我们把它储存成一个我们的文件,在content writer中有一个WriteMrfHeader(Stream)方法,是在我们处理好的流中写入头信息,比如可以写该文件是否被压缩,是否支持某某平台,是否XXX之类的,一切你需要用到的。

   游戏内容管理,概念与源代码

   现在我们得到了刚才储存的文件,现在我们在尝试下 ContentManagr.Load方法。

游戏内容管理,概念与源代码

   manager经过了一系列曲折得到texture2d读取器(在这里也可以不填入<T>,可以直接使用Load,但是它会返回一个object 还需要转换过去)读取中间码并返回了一个texture2d实例.

          游戏内容管理,概念与源代码

 

  对于读取器和处理器中的重用我使用了一个TestObject做了测试,首先看下它的结构。

  游戏内容管理,概念与源代码

  一个int,一个string,和一个texture2d 其中除了基础类型外texture2d处理器和读取器是我们刚才已经实现过的,现在我要在编写一个TestObjectProcssor时重用到Texture2Dprocessor。

   游戏内容管理,概念与源代码

  在写入时,只需要用到WriteObject(object)便可,如果存在该类型处理器将会自动处理,不存在则会抛出一个ContentProcessorException错误,同样读取器也是相似的代码便可重用其他类型读取器。

 

  写到这里这套简单的内容管理器大体便已讲完了,当然我想真正的内容管理器的功能应该更酷更炫一些,比如多线程读取内容(读取性能并不会提高),预约读取内容和读取网络内容和我忽略掉的XNA素材管道其他的知识等等等,这些这么酷的东西涉及到很多,我会慢慢的整理资料并且共享我学习到的事物。

     

 

           Simple Content Manager Source

转载于:https://www.cnblogs.com/seelife/archive/2012/06/17/2552362.html