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

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

1.尽量降低内存拷贝

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

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

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

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

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

-

游戏server设计的一些感悟的更多相关文章

  1. Java8 Lambda表达应用 -- 单线程游戏server+异步数据库操作

    前段时间我们游戏server升级到开发环境Java8,这些天,我再次server的线程模型再次设计了一下,耗费Lambda表情. LambdaJava代码.特别是丑陋不堪的匿名内部类,这篇文章主要就是 ...

  2. h2engine游戏服务器设计之聊天室示例

    游戏服务器设计之聊天室示例 简介 h2engine引擎建群以后,有热心网友向我反馈,想尝试h2engine但是没有服务器开发经验觉得无从入手,希望我能提供一个简单明了的示例.由于前一段时间工作实在忙碌 ...

  3. 课程设计个人报告——基于ARM实验箱的捕鱼游戏的设计与实现

    课程设计个人报告--基于ARM实验箱的捕鱼游戏的设计与实现 一.个人贡献 参与课设题目讨论及部分过程 资料收集 负责代码调试 捕鱼游戏相应功能的实现 实验环境 Eclipse软件开发环境: ARM实验 ...

  4. FPS游戏服务器设计的问题 【转】

    一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时 ...

  5. 游戏server之server优化思路

    本文仅仅是提供一些游戏server优化思路,当中一些思路是用在不同场合的,不是同个架构的.须要依据应用场景选用合适方式. 本文的引用的文章都是在自己写的在本博客内的.也都是上线开几百个服的成熟项目的. ...

  6. (转)FPS游戏服务器设计的问题

    FPS游戏服务器设计的问题出处:http://www.byteedu.com/thread-20-1-1.html一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击 ...

  7. 基于cocos2d-x的游戏框架设计——李成

    视频:http://v.youku.com/v_show/id_XMzc5ODUyMTI4.html?f=17330006 网易科技讯 3月31日,第四届CocoaChina开发者大会暨Cocos2d ...

  8. Scut游戏server引擎Unity3d访问

    Scut提供Unity3d Sdk包.便利的高速发展和Scut游戏server对接: 看Unity3d示为以下的比率: 启动Unity3d项目 打开Scutc.svn\SDK\Unity3d\Asse ...

  9. Elixir游戏服设计五

    在<Elixir游戏服设计一>里提到,按照系统功能划分成app要保证原子性很难, 现在想想也没那么难.保证原子性,无非就是需要某个单点去完成操作.那么选择玩家进程去做原子性工作就可以了. ...

随机推荐

  1. css 给div 添加滚动条样式hover 效果

             css .nui-scroll { margin-left: 100px; border: 1px solid #000; width: 200px; height: 100px; ...

  2. Spoj8093 Sevenk Love Oimaster

    题目描述 题解: 对于所有n串建广义后缀自动机. (广义后缀自动机唯一区别就是每次将las附成1,并不需要在插入时特判) 建完后再建出parent树,然后用dfs序+树状数组搞区间不同种类. 其实就是 ...

  3. Oracle数据库日常SQL的使用

    DDL 语句(数据定义语言Create.Alter. Drop.Truncate) 1.建表:create table 表名(): 2.复制表结构及其数据:create table 新表名 as se ...

  4. MySQL本地登录及数据库导入导出

    注意:本地MySQL服务要开启 更新整个数据库 1.将正式服务器上的数据库做备份 登录到正式服务器,执行如下命令:(注意空格) mysqldump -uroot –p密码 数据库名 -P 接口 --d ...

  5. kvm虚拟机的克隆以及快照

    克隆(常见有3种方法) 1 直接克隆(克隆虚拟机使用自己的磁盘) virt-clone -o vm-01 -n vm-02 -f /kvm/os/vm-02.qcow2 virsh start vm- ...

  6. 特殊权限和facl

    目 录 第1章 FACL访问控制    1 1.1 FACL简介    1 1.2 getfacl命令查看acl权限    1 1.3 setfacl设置文件的cal权限    1 1.4 批量添加a ...

  7. python:端口扫描邮件推送

    #!/usr/bin/env python import pickle import smtplib from email.mime.text import MIMEText import nmap ...

  8. .NET如何进行数据库连接

    在.net中连接sql server数据库,需引入System.Data.SqlClient命名空间: 1,最简单的连接方式: SqlConnection conn = new SqlConnecti ...

  9. Java高级程序员面试题

    1.你认为项目中最重要的过程是那些? 分析.设计阶段  尽量找出进度的优先级 2.如果给你一个4-6人的team,怎么分配? 挑选一技术过硬的人作为我的替补.其它人平均分配任务,每周进行全面的任务分配 ...

  10. zoj 2109 FatMouse' Trade

    FatMouse' Trade Time Limit: 2 Seconds      Memory Limit: 65536 KB FatMouse prepared M pounds of cat ...