|
不好意思,最近常去下载一些源代码,缺了一点钱,瞎写些东西赚一点自己用。
cs服务器自动弹人的现象主要是出现在安装有AMXX/AMX环境的服务器上,尤其是运行了许多大型插件的服务器,例如:魔兽、岗哨、飞行器、火箭筒等娱乐性插件。
前段时间我自己写的amxx反作弊娱乐插件,运行该插件总是出现cs崩溃、自动弹人等现象,分析了一下amxx脚本的内存机制,发现amxx采用的就是java的内存管理机制,程序员只管申请,不管释放,释放由系统一个潜在线程自动回收,这个问题就来了,像java编写一些实时交互性很强的软件时,都要自己编写内存堆栈进行优化,否则程序效率会很低下。而cs这种高对抗性、高交互性的游戏,其要求更加严格。当服务器繁忙的时候,回收线程来不及工作,造成系统资源紧张,很容易就出现弹人、崩溃等种种不可预料的情况。
举一个极端的例子:amxx的枪击事件里面,这可以说是最频繁调用的事件之一了,如果在这个事件里面申请了大量的局部变量,系统的稳定性马上会变得很差。我本来想实现,枪击队友被扣钱,一点生命值扣100,没钱扣的时候被判友军伤害进行惩罚,但是在中家娱乐插件里面惩罚的函数太大了,在枪击事件里面一频繁调用,马上分不到内存了。
解决方案:
1、服务器CPU性能是关键,高主频CPU会有充裕的能力保证回收线程的及时运行
2、允许的情况下,调高HLDS.EXE进程的优先级,这样也尽可能争取保证回收线程的及时运行
3、像我这种情况,服务器一般,负担有很重,cs服务只是业余运行,绝对不能影响服务器其他主业务的运行,HLDS.EXE的进程只能调到最低,又一定要运行我写的娱乐反作弊插件,就只能采用java那样的优化插件了,自己构建内存堆栈,自己申请、自己释放。 |
|