• 游戏server设计的一些感悟


            时间荏苒。转眼间已经做游戏一年了,第一款卡牌游戏《完美神话》也已经測试上线了。十一之后開始推广渠道。这一年经历了无数次崩服、回档、卡顿后。如今server最终基本稳定。对于程序猿来说出问题是个好事情,仅仅有在问题面前才干高速成长。

    在这里把这一年在server瓶颈中所入的坑做一个总结,希望对大家有帮助。

    1.尽量降低内存拷贝

              memcpy对于server性能影响是很大的,以下给出memcpy的性能測试,能够看到在拷贝1M的时候已经用到0.7s,这对server性能影响是很巨大的;此外。放入大量对象的容器在拷贝时。容器内对象都会进行拷贝构造。也很消耗资源。

    避免的方法:假设是大容量的容器。尽量的选择放入指针。

                         假设是收发缓冲区,能够选择环形队列。结合writev,readv 避免memcpy,实现高效收发。

    拷贝size 消耗时间(微秒)
    1k 350
    10k 5502
    100k 96624
    1M 689399

    2.避免大容器遍历

                遍历大容器是很耗性能的,应该尽量避免。比如我们在设计消息系统的时候有个消息池,里面有10W的消息指针,之前未考虑到性能。每一个玩家登陆都会来变量这个池。结果300个玩家上来CPU就到了100%。通过性能检測工具perf查到有80%的CPU时间都消耗在了遍历这个池上。

    避免的方法:用时间换空间,巧用数据结构,用map、红黑树建立多维索引,尽量降低遍历。

    3.尽力降低加锁

                 多线程对锁的竞争是很激烈的,加锁对性能的影响是很巨大的。我们知道,单生产/单消费模式的共享队列是不须要加锁同步的(kfifo),所以尽量将多对一的队列拆分多个一对一的队列。这样就能够避免加锁了。比如我们的数据库是16个worker线程。假设公用一个队列必须加锁。势必竞争很激烈。

    我们对每个worker线程维护了一个跟主线程的队列。这样就能够无锁訪问了。

    4.降低内存的分配和释放

                  内存的频繁new 和delete不仅消耗性能,并且easy缠上大量的内存碎片  。对于游戏server而言,好的方法是用内存池,生成装备池、卡牌池、技能池等。不够时增量添加。假设须要释放,採用tcmalloc是一个不错的选择。

            眼下能想到的就这么多。以后再继续补充,假设有什么错误和不明确的地方,欢迎大家指出。

    -

    Echo Chen:Blog.csdn.net/chen19870707

    -

  • 相关阅读:
    nohup: failed to run command `java': No such file or directory
    HDU4845(SummerTrainingDay02-C 状态压缩bfs)
    Codeforces731C(SummerTrainingDay06-M 并查集)
    Codeforces485D(SummerTrainingDay01-K)
    POJ2227(优先队列)
    Codeforces833A
    HDU3534(SummerTrainingDay13-C tree dp)
    Codeforces687C(SummerTrainingDay03-D DP)
    POJ1811(SummerTrainingDay04-G miller-rabin判断素性 && pollard-rho分解质因数)
    HDU6113
  • 原文地址:https://www.cnblogs.com/llguanli/p/6898895.html
Copyright © 2020-2023  润新知