« 最近有点忙 | 返回首页 | 一道初等几何题 »

平台无关的游戏引擎

一直以来,我们的新引擎一直以跨平台为设计目标。这倒不是说,我们有多重视非 Windows 平台的用户。只是我觉得,一个好的设计一定是很容易做到平台无关的。对于做跨平台开发这件事情,公司里支持的人寥寥。光老丁都几次三番劝我不要把精力花在无谓的地方。

唉,怎么说呢。写了这么多年程序,我一直把编写代码和设计软件作为一件很有趣的事情在做。所以我并不认为我做的一切是一种工作,它是我的玩具。早就不需要担心后半辈子的生活问题,所以没有人可以阻止我做想做的事情,更何况我认为良好的设计造就优秀的产品。今天看似多花的精力,日后慢慢的会给出回报。

回想当年做西游的客户端,我固执的把内存的占用量控制在 64M 左右,让低配置的机器也可以流畅的运行。为了达到这一点,当年多花了好多的精力。做内存中的精灵压缩,做地图的动态加载,做图象数据的 cache 和主动交换,改动许多我认为会更多占用内存的数据结构,阻止美术的一切可能过于消耗内存的设计。

这些在我离开西游的开发后的这么多年里,配合硬件的发展,往日做的那些,得以让后来的不断扩展玩法和美术资源可以稳定的进行。后期的开发维护人员可以用足够的东西来“浪费”。前期的种种约束和正是为了后期的无拘束扩展,直到这些项目顺利的走完生命期。

我希望几年之后,依旧有人感谢我当下做过的努力。

这两个月从对 X 的一无所知,到略有所成,还是颇花了点精力的。google 上关于 X 系统的编程相比 Windows 少的可怜,更别说我在 glx 上遇到的问题,那些更是很难直接获得答案。

一直以来一个人摸黑在 X Window 上摸黑写了好多代码,昨天同事写的另一部分关于 3d 方面的一些代码完成,我惶恐不安的放到 freebsd 上运行。虽然理性上我相信我们的跨平台架构是没有问题的,但是感情上还是不太相信一点问题都没有。

结果,除了一些文件名上的小问题之外(*nix 上对文件名是大小写敏感的,一开始没有重视),居然一次运行通过。看到 X 上显示的 3d 画面,格外欣喜 :D 这种感觉大部分来自于我们的设计小小的被检验了一次。因为另外的程序员在写他的代码的时候,丝毫不用考虑跨平台的问题,仅仅只是在遵循我们一起指定的一些标准罢了。

这次还是二进制跨平台的。

后来试了一下 openGL 的远程渲染,我在 Windows 上装了 XMing ,昨天晚上第一次用。glx 方面还是出了一点小问题。XMing 的 server 只支持 glx 1.2 ,而我起先是用 glx 1.3 做的,这让我花了点时间改过来,并且找到了另一些小问题,最后也顺利通过运行了。虽然这种远程渲染对 3d 游戏这样交互性和性能要求比较高的应用程序来说意义不大,但当个玩具玩玩还是很有趣的。特别是远程使用 DDD 调试的感觉很不错,这样就可以换掉难用的 insight 了。

ps. 如果有 X Window 或是 Mac OSX 的编程达人看到我这篇 Blog ,可否留个联系方式,大家以后多多交流 :D

Comments

哇,这篇看的我有点热血了

很强的自我意识。

您好,我非常想做一款类似帝国时代和要塞那样的网络游戏。虽然我即没有自己开发的网络游戏3D引擎也没有现成的开发团队,但是我很有信心。我对未来网络游戏的方向很有感想,竞技型收费游戏我觉得会很有市场,虽然是一种创新,但是我认为人之所以玩游戏是因为好玩才玩。假如给你三百个选择不同兵种的士兵,协同其他3位玩家,去攻打一座4位玩家固守的城,那样壮观的场面和兵种的操控以及玩家的配合我觉得会有很多人来玩的,没有帝国那样的发展过程,只有作战带来的快乐和刺激,我对我的这款游戏的模式有着很深入的思考,希望能做成它。如果您感兴趣请与我联系,谢谢!hlhboy@hotmail.com

云风,风云,天下会。。。^_^
豪气冲天。。。
成也云风,败也风云。。。
云风不败,哈哈。。。
收我做徒弟吧!!!
我不是马屁精。。。
我是C++刚入门的爱好者。。。
收我做徒弟吧,我不要做小弟!
学艺十年未精,不得门而入。
惭愧啊。
能跟我发封电邮指点一下吗?
microcwj@126.com这个是我电子邮箱。

晕,那你写JAVA程序好了,或自己写个虚拟机,我觉的你臭屁哄哄,不做正事,那么多文章没看过几个有用的,就爱现

Hi, 如果对 Mac 下的开发 (窗口系统/图形编程) 有兴趣,欢迎和我交流: gzjjgod@gmail.com (Mail/GTalk).

太羡慕了,这么年轻就不用为下半辈子生活担心,可以做自己喜欢的事。
--------------------------------
做事执着和专注的人都不用担心下半辈子。

云风是个完美主义者,虽然你的数学功底不强,但在系统学的角度上,你的想法是非常完美主义的,我很喜欢这种风格。

应该重视一下MAC.占的份额应该还会增大很多.

云风的努力的确值得让人感谢.就看之前的水浒Q传的稳定性和承载力.还有如今许波正在内测的梦想世界的内存占用和CPU占用就可以知道当年云风在这个2D的引擎上下了多少功夫.

“看到 X 上显示的 3d 画面,格外欣喜 :D 这种感觉大部分来至于我们的设计小小的被检验了一次。”
虽然很无聊,但比较明显的错别字还是要指出来的:是“来自于”。
你写的很好,看你的文章,也看了你的相册,虽然看不清笑起来是否有鱼尾纹,但发型还是蛮酷的……

如果云风可以尝试去做NEXT-GEN的游戏开发就好了

太羡慕了,这么年轻就不用为下半辈子生活担心,可以做自己喜欢的事。

“写了这么多年程序,我一直把编写代码和设计软件作为一件很有趣的事情在做。所以我并不认为我做的一切是一种工作,它是我的玩具。早就不需要担心后半辈子的生活问题,所以没有人可以阻止我做想做的事情,更何况我认为良好的设计造就优秀的产品。今天看似多花的精力,日后慢慢的会给出回报。”

我又转贴了。

做游戏最出色的、最具传奇色彩的当然是暴雪了,这毫无疑问嘛。我现在玩得最多的还是war3,传统的RPG和策略游戏已经落后,还是即时战略更有乐趣。

明白了,如果只load而不link,就需要对调用的接口作约定,因为编译器和操作系统都无法介入link。所以调用时必须要知道重定位后的地址。看了云风以前的文章,大致可以猜测出,将模块重定位后的基地址作为handle返回,然后模块内部暴露一组接口的偏移地址,调用时只要压入参数,然后基地址加偏移call一下就可以了。
由于没有办法link,所以使用符号地址就只能查表进行,不能保证效率。用符号表,可能会在调用时造成额外的开销。不用符号表导致调用上的不方便。

原来如此,看来是我想得过于复杂。重定位的确比较好处理。但是这样的设计对模块编写的要求很高了,不能依赖于其他的动态库。不过这样的形式上的要求,也保证了这个模块的平台独立性,因为操作系统的API都是以动态库形式提供的,另一方面也使得“其实现一定是高内聚,低耦合的”成为一种必然。这样的方法更加适合于纯算法的模块。

不过在模块的调用接口上就必须做特别的处理,不能使用通常的函数名调用,然后交给compiler和linker去完成。因此需要有一个调用的约定。在二进制这一层,能暴露的就是地址,不过如果能把符号信息加上是否更好,毕竟使用符号地址更加方便。在call的时候也许会更容易。

不过关键还是要看这个二进制代码格式如何设计。目前我对这个的认识也只能停留在理论上,还需要找几个时间编码实践一下。

被云风的题目给骗了,哈哈,上一当。

还好自己突然发现不对头,又想了想

:-P

我的做法是:

自定义一个代码格式,不同于 coff 或者 elf ,自己做 loader ,然后就可以在任何操作系统下加载了。

自定义格式不需要 coff elf 这些这么复杂,不需要导入导出表,不需要支持符号信息,不需要解决 so/dll 间的依赖关系……只需要把代码重定位做好即可。

(满足这样的二进制模块,其实现一定是高内聚,低耦合的)

这样的 loader 写起来不超过 500 行,且源代码可以在任何平台编译。

生成这样格式的工具很简单,从 dll 或 so 转换即可。

如果想二进制跨平台(不是硬件平台)自己写个loader加载就可以了,av软件很多都这么干

我的意思是说,二进制代码的格式,或多或少都是与操作系统和编译器等相关的。除非自己定义一种通用的格式,然后制作一组工具,在需要时,将这个通用的格式通过工具转换到目标平台的目标格式。不知道云风是否是这样做的。

克劳德大哥还是相当幸运的了
国内其实有很多优秀的程序员,但是却没有云风这样幸运,能为自己的理想而工作,而且不会为生存问题担忧。

做到代码上的可移植性应该不难,只要把与平台相关的模块独立出来。但是要做到二进制跨平台还是有些困难,毕竟二进制的obj、lib、exe、dll等(linux下为.o、.a、和.so)的产生都是由编译器完成的,除非采用同样的编译器,也就是说Windows下也使用GCC,或者是自己定义一种通用的二进制代码格式,然后在制作相关的工具。但是这些工作大多都是编译器做的,如果自己去做工作量还是相当大的。

大家不要用挑剔的眼光看云风的文字。云风强调一方面并不意味着一定要忽略另一方面。这不是个非此即彼的问题。

另外,真的很希望云风能做一款即时战略的游戏,相比较网游而言,我更偏好RTS

:-)

好多人误会了我的用意,其实在 blog 里写的已经很清楚啦。

我做这些不是因为重视非 Windows 平台,(我依然觉得 Windows 桌面系统是最好用的系统,或许过几个月用了 Mac 会有改观),而是为了让引擎设计的更好。

2 进制跨平台很简单,只要是 IA32 系统的机器都可以做到。跟操作系统打交道的代码毕竟少之又少,只看如何剥离出来。

至于非 IA32 系统,不是我现在所考虑的。

等 mac 机器到了后,熟悉其窗口系统的编程估计是相对最花时间的部分。agl 倒是和 glx 差别不大,写起来应该比较简单。

Mac上的图形系统和Win32或者X完全无关。处理2D图形就用Quartz,3D的话还是用OpenGL.

我看来网易是个很保守的公司,躺在梦幻和大话的成功上睡大觉,开发观念陈旧(不是技术上的),内容毫无创新,新出的几个游戏都是,真搞不懂有那么多钱了还没胆量创新么?如果以后出的游戏还是老模式出一个还是死一个,建议网易规定同质化的游戏不给策划投资了!不要再出了!!

"二进制的跨平台"是不是类似 java 的字节码,由自己的虚拟机解释执行?

--早就不需要担心后半辈子的生活问题,所以没有人可以阻止我做想做的事情,更何况我认为良好的设计造就优秀的产品。

--中国的能说这句话的程序员大概不超过10位

虽然也一直努力让代码跨平台,不过同样对二进制的跨平台的目地不大理解,有空解释一下罗?

还有Dablo啦,哈哈,足以验证玻璃渣是多么重视MAC平台的。

玻璃渣的StarCraft和War3都是支持MAC版的,毕竟游戏起源还是在MAC上首先达到顶峰,后来的PC的兴起,才慢慢的埋葬了MAC的辉煌!!!

平台无关性阿。这应该不会出现在引擎里的。。。。
无论如何,引擎都要针对单独的平台专门写代码。这是不可避免的。其实引擎应该叫做跨平台而已。
我现在也在做这方面的工作。最早,我的基于win32和linux的服务器的库也实现了逻辑代码的无改动平台迁移。


另外,对于风哥所说的二进制跨平台的,我有些不解。我一般都是在两个平台下各自编译。因为linux不一定运行在x86上,所以二进制跨平台,我是不会去做。

随着引擎的完成,我不禁想预测一下云风的下一个目标。 :-)
前几天去金山,他们告诉我,现在网游已经占金山一半以上的业务收入。想想金山当年做了多少软件:WPS,词霸,毒霸,快译。。。。。到头来,还是游戏最赚钱。有点无奈,但也是现实。
所以我想云风的目标应该还是在游戏行业。前不久暴雪发布的《星际争霸2》演示,实在是超酷。或许云风也会尝试做即时战略游戏。如果真是这样,那我将是云风的第一个玩家。

一家之言,大家看看就好 :-P

非常有远见的想法,加油!

跨平台好。OpenGL好。

看完了云风大侠的书,感受颇深,我要象云风大哥学习,做一个优秀的游戏开发人员。

不知道是不是下一本书可以包含进这些内容,呵呵。

如果国家现在强力打击盗版(已经感觉到力量了),估计LINUX,UNIX系统会很快火起来,自然基于X的游戏发也会很快有市场了。

我相信云风的决定是正确的

我过两个月买台 mac mini 玩。
理论上花一个月就可以在 mac 上跑了。要花这么多时间是因为目前我对 mac 的开发还一无所知。

不过需要写的代码量是非常少的。

云风的考虑是很有远见的。不过不知道云风有没有往Mac平台上迁移的打算。在欧洲Mac的用户非常多,这些都是云风游戏的潜在玩家啊! :-)
微软的OFFICE就是如此,同时支持Mac和Windows平台

境界高远,大家风范啊。一般情况下,能在MAC上运行的,都是最上档次的作品。 :)

一直在看你的博客,期望有一天能达到你的水平

风云老大打心眼里把你看成老大了,希望你能收我作小弟,哈哈!只不过你说的东西都太深奥了,我怎么就听不懂呢!!哈哈,小弟刚学c++,希望多多指教

Post a comment

非这个主题相关的留言请到:留言本