在大概8到10年前, 2D的单机游戏盛行, 游戏重视的是可玩性. 那时候, 只要掌握了图像的移动, 再加一个好的创意, 几乎就能开发一款不错的游戏. 那些游戏, 瓶颈在于创意和计算机的速度.
而到了网络游戏, 特别是MMORPG, 需要的技术可就复杂多了, 甚至比Web开发所需要的技术还多得多了. 几乎从网络知识, 到操作系统, C语言, 脚本, 数据库, 3D等等. 但是, 现在的所谓的MMORPG引擎, 似乎就是图形引擎, 至少图形引擎的内容点整个"游戏引擎"的80%以上, 而在网络, 系统存储, 开发模式等非常少.
按我的理解, MMORPG开发的本质是实现一个超大规模的网络计算机. 这样想, 如果你有一个计算机, 网络带宽达到1T, 内存有1T, CPU能力相当于100个当下主流CPU, 那么, 我们就可以很容易实现一个能容纳10万人同时在线的"无缝世界"的网游. 因为, 这样的一个计算机, 你在内存中保存着对应客户端的"对象", 你可以非常快速地对这些对象进行创建, 查找, 更新, 删除操作, 以及网络接收和发送. 这就是所有的计算机应用的本质.
腾讯公司的《地下城与勇士》游戏同时在线人数据说达200万人. 对于这个数字我持保留意见. 但是, 一个名为萝卜游侠的外挂软件, 实现了该游戏的角色无敌, 秒杀怪物等作弊功能. 于是, 深圳南山区警方协同北京警方, 共同捣毁了该外挂的开发者 - 北京市萝卜科技有限公司, 并刑事拘留了多名犯罪嫌疑人, 其中大多是开发人员.
从这条消息, 我们可以看出两个重点.
1. 网游外挂开发竟然已经公司化和公开化了. 以合法注册的公司为掩护, 甚至制作的外挂也以公司名来命名, 这是很少见的. 从另一方面, 也佐证了网游外挂开发确实能产生即大的利益. 常常听到有某个大学生靠制作网游外挂, 每月也能收入过万.
2. 从技术上讲, 腾讯公司的《地下城与勇士》游戏被攻击的技术点可以说非常低级. 关键逻辑运算应该放在服务器端进行, 这是基本的常识, 而生命值, 魔法值, 攻击怪物的成功与否, 都应该由服务器来做最终裁决. 也许, 腾讯公司的技术人员基于性能或者某些考虑, 把这些判断放在客户端, 也许加密了, 但无论如何, 这种危险的做法都不应该再出现.
新闻链接: http://news.sina.com.cn/o/2009-09-28/040616369008s.shtml
像因特网的Web系统一样, 几乎所有的大规模软件系统, 都会使用脚本语言. 在网络游戏服务器的开发中, 也会应用脚本语言. 游戏开发常用的脚本语言主要有: Python, Lua. 本文介绍在C语言中嵌入Python支持, C语言和Python语言通过API进行交互.
任何两种语言要整合, 首先要解决通信问题. C要和Python进行通信, 要进行数据结构转换, 把C的数据结构转为Python的对象, 和把Python对象转换为C数据结构.
Read more »
几乎完整的程序或者软件, 都有配置信息, 一般保存在文件中. C/C++ 语言的项目一般使用 .ini 文件作为配置文件. ini 文件和成熟的库供使用, 但缺点很明显, 很难表达父子关系, 因为配置信息应该是一根树 - 配置树.
著名的Web Server Lighttpd 使用 LEMON 来解析配置文件. 有些软件还使用 Lua/Python 等脚本语言来做配置管理. 但很多时候没有这个必要. 配置信息只要是一根树即可.
基于这个考虑, 我开发了 C/C++ 的配置管理库, 可用来做程序/软件的配置模块.
-
语法定义:
- 空白字符为 '\t \r\n'(制表符, 空格, 回车, 换行)
- 忽略只包含空白字符的行
- 有效行以 '\t*' 开头
- 注释行以 '\t*#' 开头
- 有效行如果不是注释, 则必须是键值对配置行. key 和 value 之间用等号'='或者冒号':'分隔
- key 不包含任何空白字符, 两端的空白字符被忽略
- value 两端的空白字符被忽略
- 配置项可以有包含关系, 用一个 TAB 缩进表示父子关系
-
配置读取:
- 用键名获取子配置项
- 用斜杠'/'或者句号'.'分隔的配置项路径获取配置项
- 把配置项的值作为整形(int)返回
- 把配置项的值作为字符串(char *)返回
配置文件示例:
# this is a comment
author : ideawu
url: http://www.ideawu.net
proxy :
php =
host = 127.0.0.1
port = 8088
py :
host = 127.0.0.1
port = 8080
cgi =
pl = /usr/bin/perl
C代码示例见: http://www.ideawu.net/person/config/
在网络游戏等网络系统的开发中, 一般用多种语言配合开发. 用C来开发通信, 高密度运算等基础功能, 由脚本语言或者Java, C#等更高级的语言进行业务处理. 在这种架构方面, Web系统是最广泛, 功能最强大的一个应用. 整个因特网可以说是建立在脚本之上, 虽然Web服务器, 数据库大多是用C开发的.
C语言和脚本语言(本文中包括Java等所有高级语言)的通信有两个层次: 1, 编程语言接口(API); 2, 进程间通信(IPC).
编程语言接口的方式, 可以看作是线程单(进程内)通信, 在某些方面速度较快. 但是接口多样, 各种语言都不相同, 造成不必要的复杂度.
进程间通信包括网络通信(Socket), 本地通信(如管道). 使用本种方式, C语言与脚本语言是单一接口, 而且统一.
Web服务器可能包括两种通信方式, 如Apache可以通过fastcgi和PHP进行Socket通信, 也可以通过mod_php使用API与PHP进行通信.