IxEngine开发笔记

导航

第八回 字符串库

第八回 字符串库
  游戏开发中会大量用到字符串,最普通的就是游戏界面上的各种文字了(比如按钮上的文字),还有就是在开发过程中编辑器的用户会编辑各种各样的游戏对象,通常都会为这些游戏对象起一个直观的名字,这样在用到这些对象时,可以很方便的标识它们.还有一些类似于xml标签的字符串,可以用来定义一些格式,(比如<Font:12,Color:255,0,255>,用来描述一种字体格式).用户自定义的消息也可以用字符串表示.等等等等吧.
  大量使用字符串对于一个用户友好的编辑器是至关重要的.但是字符串有些特性不是很好,最不好的就是它是一块不定长的数据,这个无论在复制或者存储时都不方便.然后它的数据量比较大,用来比较或者拿来做hash key都会带来性能上的影响.还有一点,字符串很容易敲错,有时候会带来不必要的麻烦.等等等等吧.

  但是,我一直认为编辑器的直观易用是第一位的,所以我还是在engine里大量使用了字符串.直到后来我想出了一个法子,可以减轻一些字符串使用的不便之处,那就是建立一个字符串库,把游戏里用到的字符串都扔到这个库里,而用一个四字节的ID代表这个字符串,这个库是在整个系统里都能访问到的,所以如果你拥有了一个字符串的ID,你可以把它传递到系统的任意一个地方去,或者复制多少份保存起来都没问题,这比维护一个const char * 或者std::string 要方便,可靠,有效率的多了. 当然要使用这样一个字符串库,我们还是要有足够的编辑器支持.首先你肯定要写一个编辑字符串库的对话框,下图是我们engine中的字符串编辑框,(从界面上应该很容易看出它的功能吧):

 

 


  其次就是你需要能够让用户可以用这个编辑框来编辑游戏对象的数据.对于我们的engine来说,这不是一件很麻烦的事情,因为engine中的大部分对象都有对象描述信息(参见前文<<第五回 对象描述信息(OBJECT DESCRIPTION)--使对象使用起来更方便>>),我们所要做的就是添加一个字符串ID的语义(Sementic),用来修饰一个DWORD的字符串ID变量,同时在Property Grid中添加相应的语义支持.下图是一个按钮对象的属性列表:

 


  红框处是按钮的名字,用一个字符串ID来表示,点击 ...  可以弹出刚才的字符串编辑框来编辑它:

 


  蓝框处是另外四个字符串ID,它们分别对应按钮不同状态下的字体格式,注意,由于使用了字符串ID,所以这些格式字符串可以很方便的被其它风格类似的按钮共用.(在上面的对话框里你也可以找到它们)

  需要注意的是,在一个多人开发环境下面,要解决互斥编辑的问题,所以,我们在弹出编辑框的时候,首先会自动的把字符串库check out出来,在关闭编辑框后,再自动的check in,以确保同一个时刻只能由一台电脑编辑字符串库.由于编辑字符串一般来说是一个很短暂的过程,所以出现冲突的几率不大.这是个简洁的解决方法,比尝试去merge若干个字符串库的解决方法要简单多了.

  最后,使用字符串ID也许还有一个潜在的好处就是:可以提供游戏的国际化支持.

  字符串库是个很简单的概念,但我还是蛮喜欢它的,所以在这里介绍一下,希望对你有启发.下回说说系统里一个很重要的东西: Stub .

posted on 2010-07-14 22:45  ixnehc  阅读(985)  评论(0编辑  收藏  举报