三个问题:c++做服务器还是php做游戏服务器发展前景好?做服务器需要补充什么知识呢?很多公司在招聘c++是要

C++的就业,和发展方向 - CSDN博客
C++的就业,和发展方向
C/C++的就业,发展方向
原文 :C/C++的就业,发展方向_LoongChang_新浪博客
从学习C++到现在已经有四个年头了,但是从来没有很深入学习,有人说C++是面向对象的编程语言,但是我在这里想说的是,C++是一个多泛型的编程语言,它既可以面向过程,比如我们完全可以用C++写C的代码,这是没问题的,它也是一个面向对象的语言,它具有面向对象的特征,可以模拟现实世界中的各种事物;它也是一个泛型编程语言,里面包含大量的模板特性,比如C++的标准库STL就是基于模板的一个库,C++语言的难学也就是因为它的功能十分强大。
&&& C++初学者一般可以按照下列的顺序进行学习:
&&& 刚开始接触C++时,如果是学校开了C++课程的话那就更好了,可以跟着老师的进度学习,在课余时间可以多做一些习题或上机练习。如果你是完全自学,你可以找一本面向大学生的教材(谭浩强的教材比较适合入门)。掌握了一些基本的C++概念了,那就开始学习面向对象的部分了,这部分内容比较多,初学者理解起来也会感觉比较吃力,建议多上机练习。在基本了解了C++的面向对象之后,可以开始学习模板库,比如STL,因为STL在我们的软件开发中非常重要,甚至有些招聘都要求会STL,(STL:标准模板库),这里面包含了大量的数据结构和算法的实现,有些可以直接拿来用,但是如果你对数据结构有特殊需求,那么你就要自己去实现这些数据结构。
&& 如果你已经进入了C++的世界,那么你就可以进阶学习了,学习了这些你或许感觉有疑惑,为什么我不能开发出一个带界面的程序呢,呵呵,如果你又这样的需求,那么你可以学习一些界面库,比如QT,MF等,这两个是比较常用的,QT入门稍微容易些,但是往后深入会比较困难,MFC入门起来会麻烦一点,有很多人也就是因此而放弃,但是甜头在后面,只要入门了后面的路将会是一马平川,障碍比较少。
&& 库,在c++的世界里具有很高的位置,你如果对某一领域感兴趣,你就需要去了解和学习相关的库,比如三维图形库OPENGL,网络通信库ACE等等,这些库基本是都是标准C++写成的,一般都是跨平台的。也许有很多会有疑问,我学习了C++以后能做什么样的软件开发工作?目前C++软件开发主要集中在以下领域:
& 1、服务器端开发:很多游戏或者互联网公司的后台服务器程序都是基于C++开发的,而且大部分是linux,unix等类似操作系统,所以说,你如果想做这样的工作,你需要熟悉linux操作系统及其在上面的开发,熟悉数据库开发,精通网络编程。
&2、游戏:目前很多游戏客户端都是基于C++开发的,除了一些网页游戏可能不是,这个领域需要学习的东西就比较多,个人不太了解就不多说。
3 、虚拟现实仿真:这个也是发展很快的计算机领域,目前各种数字地球,数字城市,虚拟地理环境什么的,出现了这方面的大量应用,不过也不限于这些方面,比如科学计算可视化也是其中一个方向。这个方向重点需要学习的是图形学。
4 、数字图像处理:现在市面上有很多VC++图像处理的书籍,可见在这个领域的应用软件开发也是占了很大比重,需要深入学习数字图像处理和模式识别等课程。
呵呵,说到这里都感觉好像跑题了,都没看到具体什么学习路线啊,就当是自己的学习感言吧,有什么不对的,也欢迎大家讨论。
C++ 学习路线和看法
C++大体分为C++的基本知识,template C++, Object-Oriented C++, STL四部分。
1.谭浩强的《C++的程序设计》是入门的首选,讲的易懂,对那些初学者来说是非常不错的选择。虽然这本书没有概括到C++的全部内容,但足可以把你引进C++的殿堂门口感受感受。
2.上一本书的缺少了模板,面向对象和STL部分,这时候可以看看THINKING IN C++,你会有种登堂入室的感觉,体会到C++的奇妙和大智慧。
3.这时候推荐你看C++ Primer中文版(第4版),你可以自己去当当网看看大家给它的评价& 一本久负盛名的C++经典教程。(可以多看几遍)
4.C++当然不会缺少经典的书,还有很多好书,自己有空看看哪本和自己的胃口 就买来看看吧。
5.在学习过程中切勿求快,心浮气躁。一定要多多练习,把模拟两可的东西自己编程来验证下。
当你学习C++后,你会急着想去编写带华丽界面的程序,展示展示自己。
选择MFC和QT,你可以选择一个:(以下是我的个人观点)
&&&&&& 1.很多公司都需要MFC的开发人员。
&&&&&&&2.MFC的书籍肯定会远远多于QT,并且网上的资源也是这样的。
&&&&&& 3.学习MFC的人很多,你在不懂得时候可以随时请教他们。
&&&&&& 1.QT是完全的面向对象,MFC并不是。
&&&&&& 2.诺基亚在官方网站宣布,将采用Qt作为未来Symbian和MeeGo平台的唯一开发架构。可见QT的嵌入式份额正在扩大。
&&&&&& 3.MFC编写的程序没有QT那么好的跨平台性,所以QT常用在手机(meego和symbian),linux,window平台等等平台上。
学习MFC的路径:
1.孙鑫老师有一本&vc++的书和配套视频,可以帮助你快速的对MFC有一个基本的认识。
2.《Windows程序设计(第2版)》讲的非常的细致,会非常有耐心地为你讲解每一个细节。对本质剖析得非常好。讲原理,让你知其实还知其所以然。
3.学习侯捷的&&深入浅出&&,你就开始了解MFC的内部机制,让你对MFC的运行来龙去脉理解。
4.Visual&C++技术内幕,又是一部带你深入了解MFC的经典书。
1.C++ GUI Qt 4编程(第二版)经典之作,内容紧扣,详实清楚,QT必备书。如果你发现这本书有点难,可以先看看零起点的书籍。
2.QT的文档和强大的在线支持。
C++到底还能做什么?
C++到底还能做什么?&
嗯,这是一位朋友发到我邮箱里面的,很奇怪,发到了gmail邮箱,而不是我常用的hotmail邮箱哈。&
我呢,试着回答一下,如果回答得不好,叫做肖某人学艺不精,回去重新学习再来过哈。呵呵。&
一家之言哈,欢迎拍装。&
原文如下:&
我呢,试着回答一下,如果回答得不好,叫做肖某人学艺不精,回去重新学习再来过哈。呵呵。&
一家之言哈,欢迎拍装。&
原文如下:&
肖老师您好:&
我现在是一名在校大学生,在学校期间自学C++有两年的时间了,看过C++Primer,stl,inside C++ model(侯捷翻译的那本),com本质论等...&
在学习C++的过程中感觉C++语言本身的确很强大,而且随着学习的深入,我逐渐感到要想在短时间了解这门语言的本质几乎是不可能的.因为我也学习过javaSE的一些东西,感觉就java和C#来说,语言本身不难,不过在底层调用方面有时候就会显得有点费力了.&
不过对于C++我一直有很多疑问,所以想请教您,向您学习一下:&
1)关于C++的应用:&
曾经我以为C++的应用比较多的就是用MFC来编写各种应用软件,但是,我现在感觉编写软件这方面,用一些其他语言和开发平台,要比C++方便和快捷的多,而且也听人说,现在几乎不用MFC或是C++做软件了.至于网络应用和跨平台方面,现在应该是C#和java在这方面的应用比较有优势吧.至于一些其他有关硬件方面比如嵌入式,单片机控制系统等方面,用C语言就可以满足大多是的应用了.所以,现在哪方面的工作是用C++来做的?&
2)关于找工作的事:&
现在学C++到底能做什么样的工作?就像我前面说的,因为不大了解C++主要的应用在哪,所以,也不清楚到,能用C++来做哪方面的工作.&
3)关于com:&
我之前听人说,C++做到最后就是做com组件开发.情况是这样的吗?如果是的话,是不是用com来做有关远程调用对象和接口或是分布式系统等方面的应用.如果想做com开发的话,现在有哪些工作是需要用com组件编程的?&
虽然我学习c++两年了,不过感觉,没做过什么像样的应用,因为我在我们学校的一个网站的技术部里做过网站前台开发的工作,就是html,css这些,感觉这些语言虽然在学习的时候感到有很多东西不理解,但是通过做一些简单的网页,逐渐的基本掌握了如何编写网页代码.所以,也做过一些专题网站什么的.不过,就是c++这门我学的时间比较长的语言,我没有做过什像样的应用,想练习可是又找不到合适的方向.&
所以,想让您给我提点建议,我现在应该学习或者是做哪方面的东西来提高自己的C++水平,还有就是在学习这门语言时,如何能够通过实践来更好的掌握C++.&
我的表达能力有限,可能有些问题我描述的不清楚,不过,还是希望老师能辛苦一下,尽量帮我解答这些问题.&
我的回答:&
嗯,这位同学你好,我看了你的问题,也有点头大,说实话,你这个问题我不是没想过,我想得比较“野”,说白了,虽然我也用C++,但是,想这个问题的时候,我确实尽量站在一个客观的立场上在想,想出来的结论,说实话对C++不是很有利,我也怕说出来被人拍砖,所以一直没说,呵呵。&
不过,你既然问得这么细,我想我还是说说吧,说得不好听,大家就担待一下吧。&
嗯,恶意拍砖,我拍回去!&
这第一个问题,其实里面就很不好回答了。&
你说的“我以为C++的应用比较多的就是用MFC来编写各种应用软件”其实话没说完整,在Windows下,这个大前提不能少,大家开发Windows的应用程序,如果使用VC++的话,建议使用MFC来开发,因为它是微软提供的一套C++扩充类库,专门针对WindowsAPI封装,开发Windows程序最方便。&
这个话,倒退10年,是绝对正确的,因为那会儿,Linux没怎么起来,100个程序员,估计有99个都在为Windows开发程序,应用软件想当然跑在Windows下,这是对的,不过现在,使用Linux开发的人越来越多,Windows即使在桌面平台上,也一般只占据Client市场而已,Server中早就是Linux一家独大了,没办法,老外版权意识强,但老外也想省钱,Linux不花钱,WindowsServer花钱,就这一点,就够了。国外大量部署的商用服务器,其实是Linux平台。&
嗯,国内貌似也差不多。&
所以,我在年初的演讲《明日世界--云端计算下的程序员需求分析》中强调,MFC可能会衰落。起码,没有上世纪90年代那样,一家独大的感觉了。&
这其实也正是我为什么一直强调大学生尽量打好基础,不要太早涉足商业应用开发的原因,因为商用类库,有生命期,今天最火,你学了,明天等你毕业出来,人家被淘汰了,你不是做了无用功?甚至,工作都不好找。不信,有谁是专门研究TurboC的graphics开发的,就是BGI,现在出来找得到工作不?&
其实,MFC最大的问题,不是它自己的问题,是业界发展的一个普遍结果。&
现在的社会,请问大家一句话,纯正单机版程序的应用还有多少?大家打开自己的Windows系统看看,有哪些应用是纯粹单机版,一点不带网络访问的?&
恐怕不多了吧?&
现在随着互联网的发展,网络化应用越来越多,在Server端不好说,因为要求高吞吐量,高性能和高安全性,C/C++开发还占有一席之地,但是,客户端,恐怕未必了。&
客户端应用,一般都很贴合应用客户的需求,更多的以数据库服务为主,目前,我这里再提个看法,纯粹功能性应用越来越少,像暴风影音,像光阴魔术手,这类纯功能应用其实是越来越少,目前应用开发的主流,是利用强大的中心服务器的处理能力,为用户带来越来越多的数据密集型应用体验。&
QQ,它的用户群有多少?MSD和gtalk什么的不说了吧?大用户量,就是大数据量,带来了全新的沟通体验。&
SNS社区,包括我们这个网站,大家是不是在享受大数据量的应用体验?&
即便是强调终端用户体验效果的游戏,目前大家可以比较一下,网游和单机游戏的比例,就知道了,人们到底喜欢什么样的应用了。&
这就带来了一个问题,以后的社会发展,对于程序员来说,越来越偏重强中心,弱客户端的这么一种开发模式,这其实就是云计算的由来啦。&
大家是不是发现,自己用IE的时候越来越多了?&
但是,这就带来一个问题,开发弱客户端,还用得着C++这种大型的语言吗?&
我不说,大家自己想,学C#和Java容易,还是学C++容易?&
大家别耍酷啊,呵呵,其实我当初就是为了耍酷,非要学C++的,不过,要是站在商用立场,站在老板的立场,早出人才,快出人才,出便宜人才,嗯,Java和C#,PHP也算,就是不能算C和C++,为啥,学起来费劲,程序员学习成本高,自然价格也高,同样的功能,用Java实现,程序员满地跑,用C++实现,老板抱着程序员大腿哭,恐怕程序员都未必肯应聘,太少啦,也太贵啦。&
这不是肖某人危言耸听啊,我也声明一句,我一点歧视Java和C#这些程序员的意思都没有,仅仅是请大家比较一下,Java、C#程序员多,还是C++程序员多。&
不过,这并不说明C++程序员的优势啊,这反过来证明另外一个问题,大多数中小型企业,在研发上投入不会很大的企业,急于做出成绩,快速获得市场表现的企业,在同等条件下,即Java和C++都能满足需求的时候,会选择Java、C#、PHP等语言作为公司的主流开发语言,而不会选C++。&
这对Java等语言来说,其实是最利好的消息,当越来越多的公司需要这方面程序员时,程序员的市场越来越大,价格越来越高,而C++呢,虽然摆出一副曲高而和寡的样子,端着架子,但是,由于没有太多公司选择C++作为开发语言,因此,反而市场越来越小,找不到工作,即使找到,也得降价销售,这就是市场规律。&
这里我要说一句,其实C++程序员,我个人认为,前景并不好,从我个人经历,和很多朋友的感觉,发现有问题。主要就是不好找工作,工作机会太少,没有太多的选择空间,而Java的朋友们,由于选择空间大,其实很好谈价,我好几个Java朋友,薪水比我高的。呵呵。&
因此,我的建议,如果以后定位在应用程序员,主要做Client业务,建议不要选择C++,更多选择Java和C#什么的吧,工作更好找,还有,我的经验,薪水与语言无关,大家千万不要以为C和C++程序员薪水就一定高。高的有,肯定有,但是,不是所有人,也不一定就是你。&
嗯,说到这里,顺便说说第二个问题,C++找什么工作,我的经验,游戏,无论是客户端还是服务器,需要C++程序员的,不过,由于目前引擎公司越来越强劲,很多游戏公司自己不开发引擎,而是用买的,因此,客户端这边,恐怕需求会越来越少,主要恐怕以后还是做服务器需要。&
但是也很难讲,C++比Java主要就是速度,但是,硬件越来越快,多核开发越来越多,很多网页游戏其实用PHP已经够了,这个,C++程序员的工作空间也受到挤压。&
C不一样,C呢,在很多时候,做驱动,做嵌入式小规模应用,满够用的,而老板为了节约硬件成本,往往会挑选比较弱的平台,Java等脚本语言目前跑不下来,只能用C,嗯,稍微大点,用点C++也可以的。&
在嵌入式平台上,C++貌似还有一点市场。&
不过很难讲,目前的arm9已经接近当年P2的计算能力,随着嵌入式CPU的发展,嵌入式系统最终走向脚本化,也不是什么难事。&
其实,Java等脚本语言,针对C++最主要的优势就是没有指针,没有很多费解的东东,学习曲线低,程序员容易学出来,还有就是底层已经处理了很多细节,上层更多地专心与用户的业务,这样,用户业务贴合度好,更容易受到用户的青睐,还有就是,不处理复杂数据结构,大家都调用基本库,程序成功率高,bug率低,开发成本低,公司容易赚到钱。&
说白了,Java相对C++,不是技术在推动,而是钱在推动,所以,C++必败。&
com就不说了吧,com本质上是跨进程远端调用,dcom甚至允许跨机器。但是,大家想想,其实正是因为com的存在,进一步挤占了C++的生存空间,越来越多的基本C++功能,被以com形式提供出来,最终被Java、C#等其他语言所调用,扩充了其他语言的功能和性能,使原来仅有C和C++能做的事情,现在Java、C#等做起来也很好,很快。&
其实,我私人认为,com更像是C++程序员自己为自己挖的墓坑。&
当把基本功能支持完善,Java、C#等语言获得了更好的性能和功能支持,可以通过com调用很多C和C++的基本库,获得更好的开发能力的时候,纯UI,纯数据应用,其实已经被Java和C#牢牢占据了,C++没什么事了。&
嗯,针对你最后一个问题,学习方向问题,我的建议是,基础的要学,但是,出于好找工作的目的呢,我建议你应该学点html相关,css相关。&
如果不是立志,这辈子就要做一个C++程序员,(我总觉得纯正的C++程序员有点曲高而和寡,不好找工作),而是很务实的,希望毕业后在程序界迅速找到一份工作,我建议多学点Java和C#这类脚本语言,对于各种数据库的访问做到滚瓜烂熟,嗯,基本的数据结构和算法这不说了,要熟悉的。&
这样起码帮助你在毕业后,能找到饭碗。&
不过,这并不是说你这辈子不能做C++,当找到饭碗,工作稳定了,在有空的时候,是可以继续学习C和C++的,学好了,有合适的工作机会,跳一下也不是不行,说不定,收入更高。&
嗯,还是那句话,程序员就是程序员,写得出程序就是程序员。程序员不要在自己脑门上加太多修饰,什么C++程序员,什么Java程序员,什么Windows程序员,什么Linux程序员,这些加了修饰的程序员,其实不容易存活的。&
要能掌握程序设计的通理,什么语言,什么平台,掌握了基本的程序设计道理的时候,其实都一样。&
大学生,打好基础,毕业先抓饭碗,总不好意思工作了还要父母养活。&
在饭碗稳定的时候,随时注意学习,特别是注意利用自己的基础功底,跟踪主流语言技术,不断与时俱进,方能立于不败之地。&
C++不是永恒的,C不是,Java也不是,C#更不是,没有永恒的语言,没有永恒的平台,只有永恒的程序设计技术。&
这就是我的看法。&
嗯,本文写到这里,还是要补充一点:&
虽然上面本人写了很多关于C++前景堪忧的言论,不过呢,我本人确实还是在从事C/C++的开发工作。我想我并不是对C++有什么偏见,仅仅是想尽量客观一点,不带个人感情色彩,讨论一下C++程序员的就业前景问题。&
其实C++我认为还是一门非常优秀的开发语言,它与C配合,可以实现很多底层的调用,这是Java等语言无法企及的。&
比如我最近完成的一个高精度计时器(),实现了差不多0.0031ms的计时精度,就我个人的能力而言,恐怕只能C/C++来完成,其他语言也许能做到,但至少我不会。&
我也希望各位C++er能正确看待本文的论点,起码,我们现在还是一起的。呵呵。&
老兄这个说得有点好向与我感觉不同哟。我是从C#,JAVA转C++的。感觉很好找工作啊,
而且现在讲究用户体验,UI以及操作方面,客户端天然占优势。。而且现在桌面方面,windows下仍然90%的软件是C++的,其余的也大多被DELPHI,VB一类占据,C#,JAVA极少。。linux下C++半壁江山,mac仍然是C的天下。。(object-c也是C嘛)。。
开发效率方面,qt,c++ builder等IDE工具,几乎与c#一样块.
本文已收录于以下专栏:
相关文章推荐
从学习C++到现在已经有二个年头了,但是从来没有很深入学习,有人说C++是面向对象的编程语言,但是我在这里想说的是,C++是一个多泛型的编程语言,它既可以面向过程,比如我们完全可以用C++写C的代码,...
从学习C++到现在已经有四个年头了,但是从来没有很深入学习,有人说C++是面向对象的编程语言,但是我在这里想说的是,C++是一个多泛型的编程语言,它既可以面向过程,比如我们完全可以用C++写C的代码,...
一、C++服务器程序员(流媒体后台,游戏后台,高性能服务器后台)
精通C++,STL,Linux等,熟悉设计模式;
熟练掌握一门脚本语言(Lua, Pyt...
C++学习路线
从学习C++到现在已经有四个年头了,但是从来没有很深入学习,有人说C++是面向对象的编程语言,但是我在这里想说的是,C++是一个多泛型的编程语言,它既可以面向过程,比如我们完全可以用...
我现在是一名在校大学生,在学校期间自学C++有两年的时间了,看过C++Primer,stl,inside C++ model(侯捷翻译的那本),com本质论等...
在学习C++的过程中感觉C++语...
c++现阶段发展前景
C++出现也有将近30年了,我很想了解一下:如果作为程序员,现阶段C++能帮助程序员做出最独特的贡献是什么?还有c++如今会不会显得过时?究竟使用C++的根本目的能实现什么?
...
笔者就近几年的互联网发展发展,通过在各大就业招聘网站上检索到C++职位的相关要求,归纳总结出几大发展方向。给正在成长的C++程序员一条指引,当然也只是个人整理,仅供参考...
[摘要] 本文从初学者以及自学者的角度,详细分析了初学者的各种困惑,然后分析了编程语言,最后详细分析和指导初学者的一个今后发展和学习的建议。
一路走来,磕磕碰碰,走到现在,历经了千辛万苦...
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台。十行代码即可完成一个完整的网络服务器。
下面是echo服务器的代码:
#include >
using namespace...
由于很多朋友希望加入到Linux c++服务器端开发的队伍中,本人就结合自己的面试经历并整理了自己阅读的相关书籍,同大家分享,一起进步。人个认为以下是进入这个方向的必看书籍,各系列难度由浅入深的排序。...
他的最新文章
讲师:钟钦成
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)骑士团Unity3D系列教程培训群号:19352;Unity3D游戏开发之网络游戏服务器架构设计培;今天给大家讲一下如何做一个好的主程;入手;假如,我现在接手一个新项目,我的身份还是主程序;除了技术背景之外,考虑这些问题的时候一定要充分考;ProgrammingLanguage:传统来说;至于选择什么样的脚本语言,以及脚本在你的游戏中究;骑士团Unity3D
骑士团Unity3D系列教程培训
Unity3D游戏开发之网络游戏服务器架构设计培训(如何做一名好主程) 今天给大家讲一下如何做一个好的主程 入手 假如,我现在接手一个新项目,我的身份还是主程序。在下属人员一一到位之前,在和制作人以及主策划充分沟通后,我需要先独自思考以下问题: 1、服务器跑在什么样的操作系统环境下? 2、采用哪几种语言开发?主要是什么? 3、服务器和客户端以什么样的接口通讯? 4、采用哪些第三方的类库? 除了技术背景之外,考虑这些问题的时候一定要充分考虑项目需求和所能拥有的资源。 我觉得,先不要想一组需要几台机器各有什么功能这样的问题,也不要想需要多少个daemon进程。假设就一台服务器,就一个进程,把所需要的资源往最小了考虑,把架构往最简单的方向想,直到发现,“哦,这么做无法满足策划要求的并发量”,再去修改设计方案。 操作系统:越单一越好。虽然FreeBSD的网络性能更好、虽然Solaris非常稳定,但选什么就是什么,最好别混着来。前端是FreeBSD,后端是Solaris,运营的人会苦死。也不要瞧不起用Windows的人,用Windows照样也能支持一组一万人在线,总之,能满足策划需求,好招程序员,运营成本低是要点。不同的操作系统有不同的特性,如果你真的对它们都很熟悉,那么必定能找到一个理由,一个足够充分的理由让你选择A而不是B而不是C。但做决策的时候要注意不要因小失大。 Programming Language:传统来说,基本都是C/C++。但是你也知道,这东西门槛很高,好的C/C++程序员很难招。用Perl/Python/Lua行不行?当然可以。但是纯脚本也不好,通常来说是混合着来。你要明白哪些是关键部分,我是说执行次数最多的地方而不是说元宝,这些必须用性能高的语言实现(比如C/C++比如Java),其它像节日活动这样很久才执行一次的,随便吧。脚本的好处是,可以快速搭原型。所以,尽早的,在你做完基本的地图和战斗模块之后,立马跑机器人测试吞吐量。这时候项目开发进度还不到10%,不行就赶紧改。 此处特别举个例子就是Java GC的问题。既然你要用java,而jvm需要通过执行garbage collection来回收内存,而garbage collection会使整个应用停顿,那你不妨试一试,内存在达到峰值的时候会停多久?策划可以接受吗?如果不可以,你可以采用其它的GC策略再试一试。这个问题应该不是Java独有的。网游和网站应用相比它很注重流畅性。这是你务必需要考虑的。 至于选择什么样的脚本语言,以及脚本在你的游戏中究竟是占80%还是20%?需要根据需求来看。有没有游戏完全不用脚本?有。有没有游戏滥用脚本?也有。如果你引入脚本的目的是因为策划不会C/C++而你希望策划能自己独立实现更多的游戏功能。你希望策划去写脚本?脚本也是程序,策划写的脚本难道就比程序员写脚本好?还是因为策划工资便宜?策划骑士团Unity3D系列教程培训
因为脚本写错了导致大故障还少吗(此处特别以网易的产品举例)?综合权衡下,还是算了吧。问问你一起工作的程序员哥们儿,他们最喜欢什么语言,什么用起来最顺手,就用什么当脚本。注意不光要考虑开发速度快,还要考虑调试方便。 总体来说,操作系统和编程语言的选择,随大流即可。标新立异没什么好处。小地方的实现你可以玩玩,整体还是要越保守越好。 通信 然后说通讯的问题。服务器和客户端怎么连接上的? 往最下面看,物理和链路层。有可能是以太网,有可能是ADSL,在北京还有很多像歌华宽带这样的采用75欧同轴电缆或者电力线上网的。你不要企图在这一层做什么优化,你要充分考虑的是不同的网络传输媒质网络延迟不一样。更恶心的是你正常的数据包可能会被某些网吧的SB路由器当做P2P数据包给封掉,或是甚至被解析成Wake-On-Lan这样的含义。杨建还会给你讲,什么是MTU,把数据包限制在多大才能尽量让请求在一个包内发完。是的,这些很精细的东西,等咱游戏做的差不多了再慢慢研究。先略过。 往上看,IP层。再往上,你要考虑用TCP还是UDP或是二者混合。UDP的优势是overhead小、延迟低,典型的用例就是《天下贰》,据说是纯UDP。再比如《龙之谷》,据说是有小部分是UDP。负面的一点呢,就是它太过于简单所以用起来太过于复杂。你要是对自己没信心,TCP吧,随大流就好。 往上,采用什么样的应用协议。大多数rpc协议都是既支持TCP又支持UDP的。我所用过的有sun rpc、corba、webservice、json、java RMI以及一些专有协议。如果你有精力,还是自己搞一套吧,网游所用的东西,还是越专有越好,给抓包做外挂的人加一点门槛。这里非常强调的一点,你采用什么样的序列化方式与你采用什么样的网络协议是无关的,你的应用协议和你传输协议应该也是无关的(既支持TCP又支持UDP的)。如果做框架的人把自己限制的太死或者耦合太紧,那么用框架的人会非常痛苦。所以,没必要在此为了性能做过多优化。结构简单清晰是王道。 很多人对网络开发的认识还停留在定义一个struct、memcpy到socket buffer、send,然后一个劲的给别人强调遇到指针怎么办、数组的长度不能超过多少、整个包的长度不能超过多少等等。序列化其实是面向对象程序设计的一个很核心的要素。连glib/gtk/Berkeley DB这些纯C的框架都是基于OOP设计的,所以我觉得您就算是C程序员也没必要排斥它。我讲这个是说,你应当做应用的人尽可能的避免用memcpy/memset这样的方式初始化数据、传送数据。如果你是C程序员,你多提供一些g_object_new这样的函数;如果你是C++程序员,写好你的构造和析构函数;如果你是JAVA程序员还死活不懂OOP,那算了吧,改行吧。 网络这一层有些很精妙的东西,尤其是当你规模扩大需要分布式扩展的时候。你想想看为什么sun rpc需要先去rpcbind询问一次然后才连真正的进程呢?RMI返回的时候为什么需要同时返回IP和端口号呢?web service那么通用,大部分浏览器都支持直接从浏览器调用web service那么为什么主流的方式却是json呢? sun rpc是所有RPC机制中历史最久的吧?它在设计第一版的时候,每个rpc调用都是由一问一答来组成,称为two-way messaging。客户端在发出请求之后,一直等服务器的答复,骑士团Unity3D系列教程培训
如果一直到指定时间后依然没收到答复,那么执行timeout逻辑。在第一个请求收到答复(或者timeout)之前,无法发起第二个答复。直到某一天,Sun的程序发现他们需要异步处理一些事情,于是设计了one-way messaging,客户端在发起请求的时候,只要把这个东西塞到本地的IO队列里,就返回。但是如果socket buffer满了怎么办?还是会等在那里。于是觉得这个还不彻底,于是又做了Non-Blocking Messaging,在kernel的socket buffer前面加了一个用户态的rpc buffer,大多数时候它都是空的,当socket buffer堆满了的时候,再往这里面塞。如果这个buffer也满了怎么办?我觉得无非就三种处理手段: 1、阻塞。如果这么做,就是说本来是套非阻塞的设计但是某些情况下还是会阻塞?那么给用的人解释起来太麻烦用起来也太麻烦。算了。
2、悄然丢弃。 不是所有的数据都可以丢。聊天的无所谓,但是交易的就不行。所以需要在消息类型上加判断。
3、关闭连接。 最简单粗暴,却也最有效。 在使用two-way messaging的时候,一定要记住设置超时,省得像某些傻瓜一样因为一个请求把整个server堵死。但是我觉得timeout设多久完全是个经验值,太大了没作用,太小了失败的太多。 至少在有一点我们可以大松一口气,就是不用担心数据量大到需要多网卡同时分担中断。通常来说网络游戏的流量都是很小的,对玩家来说一个56K的猫或者128K的DSL就够了。如果你的策划给你提了一个很BT的需求导致要耗费大量带宽,那么你最好把这个应用分到单独的tcp 连接上,省得因为它阻塞而导致关键的业务(比如地图消息)停滞。 我一直想把rpc的部分实现塞到kernel里。对客户端的好处是增加了逆向工程的成本,对服务器的好处是网关可以很高效。就像LVS那样,前端收完包之后在kernel里处理完然后立刻转出去,不用切换到用户态。而GameServer处理完之后,甚至不用经过网关,直接回复。目的不在于分担网关的压力,而是说降低响应延迟。就算让GameServer承担部分加密和压缩的计算量,它的CPU也足够用。 不过对于网游,考虑动态扩容为时太早。一般都是新开几组服务器。
数据 我在做服务器安装包的时候,分的很清楚:程序、配置文件、数据库。 程序,就是编译好的二进制文件。最好是全静态编译,因为它简单。动态链接的优点以及其它一些高级话题我后面讲,但是通常来说,动态的复杂的结构得不偿失。 配置文件总体来说可以分为文本文件和二进制文件(废话)。文本文件的好处是开发过程中易于调试和修改,最终发布后也易于追踪问题。二进制文件的好处是小、精巧、不易把信息泄露给外人知道。java的打jar包的技术算是一个折衷的优势吧?我最看重的是易于调试和修改,所以基本都用文本文件。而这其中,表现力最强的就是xml,所以基本都是xml。 骑士团Unity3D系列教程培训
但是xml多了怎么管理就是个问题。我得整理份文档,每个xml都是什么格式,做什么用途的,最好每个xml再写一个xsd。事实是配置文件是随着需求变化最频繁的部分,而换个角度说我之前强调的序列化。所以,正确的思路是这样: 1、程序员分析需求文档,确定需要什么样的对象来表示配置 2、某套序列化框架,它利用某种xml解析库把xml变成内存中的对象 3、策划提供xml 只要这个框架做的好,根本不需要文档或xsd来描述xml。我这里说策划提供xml,那么策划怎么提供xml呢?按照我所看见的策划的习惯,他们最喜欢的是两种方式: 1、对于结构简单的数据,编辑excel表 2、对于结构复杂的(如涉及树、环的),提供专门的编辑工具 对于1,我们可以给excel做plugin,或者做一个工具从excel表导出成xml。对于2,让编辑工具可以导出成xml。但是最终很重要很重要很重要的一点就是要让所有的工具集成在一起,做好版本管理以及跨版本diff和merge。如何管理数据要比如何定义数据如何描述数据更难更重要。 很多同事和我的共识都是:要做一款好游戏,工具很重要。多个项目做完后,外人能看见的最大的积累就是工具和流程。 数据库 数据库在游戏中的重要性,是一个很令人玩味的东西。你可以听见很多人告诉你说,我们做游戏根本不需要数据库。是的,像单机游戏那样,在某个目录下创建一个文件,save/load就行了。这就是我所看到的当今的大型网游的主流做法。 哦,你要反对了。你说你知道某某游戏用的是mysql,某某游戏用的是oracle,等等。是的,你手上的信息可能比我多很多很多倍,但是关键点在于,数据库在整个系统中的角色到底是什么? 典型的场景是这样:启动一个单独的进程称之为DB Gate。当用户登录的时候,逻辑服务器找DB Gate要数据,DB Gate没有于是就去找后面的Mysql要,然后读过来之后就放在这里,DB Gate就是一个类似于memcached的东西。所以后面无论是用mysql还是oracle还是plain text都可以,但实际上会在其它方面有些细微的差别。 它和网站应用相比,数据更容易做cache,把握好上线和下线这两个点即可,cache的命中率很容易达到4个9或者更高。但是从另一个方面,网络游戏的数据关联逻辑远远比网站复杂,而且对原子性、一致性、隔离性要求更高。现在是你自己来管理cache,于是并发控制就没办法交给数据库来做。 问题一:我不自己做cache,我就直接读写数据库。就像php+mysql那样,中间也不套memcache,行不行? 我不知道。你可以试一试。 问题二:SQL or NoSQL ? 我还是回答不了。你做个demo跑机器人试一试。 骑士团Unity3D系列教程培训
总之,东西是活的。没有必要非要怎么着非不能怎么着。检验的标准很简单:1、是否完成了策划提出的功能需求 2、效率是否达到了预期目标 对于第一个,QA和策划都会去检查。对于2,跑机器人以及封测期间调优是王道。 对于数据库开发,我还是很强调面向对象那套观点。把数据库里的表映射到对象,把对象抽象成接口,每个模块以接口对外提供服务,不同模块不要直接通过表共享数据。或者,你可以读我的表,但不要写!因为数据的约束条件未必是可以由DBMS完全保证的,某些约束是难以用数据库本身的语言表述的。 数据是网游的核心,网游基本都是数据驱动的,所以数值策划才会这么吃香。 或者换个角度想,DBMS它是什么? 1、它管理数据。帮助我们高效的读取和修改数据。因为数据的动态性,所以我们需要Btree这样的结构,而不是随便找个TXT追加写。但是换个角度想,网络游戏有什么特点?插入多,但是删除操作极少极少。那么是否可以采用其它的结构呢?顺序重要吗?为什么不用Hash呢? 2、它负责备份和恢复数据。这基本是任何现代的数据库系统必须提供的基本功能。但是网络游戏又特殊一点,它要求能按指定时间“回档”。时间可以有半小时的误差,但是这个功能必须有。于是数据库能支持增量备份,或者它的备份能支持版本很重要。 3、它使用logging system保证在突然宕机的时候数据依然是完整和一致的。可是如果我们要自己做cache,那么就要求我们在应用层面所做的原子性保证必须在cache中也能体现出来。这些cache要么全刷,要么全不刷。 4、它提供并发功能。拿传统的php+mysql架构来说,为什么同一个应用可以被分布式的部署在多台机器上?魔力就在数据库上。 既然有人轻视数据库,那么也可反其道重视数据库。把90%的逻辑都放在数据库里完成。多招一些熟悉SQL熟悉存储过程的,主要的逻辑都由他们完成。 并发 接着说我在并发上的考虑。 一台机器还是多台机器?单进程还是多进程?单线程还是多线程?等等。 我觉得并发问题是最没章法可循的问题。你可以这么做也可以那么做。网络游戏的重点是在逻辑开发上,而做逻辑开发的人不要关心到底是epoll还是select。总之制定框架的时候需要定好一个规矩:单线程还是多线程、访问哪些数据的时候需要加锁(可能还需要跨进程的加锁)、谁来做load balancer、如果有一台机器宕了怎么办、哪些任务必须要以特定的顺序执行,等等。规矩定下来,一切都顺了。可这个规矩要足够的简单。 如果是多线程,我想过两种模式:Thread per Connection和Task based thread pool。现在机器的内存越来越大了,所以前者的开销是可以忍受的,1000人在线,就算每个线程要被系统占去2M,那么也才2G。而一般的3D游戏做个 3-4千人在线就行了,配个大内存的机器,三亿文库包含各类专业文献、幼儿教育、小学教育、高等教育、行业资料、文学作品欣赏、专业论文、中学教育、Unity3D游戏开发之网络游戏服务器架构设计(如何做一名好主程)51等内容。 
 Unity3D技术之游戏框架设计_信息与通信_工程科技_...事件机制、模块、 公用库等;如果是网络游戏,还会...学习网) 有人会问,U3D 开发为什么一定要一个主...  Unity3D游戏开发菜鸟快速上手指南_互联网_IT/计算机...可以把游戏的主框架搭建放在这个节点的脚本控件上,...期间统计游戏数据, 游戏结束把数据提交给服务器进行...  unity3D 游戏开发之工程代码框架设计思路MVC_计算机软件及应用_IT/计算机_专业资料...(2)根据逻辑(服务器返回数据)对 Model 层中的数据进行修改。 (3)回调 View ...  级双端(网页和客户端)中国风 MMORPG 网络游戏巨作...Unity3D 游戏引擎开发,角色扮演、实时战斗为主,辅以...坐标科技于 2010 年 11 月公司创立之初开始设计 ...  unity3d游戏开发之初探_计算机软件及应用_IT/计算机_...服务器的 Web 开发时代,Unity3D 则让 移动手游开发...(不过,我很少玩网络游戏,目前一直在玩的只有 Pro ...  (10个月) 游戏开发部 | 手机游戏服务器端主程 网络游戏 | 企业性质:民营 |...负责游戏(SocialGame)服务器端架构和框架设计与开发 负责核心模块开发(建筑模块、...  1 3D 引擎:Unity
引擎: ...为主的对象架构, 进了很大一步, 并拥有更好的...同时网络游戏开发,要 搭建一套对应的服务器系统,并...  unity3d游戏课程设计报告_工学_高等教育_教育专区。...要求使用 Unity3D 游戏开发软件实现上述游戏 Demo。 ...游戏开始触发器程序(main) : using UnityE usi...

我要回帖

更多关于 游戏服务器安全问题 的文章

 

随机推荐