如何保证游戏资源名全局唯一


在最初两家创业公司开发3D端游时,使用的是自主研发的3D引擎。资源文件索引都是使用“相对于根目录的相对路径”+“文件名”作为ID,并且规定资源只有一个根目录,这样就能利用操作系统的文件管理系统保证资源名全局唯一(当然你也可以把同一个文件复制多份放在别处,但是引擎会把它们当成完全不同的文件)。这种方式要求项目在最初就把资源文件路径结构规划好了,否则开发中移动文件会非常麻烦,必须重新修改文件引用关系,工作量巨大,并且经常会有遗漏,所以经常遇到的报错是程序找不到资源。不过这种bug非常好查。


后来在第三家创业公司开发端游时,遇到了一个让我一直膈应到今天的问题。这家公司的引擎是基于Ogre进行魔改的,但是文件系统基本上保持原样:文件引用都直接使用文件名,让开发人员(主要是美术人员)来保证资源名全局唯一,打包时把所有文件都打包在同一个文件夹里。这种方式确实有个巨大的好处,那就是只要保证了根目录下所有的资源文件没有重名的,那么开发过程中文件可以随意变动位置,这对于需求快速变化的游戏开发来说确实是个莫大的福音。定义一套复杂的资源命名规则,让所有的开发人员都牢记这一点,确实理论上能把名字发生碰撞的几率降到最低。但是并不能保证完全杜绝,万一有两个好基友的品味完全一致呢。再说开发中难免会把文件拷贝一份进行备份,后来又忘了清理。另外,一个项目70-80人,直觉告诉我让所有人都遵循这么一个莫须有的潜规则根本办不到,事实也证明确实是这样的。所以,开发中常常会出现画面效果不正确的问题,而这种问题又可能是多方面导致的,比如引擎或者客户端的问题,查起来好比大海捞针,非常耗时。后来做了一些补救措施,增加重名文件检查的功能,比如说在客户端或者编辑器启动时递归扫描资源根路径。但是这会严重增加加载时间,开发人员大多数时候会关闭这个功能。


后来做项目开始研究cocos2D-X,发现也是这个套路,一个月内遇见两次画面不正确,花不少时间查下来发现却是文件重名这种低级错误导致的。Urho3D虽然也使用了相对路径,但是由于根目录会有多个,实际上也不能保证资源全局唯一。


那么商用引擎怎么解决这个问题的呢?举个例子,UE4会记录文件之间的引用关系,当在编辑器里移动文件时,会进行资源重定向,将资源文件里的引用路径进行相应修改。这种方式使开发过程很舒服,但是实现这个功能却是很麻烦的事情,虽然原理很简单。好在UE4自己实现了一套反射机制,做起来可能会比较顺手。CE3也使用相对路径,但是没有做资源重定向的功能。Unity没有做过项目,不清楚。


哪种方案最好?我更倾向于相对路径加文件名的方案,不做资源重定向。毕竟游戏发展这么多年,你什么类型的项目,要用到哪些文件,有点开发经验的美术都能预测到,立项之初大致是能确定文件路径结构的。如果实在想只使用资源名作为文件标识,也有个补救的办法。可以写一个资源审核工具,任何文件想要加入项目必须通过这个工具。工具会检查根路径下所有的文件,看是否有重文件名。有的话会报告出来,没有的话会写入已经审核通过的标识符。任何文件必须要有这个标识符,否则引擎不会加载。为了防止开发中拷贝备份文件造成文件重名,可以将文件的创建和修改日期写入标识符,引擎读取文件时也会检查文件的创建和修改日期是否跟文件里的标识符一致。


具体用哪种方案,最终还是看项目,看团队吧。总之明白这几种方案的优缺点是最关键的。




猜你喜欢

转载自blog.csdn.net/CrazyEngine/article/details/77942818
今日推荐