cs插件吧 关注:8,204贴子:87,836
  • 13回复贴,共1

【小灰灰】CreateEntity 实体创建优化Alloc方案分享

只看楼主收藏回复

在近期,我的服务器中运行HLDS时候经常会遇到这个问题

我做了一个大灾变模式
但这个模式会导致这个蜜汁问题,这不是我第一次遇到 在很久以前我也遇到过这种问题,这个错误崩溃
是我无论如何都想解决的,但由于那时不清楚怎么办,所以这个问题就一拖再拖

在我的经验中,这可能是我用的数组太多了,导致内存不够,但当我把数组全部优化后 依然有这个问题,说明问题不在数组那边(也可能是,但这不是主要问题)
我们看看崩溃错误是什么:Cache_TryAlloc ,Try大概是尝试的意思,但Alloc是什么意思 我那时候真是不懂
我以为是内存溢出了,那这种情况下唯一的解决方法就是减少代码来优化插件,也可以更换一个大内存的服务器
比如64GB内存的,但当我换真正换了一个大内存的服务器后,发现问题依然存在,依然会崩溃
所以此时我已经考虑不是服务器的问题了,就是代码里面有什么东西有异常
经过我在上次百度贴吧提问后 :
https://tieba.baidu.com/p/5030036002
我看见了来自 「展鸿丶」这样的回复:

结合我所遇到的那个崩溃问题,很明显我插件中的Alloc超出限制了,那么Alloc是什么
百度的解释是:申请

光是这样还不够,我去问了许多dalao,最终得到了答案
>> 【在引擎的字符串池里添加一个字符串,返回index】
那如果已经知道原因了,那是哪里出现的问题
答案就是: 【创建实体的写法有问题】
我之前的写法是这样

相信很多制作创建实体的哥哥、姐姐们 都会这样去写代码,因为这样写看上去是最标准的,而且创建出来的实体也没有异常,但这样创建会出现一个问题 那就是 【占用越来越多的 Alloc】
是的,如果你没有理解错的话,这样就代表创建一个实体占用一个Alloc,我们已知Alloc不是无限的,所以
如果有需要创建许多实体并且还需要无限生成,比如说:射出去的 弩箭、抛物线榴弹、追踪导弹、各种各样的需要用实体来实现的效果,都会越来越多的占用Alloc,直到崩溃
如果我们之前的写法有问题,那么解决方法是什么?
那就是先注册一个Alloc,以后创建实体的时候只使用那个 Alloc 即可,这样以后无论创建多少个实体,只会占用一个Alloc,不会崩溃(关于这一点,如果有持有不同的意见,欢迎回复告诉我)
那么优化后的代码是怎么样的?

小灰将学到的经验分享给大家,希望大家为了自己的插件更多的优化,为了服务器更稳定的运行
感谢:@小飞CS@展鸿丶 的帮助
Q群:139659650
By 小灰灰


IP属地:重庆1楼2017-06-22 13:54回复


    IP属地:河南2楼2017-06-22 14:00
    收起回复
      赞,多分享写实用的小技巧吧~
      顺便:



      IP属地:广东3楼2017-06-22 15:31
      收起回复
        看来实体创建的教程又要拖后了,辛苦小灰灰啦


        IP属地:广西来自Android客户端4楼2017-06-22 15:56
        回复
          火钳刘明


          IP属地:广东5楼2017-06-22 16:24
          回复
            有个问题想问你来着


            IP属地:广东来自Android客户端6楼2017-06-22 16:43
            回复


              IP属地:浙江来自Android客户端7楼2017-06-22 17:17
              回复
                还好pawn里没有线程什么的,AllocString能销毁吗


                IP属地:山东8楼2017-07-03 23:24
                收起回复
                  哇 原来是这样啊!


                  IP属地:日本来自Android客户端9楼2017-07-03 23:35
                  回复