概述
一年之前,朋友开游戏公司,让我帮忙设计RPG游戏的后台架构,我思考如何兼顾开发效率和性能,最终想到了 php + swoole协程 + swoole_orm + zephir ,微信小游戏搜索:“剑的传说”
swoole协程有着极高的IO并发能力
swoole_orm 是我开发的php 扩展,有着非常高的性能、sql安全性和开发效率,开源地址为: https://github.com/swoole/ext-orm
游戏的战斗部分完全用 zephir 来实现,宣称像写php一样写php扩展,能做到同时兼顾性能和开发效率,整个技能过程属于计算密集型运算,如果用PHP实现,对CPU的压力非常大,PHP不擅长计算密集型应用,尤其在协程情况下,太高的CPU占用会导致其它协程饿死,尽管swoole支持抢占式协程,所以这里采用zephir将类php语言转化为c语言扩展,性能媲美c语言,而且开发速度快。(zephir 代码有机会我再开源出来,目前时机不成熟,游戏还比较火热)
后台框架开源地址:https://github.com/caohao-php/ycsocket
仅展示部分zephir代码,整个技能过程属于计算密集型运算,如果用PHP实现,对CPU的压力非常大,PHP不擅长计算密集型应用,尤其在协程情况下,太高的CPU占用会导致其它协程饿死,尽管swoole支持抢占式协程,所以这里采用zephir将类php语言转化为c语言扩展,性能媲美c语言,而且开发速度快。
伤害计算:
代码结构
————————————————
|--- server.php //启动入口
|--- system //框架系统代码
|--- application //业务代码
|----- config //配置目录
|----- controller //控制器目录
|------ Game.php //Game控制器
|----- dao //数据层
|----- library //公用类库
|----- service //业务层
请求路由
webSocket.send('{"c":"game","m":"ver", "userid":123593}');
输入参数为json, 根据 c 和 m 参数,路由到 controller/Game.php 下 verAction 函数。路由逻辑在 Application->run() 方法中,
路由之前,首先会调用 Filter::auth($params) 对参数验签,我们可以在该函数中加入自己的签名验证逻辑。
//system/Application.php
class Application
{
public function run(& $params, $clientInfo)
{
$ret = Filter::auth($params);
if ($ret != 0) {
return $ret;
}
foreach ($params as $k => $v) {
$params[$k] = trim($v);
}
$controller = ucfirst($params['c']);
$action = $params['m'] . "Action";
$class_name = $controller . "Controller";
try {
$obj = new $class_name($params, $clientInfo);
if (!method_exists($obj, $action)) {
unset($obj);
show_404("$controller/$action");
return $this->response_error(3, "route error");
}
$ret = $obj->$action();
unset($obj);
return $ret;
} catch (Exception $e) {
unset($obj);
if ($e instanceof LogicException) {
//业务异常
$errorcode = $e->getCode() == 0 ? 8 : $e->getCode();
return $this->response_error($errorcode, $e->getMessage());
} else if ($e->getMessage() != 'swoole exit.') {
Logger::error("Catch An Exception File=[" . $e->getFile() . "|" . $e->getLine() . "] Code=[" . $e->getCode() . "], Message=[" . $e