翻译自:http://yoannsculo.developpez.com/tutoriels/jeux/retour-experience-sur-developpement-jeu-amateur/

I. 介绍、

我在2005 年开始和我一个朋友开发一个网页游戏:Simerion. 这是一个混合了RPG和经营类的游戏。想法是让玩家成为新开发星球的殖民地移民。 每天每个玩家都要选择一个职业,然后主要很简单:RolePlay. 每个人都可以做他想做的,做什么都可以. 捡主要的说,就是一个理想的游戏,但是实现起来却不那么回事了.

我在5年的设计/开发后离开了Simerion. 那是2009年。 我会在后面说明为什么. 但是我得借这次机会做个项目的总结。在我的观点下,就是想做个反馈下我们在这个项目里所学到的特别还有我们所做的错误决定. 特别还希望帮助正在做类似项目的人. 首先, 我得解释下这个游戏还没停止开发,不过是我个人退出了而已. 所以如果你们谁想加入开发团队,请别犹豫上这里:www.Simerion.fr

现在首先先来一个概览:

-2005: Wett和我从抽屉底里找到我2年前画的草图. 然后接下来的5个月我们就把我们所有的点子都写在了论坛和WIKI上. 但是后来因为学业的关系我们暂停了项目(Prepa: 就是法国上工程师学院等高等学院前的预备班).

-2006年7月:一年以后,我们又重新拿起项目,策划持续了一个月.

-2006年8月: 我们终于开始开发了,并且我们加入了Nainwak.

-2007年8月:又是一年,在3月份后借着Altheran的帮助,我们成功的弄出了一个Alpha测试版本,那时玩家大概有50多个.

-2009年3月:又是一年半,Beta版出来了而我离开了团队。

II 团队协作

在这项目期间,我发现了多人合作开发的重要性. 有各种原因,比如首先当有人失去积极性的时候可以互相鼓励. 并且有多个人的时候可以更轻松的跨过障碍. 像开发SIMERION这种网页游戏不应该闭门造车. 但是也要注意负面效应,如果有太多人参加的时候反而会产生负面的效果,所以应该要有数量正好的程序员,当然至于数量多少这是要考虑到他们的能力和时间做决定.

III 选好开发语言

我们刚开始的时候是选择用PHP + Ajax来开发一个在网络上可以让玩家们互相互动的游戏. 为什么PHP? 因为我比较熟悉PHP所以可以更简单的上手. 但是后来我发现范了个严重的错误,就是不应该选择这个语言。当初应该用Java或者C++来制作一个真正地MMORPG.  我们后来很快的就发现了PHP和Ajax的限制,特别是需要让玩家们实时的产生互动的时候,但是那时候要换语言已经太迟了. 所以在这里我严重建议大家要先参考全部可用的语言后再做慎重的决定!当我们开始开发一个大型的WEB项目时,每一个语言都有它的长处和短处,需要比较后做决定. 但是我们却没有这么做, 所以我们就作茧自缚了... 当在这种情况下,甚至应该先做一个PoC(Proof of Concetp)来确定一个语言,API,或者其他什么东西. 这样就可以避免那些不想要的"惊喜"并且可以知道哪些比起另外那些更好,更健壮.

IV. 不要重新造轮子

另外一个我们做的错误决定是没有用那些已经做好的Php和Ajax框架. 但是我们太疯了,居然自己从A-Z做一个游戏引擎,还有自己的Ajax框架. 我们在重新造轮子的期间了浪费了超级多的时间. 另外一方面,我们甚至不知道这些工具已经被做好就放在那边给我们用,如果用上这些东西甚至能早点我们明白一些技术和技巧. 如果当时重新做的话,我绝对不会再重新造轮子了. 当开始一个大型的项目时,我觉得真的需要先看,比较那些可用的工具然后不要直接就低着头乱冲. 用那些已经存在的工具真的可以帮你赢的非常珍贵的时间.

V.  使用UML图

使用UML图非常重要,当然在整个过程中想要严谨的把整个想法都写在纸上还是非常困难的, 但是到最后总是有益的,因为这样可以赢的非常多的时间. 虽然UML图只在我们不想修改想法的时候才有用。而且有些时候,UML图却可能会经常产生疑问,所以可能会浪费非常多的时间

VI. 避免"全部面向对象"

一个网页游戏的类还是非常复杂的. 第一眼看上去的时候, "全物品" 可能是一个不错的东西,但是类却不是数据库的好朋友。 说到类就是属性,说道属性就是背后数据库不停的更新和过于的负载. 用类和实例工作代表者需要长期的优化代码让服务器不会因为SQL请求而崩溃.比如,如果我要载入一个Simerion里一个玩家的建筑,我们首先要载入一个定义它类型的物体(class),然后载入另外一个定义它的实例(建筑) 之后还有它的类. 然后有时候我们还需要给这个建筑定位,所以我们还需要加载这个建筑所在的地区(另外一个表). 因为有很多星球所以还必须加载这个地区所在的星球(又是一个表). 最后创建这个物体就变得非常吃资源,并且需要大堆的SQL请求. 想象下你还需要这个样子载入这整个建筑里的其他物体... 简直是服务器杀手阿。。。 所以我们就不得不不停地优化代码然后慢慢得就远离了平常的那"全物品"系统. 虽然原来那样非常有趣,但是当我们需要做一些需要面对非常多用户的页面时,性能就非常的重要. 我想绝对的解决办法是不存在的还有就是为了代码的可维护性必须放弃"全OOP". 不过话说回来,关于和数据库的交互,必须找到一个平衡点,然后试着远离平时那种在创建物品的载入全部有关物品的做法.

我想这里应该需要看一些大型的框架看看他们是怎么做的,和数据库交互是件非常复杂且尖端的学问, 我想甚至在5年后,这些代码也没有最大化的优化过. 所以结论是,还是去看一些已经存在的工具看看他们是怎么做的,非常有帮助.

.

VII. 不要老是把那些旧的代码拿出来研究

另外一件我们浪费了很多时间的事情就是长期的把旧的代码拿出来研究. 这说起来比作起来容易,特别是千万不要一开始就直接把代码优化到死!要慢慢的时候到了你就会觉得哪里该优化了. 我等下说下如何一步步工作的问题, 但是通过我开发SIMERION的经验来看,就是千万千万要先让代码运行起来就OK然后走到下一步而不是老是不停地把一些代码拿出来研究. 当这些代码可以运行了以后,就可以优化了,但是千万要先可运行然后才是低着头优化游戏的安全性和流畅性.

VIII 选择好开发周期

我们的开发周期肯定是不对的. 而这应该是我们(我)的失败. 5年啊! 我们花了5年的时间在这个项目上而直到我离开居然都还没有一个可以公开给大家玩的游戏... 这也是我离开的其中一个原因. 这甚至可以说是对自己的剥削了.  我们选择了只有这个游戏完全可以玩了之后才公布游戏. 然而,Simerion的主要想法是可以做任何事情,所以全部都是必须的还有全部都互相平衡. 所以只要游戏还没有完全完成就没办法公布一个可以玩的游戏. 这真是太大的错误啦! 当策划写好了以后,我认为,一个业余游戏应该要以最快的时间推出.

不止可以尽快得到玩家的回馈,而且还能激励团队坚持下去。 因为连续几个月甚至几年(比如说我们)没有其他人的意见和回馈真的是非常让人沮丧的, 所以激情自然也就消磨了。 还有就是不能想当然的把任务托付给团队的其他人,因为他们也同样在消磨着激情。 所以我强烈建议尽快推出可以进行游戏的版本(起码对业余项目来说), 要经常推出新的版本,而不是像我们那样在每个版本里都花费那么久的时间。

如果那样做的话就可能会保持一个玩家社区,玩家和开发者就能互相照应,开发者也能更能保持项目开发的热情。如果不这样的话,经过N个月N年后很可能会流产. 然后所有的努力都会白费。

IX. 创建玩家社区

就像我前面说的那样,在项目开始的时候就应该着手打造玩家社区。 他们可以帮助测试游戏,返回回馈,发表他们的主意...等等, Simerion由于没有发布可以玩的版本,所以我们在开发时就没有玩家社区来支持我们. 而这就有了个非常坏的结果. 所以我非常建议在开发初期就要有个社区,因为社区还可以吸引新的玩家,其中可能就会有人称为你项目组里的新成员。

X. 业余的不能和专业的对碰。

虽然很不情愿,但是做一个完整又复杂的RPG游戏的确不是业余玩家随随便便就能做出来的。如果有人站出来反对我的话我会非常开心! 但是制作图片,装饰,背景,剧情,声音,任务 等等 全都需要非常多的投入,我95%的时间都同时作为程序员,编剧,美工存在,但是这个到了后来越来越无法支撑下去, 所以在队伍里应该要最少一个开发者,一个编剧和一个美工才能完成项目。 不能以为任何事情都要自己亲自完成。

在这点上,我是比较悲观的,我认为像 辐射,最终幻想,塞尔达传说,这些"终极"游戏是不可能被业余开发者完成的,我感觉上,一个业余游戏在开始的时候必须不能是雄心勃勃的,要慢慢来,一边开心的扩展项目一边要认识到是不可能和那些专业做游戏的公司比的。  一个业余的"终极"游戏是不可能实现的,因为有太多的工作要做了. 在Simerionsa上我们从策划开始就像的非常复杂,太理想化了。。。 成功的钥匙是在刚开始就找到创意和代码量之间的平衡点。

XI. 持续保持更新项目的文档

非常重要的一点,要持续保持游戏文档的更新,因为通常项目都会遇到需要暂停N个月的情况。 如果在那些时间之后再重新拿起以前的代码的话可能连自己都看不明白, 项目文档可以让人对项目有个整体的视角,让人可以更轻松的组织和认识到以前的想法, 在技术方面它可以解释游戏的运行方式,更可以解释为什么会选择某个算法到游戏里.

在重新回到项目的时候文档还可以帮你省下N多理解你和其他开发者写的代码上用的时间. 这些工具还可以帮助项目组新的成员更容易的加入进来。

在Simerion上因为这个项目代码实在是已经变成了一个如同毒气室一样的东西,几乎没有人会咬紧牙关一点点的理解那些缺少注释没有解释的代码。  所以缺少对项目的解释会阻碍新成员的加入。

XII. 得到其他人的支持

我们在刚开始的时候就加入了Nainwak协会,他们帮我们部署游戏,支持我们并且给我们建议。 如果没有他们的帮助我们一定无法支持那么久的时间. 通过他们的帮助我们甚至还得到了参加游戏展示的机会。 我们还遇到了很多对我们游戏有兴趣的职业游戏开发者. 那真的是非常有意思的经历,所以我非常建议大家如果要做网页游戏的话就联系他们把。 这个协会的任务就是帮助业余的游戏开发者,而且他们做的非常好。

XIII 总结.

2009年,我离开了项目。

那时候我完全放弃了Simerion的开发因为对我来说那时是在已经没有任何激情了。 开发这个的任务已经变得无法完成,而我也必须要去做其他事情了。 放弃Simerion对我来说的确是个困难的决定,但是我觉得在5年以后,是时候去干其他事情了。 开发Simerion的经历来说对我非常有帮助. 我学到了非常多也认识了很多人。 但是现在我认为如果在刚开始的时候不那么做的话应该会有更好的成功,而我也应该还是会在项目上.

不过那也是学习经历的一部分,失败是成功之母。 不管怎么说,我们那时候的确是在一个荒唐的,认为任何事情都是可以做到的项目上.  一个那样的游戏不过是无法实现的,而且完全不切实际(除非是一个大公司).

错误的选择,太雄心勃勃的策划,错误的开发步骤,重新造轮子都是让Simerion无法完全的原因。 我们学到了这些错误然后我希望我们的经历能对您有用处。

历经5年,一次业余网页游戏项目惨痛的失败经历相关推荐

  1. HTML5网页上播放mp4失败的原因

    HTML5网页上播放mp4失败的原因 这个不错: https://blog.csdn.net/jacke121/article/details/84568802 解决方法1: FFMPEG  -i   ...

  2. 网页连接的服务器失败是怎么回事啊,网页怎么连接服务器失败

    网页怎么连接服务器失败 内容精选 换一换 华为云提供两种连接方式通过SQL Server客户端连接实例:非SSL连接和SSL连接.其中,SSL连接实现了数据加密功能,具有更高的安全性.准备弹性云服务器 ...

  3. 网页连接服务器失败是怎么回事,网页怎么连接服务器失败是怎么回事

    网页怎么连接服务器失败是怎么回事 内容精选 换一换 华为云提供两种连接方式通过SQL Server客户端连接实例:非SSL连接和SSL连接.其中,SSL连接实现了数据加密功能,具有更高的安全性.安装S ...

  4. 解决在Ubuntu18.04中firefox打开网页出现建立安全失败并提示PR_END_OF_FILE_ERROR

    解决在Ubuntu18.04中firefox打开网页出现建立安全失败并提示PR_END_OF_FILE_ERROR 解决办法 打开设置 找到网络 打开网络代理栏中的最右边的按钮 选择自动

  5. Ubuntu网页端播放音乐失败

    Ubuntu网页端播放音乐失败 因为网页版的qq音乐或者网易云音乐都把音频换成了AAC格式,这必须要下载特定的解码器才能播放音乐,所以只用在终端输入一条命令就可以安装能大多数音频解码器 sudo ap ...

  6. 从地址栏中敲入一个网址,到网页显示出来,这个过程经历了什么

    这个问既考察技术深度又考察技术广度,其实要答好是相当难的. 在地址栏中敲入一个网址后,浏览器向服务器发出请求,请求对应网址页面的内容:然后服务器收到请求以后对这个请求进行处理,处理之后以HTML文件的 ...

  7. 苹果开发者账号网页版续费失败支付报错解决办法

    背景: 近日,有一个公司类型的苹果开发者账号老号(新号都是在Apple Developer app完成自动续期)即将到期需要续费,但是一直拖着只剩10天时间才准备续,却发现无法正常完成续费. 问题: ...

  8. CMIP6网页下载HTTP下载失败,批量下载

    最近找了一下,CMIP6下载的方法,很多都是网页直接下载,但是就是不能下载. 点击就会出现下面这种问题 找到另外一种下载方法,分享给大家 第一步: 打开CMIP6下载网站cmip6 Data Sear ...

  9. 登录后网页无法连接服务器失败怎么办啊,网页登录服务器失败

    网页登录服务器失败 内容精选 换一换 企业主机安全通过云审计服务(Cloud Trace Service,CTS)为用户提供云服务资源的操作记录,记录内容包括用户从管理控制台或者开放API发起的云服务 ...

最新文章

  1. Android 开源框架Universal-Image-Loader全然解析(一)--- 基本介绍及使用
  2. Tree Operations 打印出有向图中的环
  3. 【转】使用genstring和NSLocalizedString实现App文本的本地化
  4. 空行替换_Word怎么批量删除空行和空格?有技巧很简单!
  5. pandas中的DataFrame数据结构
  6. 利用dos管道命令获取屏幕内容_汇编语言--常用DOS功能
  7. sqlserver的四种分页方式
  8. caffe基础(7): 命令行解析
  9. [转]expect的安装
  10. 从内存中加载DLL Delphi版(转)
  11. Android 应用开发(9)---内联复杂的XML资源
  12. 跨平台的开源的可视化分析工具 Grafana的介绍与使用
  13. (安徽省地图)行政区划图高清矢量cdr|pdf(详细版2021年)
  14. 卡尔曼滤波算法 C语言实现
  15. 正则表达式re中的group和groups
  16. 【图像融合】基于matlab小波变换图像融合【含Matlab源码 392期】
  17. 后门程序技术知识全面深解
  18. APP运营中地推应该怎么做
  19. 饥荒 阿里云服务器搭建记录
  20. UWB定位系统会存在定位误差吗?

热门文章

  1. 苹果手机打不开html,苹果手机打不开app是怎么回事(苹果app异常解决方法)
  2. 一步一步学linux操作系统: 14 进程调度三完_抢占式调度
  3. 【pytorch】简单BP神经网络用于通用分类任务的代码模板
  4. MySQL 数据库(包括基础和进阶CURD、事务和索引)
  5. R语言和Hadoop系统架构在大数据分析中的应用
  6. mysql命令行安装教程_MySQL命令行教程
  7. 读后感——只是为了好玩(Just for Fun)-Linux之父林纳斯自传
  8. 57个机器人流程自动化应用场景:RPA深入指南[2019更新]
  9. 【设计模式】依赖倒转原则(Dependence Inversion Principle)
  10. 边工作边学习的现实选择