网页游戏开发技巧
高负载
一款好玩的网页游戏,在线负载只能达到100人。那么可以肯定,返工难免、浪费机会难免。
服务器的高负载,分两个方面。一是服务器本身的硬件架设,二是软件对高负载的处理。
深奥的原理和技术,我也不懂。只讲一些实际开发中用到的小技巧。
负载的瓶颈
遇到过两种负载问题。
1、数据库缓存问题。
服务器在线20人,就出来不稳定和数据库暴库,
以及cpu经常100%
直接造成无法访问。
检查数据库日志发现,出来了大量的相同的语句。
这时候就需要做数据库缓存了。
优化过后。特别是一些全服公用信息缓存过后。
单台服务器在线1200人,cpu仍在10%左右。数据库正常。
简单的说,也就是可以冲击I/O的极限。
最多是反映略慢,而不会出现cpu,数据库,web服务器不正常等情况。
2、cpu问题。
(一款朋友开发的游戏)
服务器在线20人,数据库使用极低。Cpu在10%到15%
显然,程序不正常。
了解了过后发现。前台的大部分图形数据是通过服务器计算。
我给出的方案是两个方面。
一是计算放置到前端程序,但考虑安全性,需要增加一个加密key
二是服务器反馈的数据,不需要太精确,将前端比较精确的数据,转化为简单的几十个或者100种情况,达到同步效果。
这时候,前端用户看到的数据显示,仍然是精确的(前端计算的),但其他用户看到他的信息是服务器传回的模糊数据。这不影响游戏性。(对即时的要求很高。但数据精确要求不高。)
暂时还不知道他们的修改情况。
程序代码优化
1、 Php 适当的放弃 类,而使用函数。这是因为php的程序机制为一次性,然后全部over。
Java 对于比较核心的类,写一部分回收函数。因为java的垃圾回收机制不太稳定。
2、 在数据不超过100条的情况下多用线性函数。比如
function getXXX($i)
{
$xxx=array(
“1″ => ‘xxxx’,
“2″ => ‘xxx’,
“3″ => ‘xxxxx’,
“4″ => ‘oooo,
“5″ => ‘ooo’,
“6″ => ‘oo’,
“7″ => ‘oooxxx’,
“8″ => ‘xxxooo’,
“9″ => ‘xx’
);
return $xxx[$i];
}
3、几个常见的简单优化
for循环中,判断的值如果是count(array)的。请先赋值。因为如果写在for的判断中,会每次都计算。
php中,如果变量或转换多次,请考虑用@
比如$a=@getxxx()
因为这样可以少占内存。
判断的过程中,在某些特殊的情况下用退出。比如
if()
{
exit();
}
再比如。
if()
{
}
else
{
}
改为
if()
{
exit();
}
if()
{
exit();
}
特殊的情况,是指,某一个判断。出现几率明显高于其他判断的时候。
以及代码需要的时候。
这时候人为的造成代码中断。速度会快那么一点点。因为不需要去找下一个花括号了。
能写>的,不写>=
因为>=多算了一次=。
有点牵强,但是在架构本身不是非常强的情况下,要效率是只能是从小处和习惯着手。
4、代码也好,函数也好,对象也好。越简单越好。
有些高手写的代码谁都看不懂…不过,看看真正大牛写的书。代码很简单,很舒服。
越简单,越容易发现问题和解决。
一个简单的方式,不管你做的程序功能多强大。一个类最好控制在1000行以内。
别说什么XX万行的大程序。是否大程序,不是看代码数量的。是看质量。
5、有兴趣的话,读读布尔代数,相当有意思,对程序逻辑控制很有好处。
程序逻辑好了,效率自然高。
数据库优化
1、丢掉第三范式,尽量单表单id,复杂的表拆分为多个单表。
也就是用一定的数据冗余,产生程序的高效率。
举个例子。比如用户表中有玩家属性,玩家装备,玩家昵称等。
那么拆分为固定信息的表,属性信息的表,装备的表。3个。
这时候,获取玩家信息的时候用组合的模式。
或者类似这样的函数。
getUser(id)
{
User[base]=getUserBase(id)
User[att]=getUserAtt(id)
User[equip]=getUserEquip(id)
return User
}
看上去不太好看。但是程序的执行效率会比较高。这一条相当重要,简单的说,就是把数据库做的工作,转移了大部分到程序里。
2、尽量不要使用复杂的SQL语句,除非是短时间,或者极少使用的。
大部分数据库,SQL语句一写强大,后果就是抗压抗不了。特别对于即时性要求比较高的程序来说。(内存数据库,以及一些企业提供的方案不算,那是钱多的玩法。)
如果是新闻网站或者论坛,可以轻松的写成html或者设定一个数据库缓存时间比如5分钟10分钟,就能搞定了。但是游戏不同。几乎不允许长时间的延迟。
所以尽量只使用针对单表单id的SQL语句。比如select * form user where id=id
3、表类型分类一定要用数字或者enum类型。前台显示用数组对位返回即可。即最开始说的线性函数。
来顶了,呵呵,留个名字,天热 注意防暑~
这几天下雨了 家里网线出问题了 所以没来的及关注贵博客 望见谅
今天的天气真好,也光顾一下楼主的网站,文章写的真是太精彩了
不知什么原因,我的网站现在打开的速度好慢,楼主能帮帮我吗
来看看了,希望你的网站越来越好
路过一下,打扰楼主了
好几天没来学习了,今天来光顾一下,谢谢楼主!
文章写的很不错。
有意思。
一直找不到一种好的去雀斑的方法,谁能告诉我吗
我脸上的雀斑是小时候就有的,哪位好心人能告诉我怎么治吗
博主文章不错,我会经常关注
好文章,顶一下再说
我也来试试先
第一次来,很喜欢