游戏开发

不同游戏类型的游戏服务端设计与电商的不同

星期四, 一月 5th, 2017 | webgame, 游戏开发 | 没有评论

本文来源于 DBAplus社群 韩伟 讲师的微信分享整理 (因无法获取微信中此文章的永久链接,故无法提供原文链接,见谅)

韩伟(腾讯科技互娱研发部架构师)
曾在网易任职8年,担任无线事业部产品总监。
多年来一直从事技术开发,擅长开发高性能系统,对于软件架构设计也有丰富的经验。
个人的技术兴趣在设计模式、软件体系架构等提高软件开发效率方面的知识

剖析的很不错,转载给以后回头总结及分享给更多游戏开发者

主题简介:
1、游戏类业务的通信模型分析
2、游戏类业务的数据处理流程分析
3、‍一般缓存系统的特点在游戏中的问题
4、现代游戏服务器端的几个典型运行时架构

一、背景

在中国的互联网诸多业务领域中,游戏一直是充当“现金牛”而存在的。常言道“隔行如隔山”,游戏领域和互联网其他领域确实可以说是不同的两个行业。但是,在游戏服务器端开发领域中的很多重要问题,并没有被明确的分辨出其特异性,从而得到专门的对待。

我们不管是在业界开源领域,还是内部分享中,很少会有专门针对游戏业务特征进行专门设计的组件、类库或者框架。我们从游戏的客户端方面来看,一款专业的游戏客户端引擎,已经是游戏开发的标配,比如最早的Flash Builder,到后期的Cocos2d-X,Unity,Unreal;但是服务器端,我们几乎找不到同样重量级的产品。

在游戏服务器端开发所有要面对的问题中,有两个是最核心和最普遍的:一是和客户端的通讯;二是游戏登录用户的数据处理。对于和客户端通讯的这个问题,大量的游戏开发者会使用“通用”的开源组件,比如Protocol Buffer、Thrift、Jetty、Node.js等等通信或RPC框架。虽然针对游戏,还是要做大量的改造,但一般都有很多现成的代码可供修改。

› Continue reading

Tags:

双hash减少用户名冲突JAVA版

星期五, 五月 8th, 2015 | JAVA-and-J2EE, 游戏开发 | 没有评论

游戏中要去校验用户名是否重复,redis中放中文的key貌似蛮怪的吧,还是hash后放数字吧,从而校验是否冲突;

hash冲突 例如“Af”和“BG”哈希值相同,则有“AfAf”,“AfBG”,“BGAf”,“BGBG”的哈希值也相同

具体关于java的Hash冲突攻击 可以参考此文章:http://keary.cn/?p=845

不废话了,实际双hash用途很多,还有就是java中的自带hash会出现负数比如 (-8%3) 就为-2 依赖取模后的值就会出问题;

上代码:
› Continue reading

Tags: ,

拆解游戏开发中策划配置动态公式问题

星期一, 四月 13th, 2015 | JAVA-and-J2EE, 游戏开发 | 没有评论

游戏开发中,策划总希望自己能配置奖励等公式,从程序这边对于这种太动态的东西是有点不太想去实现添加它;

既然有需求也要实现,从spring里剥离的SpelExpressionParser 可以很好的解决这个问题, 支持常见的 +—X/(加减乘除) 和指数计算^等

依赖 spring-expression-3.2.8.RELEASE.jar, 运行还需要 核心库 spring-core-3.2.8.RELEASE.jar
上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.i5a6.semp.test;
 
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
 
public class TestExpress {
 
	public static void main(String[] args) {
		int num = dynamicCalOutput(2, 2, "#playerLevel^(1/2.7)*100*#num");
 
		System.out.println((Math.pow(2, (1 / 2.7)) * 100));
		System.out.println(num);
 
	}
 
	public static int dynamicCalOutput(int lev, int num, String arithmetic) {
		if (arithmetic == null || arithmetic.length() <= 0) {
			return 0;
		}
		ExpressionParser parser = new SpelExpressionParser();
		Expression expression = parser.parseExpression(arithmetic);
 
		EvaluationContext context = new StandardEvaluationContext();
		context.setVariable("playerLevel", lev);
		context.setVariable("num", num);
		return expression.getValue(context, Integer.class);
	}
}

Tags: , ,

http协议的手游通信安全构想

星期一, 二月 16th, 2015 | JAVA-and-J2EE, linux, 游戏开发 | 没有评论

手游中使用http协议,很容易被劫包,获取对应的api接口地址和参数信息,用于篡改数据等制作脱机外挂等.

提升安全必须要做的事情,记忆下一个初步的构想方案.

1. api+key+时间戳+随机key(按照一定算法得出),MD5后生成摘要
2. 如果抓包拿到封装后的地址,照样可以封包访问,所以需要在服务端做限制,对于同一个请求只有第一次访问是有效的
3. 为了前端的反编译安全性,封装成.so包进行调用(提升破解门槛)

对只提供手机api的手机后台服务应用也适用

Tags: ,

libcurl升级后找不到libcurl.so.3解决之法

星期日, 二月 3rd, 2013 | linux, webgame, 游戏开发 | 没有评论

系统装的是libcurl 7.19的版本,编译的动态库是libcurl.so.4

自己的程序编译是在libcurl 7.15的版本下编译的,用的是libcurl.so.3的版本,要做下软链接即可:
根据自己使用的是32位系统或者64位系统 做如下处理:

1
2
cd /usr/lib 或者 cd /usr/lib64
ln -s libcurl.so.4 libcurl.so.3

Tags: , ,

使用libcurl为webgame服务端增加http访问功能

星期三, 一月 30th, 2013 | webgame, 游戏开发 | 没有评论

webgame的服务端代码使用c/c++开发,现在要使用http协议访问外网进行验证,为游戏增加这个功能,使用了比较出名的libcurl的库

用起来很方便,代码封装如下:

简介:1.安装curl的库 http://curl.haxx.se/libcurl/

2.对应的功能示例也蛮丰富的(自己根据实际需求改造了下)

3.编译下面的代码

1
g++ -l curl -o tcurl sq_curl.c

› Continue reading

Tags: , , ,

在线的棋牌类网络游戏java服务端实现

星期六, 一月 19th, 2013 | JAVA-and-J2EE, webgame, 游戏开发 | 没有评论

自己一直从事 页游开发看到一篇做游戏服务端的开发文章自然要收录下.(本文算是记录的蛮详细的,不过具体的性能优化,缓存,消息的处理等都不在其中,整体宏观列出了.)

本文来源于网络,好久之前看的,被收藏后一直没有看,今天看了后收藏到网站,原文地址:http://kakaluyi.iteye.com/blog/1489592.
一、网络

  网络游戏,首先面临的问题当然是如何进行网络通信。首先考虑的是HTTP协议,因为所有的J2ME手机都支持这个,我们当然想尽可能的兼容用户。而且HTTP协议封装程度已经非常高了,不用去考虑线程、同步、状态管理、连接池,不过HTTP协议有两个不爽的地方:

   ◇ 协议无状态,这个问题已经困扰过很多人很多次了。我曾考虑过的解决办法是改造HTTP协议,在数据传输完成之后不关闭socket,但是这样做工作 量非常大,在项目周期中,基本上就是Mission impossible,不予考虑。那么客户也就只能通过轮询的方式向服务器请求数据。

   ◇ 网络流量过大。就这个项目来说,网络间传递的只是指令,但是每次传递都要加上一堆毫无用处的HTTP Head,再加上客户端需要做轮询,这个流量 对于手机来说简直恐怖,经简单测试,按照0.03元/K的GPRS网络费用计算,一局牌居然要消耗1元多的费用(每秒轮询),实在不可接受。也许我们可以 采用流量费包月的资费方式,不过这个话题与技术无关。

  以上问题导致我们选择了Socket,这意味着我们将没有一个web环境,很多东西都要靠自己去实现:线程管理、客户状态监控、对象池、控制台……….

   网络部分打算采用Java NIO来实现,这是一种新的网络监听方式,基于事件的异步通信,可以提高性能。每个客户端连接之后,会有一个独立的 SocketChannel与它通信,这个SocketChannel会在用户的整个生存周期中存在。用户如果断开连接,服务器会得到-1,并且会抛出 Connection reset异常,通过捕获这两个特征,可以在用户意外断开连接后清理相关的资源。由于NIO是异步通信的,所以没有复杂的线程管 理。

二、通信协议
› Continue reading

Tags: , ,

webgame遭遇double free or corruption (!prev):

星期二, 十二月 4th, 2012 | linux, webgame, 游戏开发 | 没有评论

游戏在内测的时候遭遇到double free or corruption (!prev):
单从上面的理解很简单就是说 有地方调了2次 free();的内存释放函数.
查了下,这种低级错误的可能性不大,但是游戏的环境是在 一个多线程的代码,在主线程中申请了一块内存,在另一个线程中释放内存,估计是这个原因.

*** glibc detected *** /home/sara/webgame/t1: double free or corruption (!prev): 0x090634c8 ***
======= Backtrace: =========
/lib/libc.so.6[0x7c7261]
/home/sara/webgame/t1[0x804891e]
/home/sara/webgame/t1[0x9804fb0]
/lib/libpthread.so.0[0x8dcab5]
/lib/libc.so.6(clone+0x5e)[0x83383e]
00759000-008c7000 r-xp 00000000 fd:00 158979 /lib/libc-2.11.so
008c7000-008c8000 —p 0016e000 fd:00 158979 /lib/libc-2.11.so
008c8000-008ca000 r–p 0016e000 fd:00 158979 /lib/libc-2.11.so
008ca000-008cb000 rw-p 00170000 fd:00 158979 /lib/libc-2.11.so

进过排查和结合网上的遇到的说明修正如下函数:(另:可以在你做free()的统一函数地方做赋值指针为null做检测)
› Continue reading

Tags: , ,

游戏服务端C/C++与脚本语言(php,Lua,Squirrel)共服务

星期五, 八月 31st, 2012 | webgame, 游戏开发 | 一条评论

前两年一直用java做页游的服务端编程,也没有想过对应的语言混合编程,毕竟java可以一种搞定,效率上也还不错.
现在就职的技术老大以前是做客户端游戏出身的,c/c++功力比较牛,技术上就采用 c + Squirrel(一种类似Lua的脚本),刚好在网上看到有人提出为什么要脚本加C,简要回答记录下.

实际上只要底层通信和数据层做好对应的框架后(c封装并提供接口),游戏开发的关键还主要在 对策划功能的理解和实现,即功能实现的设计方案,主要业务逻辑的处理,偶尔也要呼唤底层c的支持而已. 个人的一点认识.

提问:
游戏服务端程序使用PHP与C交互实现与客户端通信,C负责实现处理聊天频道、地图、组队什么的,为什么要这么设计?使用PHP直接与客户端交互不行吗,或者只使用C。各负责什么模块,在这些方面有什么优势?

简要回答:
1.个人认为从语言特性,开发成本,以及项目组人员构成等方面考虑,这么设计应该是可以理解的。
C言语开发的工具运行效率高,但开发难度大,而像游戏中的聊天、地图、组队等功能其实各游戏之间的差别不会特别大,有经验的开发人员可以很容易的将别的游戏类似功能组件移植过来使用。
php言语开发的功能运行效率稍差,但开发成本要低得多,调整灵活,用php来处理一下业务逻辑是非常适合的。
另外像我们公司的游戏的一些对外接口,如跟平台之间的交互接口,我们平台部这边也一般是建议他们使用php来进行开发的。
对于做架构,我个人认为言语并不是最重要的,系统的瓶颈往往也不是因为某种语言,可以根据不同的需要使用不同的语言来进行灵活处理。
› Continue reading

Tags: , , , , , ,

Rss

Search

文章分类

Meta