当前位置: 首页 > news >正文

营销型科技网站建设h5个人页面制作

营销型科技网站建设,h5个人页面制作,公司网站建设对公司的重要性,沈阳网站seo大家好!我是长三月,一位在游戏行业工作多年的老程序员,专注于分享服务器开发相关的文章。 本文是通用程序设计主题下的第二篇。这个主题主要探讨如何编写高效、健壮、易读的游戏业务代码,每篇从一个小点切入。本次讨论的要点是&a…

大家好!我是长三月,一位在游戏行业工作多年的老程序员,专注于分享服务器开发相关的文章。

本文是通用程序设计主题下的第二篇。这个主题主要探讨如何编写高效、健壮、易读的游戏业务代码,每篇从一个小点切入。本次讨论的要点是:如何合理地应对异常

异常(错误处理)是游戏服务器开发中绕不开的一个话题。合理地处理异常,能够将故障对玩家的影响降到最低水平,快速从错误中恢复,并提供充足的信息,避免以后再出现类似的问题。

有些编程语言(例如Golang)会把异常和错误分开,这里为了方便说明,用异常来统一指代这两种类型。因为这两者在处理方法上是相通的。

总的原则是根据异常的严重程度和影响范围在不同层次处理。对于服务器启动时的严重异常,应向顶层抛出,立即中止服务器运行;而对于仅影响个别玩家的异常,应及时捕获异常,避免影响其他玩家。

看下面一个Java写的例子。服务器在启动时调用start方法做一些初始化工作,其中包括对于Redis客户端的初始化:测试Redis服务器是否可连通,如果可连通初始化连接等。如果发现Redis服务器连接失败,抛出异常,这里不会对异常捕捉,而是逐级抛到顶层,让服务器进程中断运行。

public void serverStart() {	// 服务器启动时初始化// do some init work// ...RedisClient.init();	// 初始化Redis客户端,如果失败直接抛出异常,不要捕捉// do other init work// ...
}

这样做的好处是让程序员及时检查问题并做修正,避免后续问题的发生。试想,如果我们改成捕捉异常并恢复程序运行,那么当服务器启动完成后玩家正常进入,可是需要使用到Redis存取数据时才发现功能不可用,必然会引起玩家的不满。所以,对于这种影响全局的严重问题,不如在停服重启的时候就彻底解决好,解决了再对玩家开放服务器。

这种异常处理策略被称为快速失败(fail-fast),即检测到异常后直接抛出并中止程序运行。它适用于严重而且无法恢复的异常情形,好处是能第一时间发现和定位问题,并且避免错误对后续逻辑的影响。JDK中也有对fail-fast思想的运用,例如ArrayList是一个非线程安全的容器,如果在使用for-each遍历元素的同时又修改了它的结构,那么会第一时间抛出ConcurrentModificationException,快速而干净地失败,而不是冒着在未来不确定的时间出现不确定行为的风险。

对于全局性的严重异常,我们固然要fail-fast。但是对于仅影响部分玩家或者部分场合的异常,我们要及时捕捉并恢复,避免不恰当地扩大影响范围

在游戏中经常会有活动排行榜结算的场景。活动结束时,按照参与活动玩家在排行榜的名次依次发奖。通常这样的操作放在定时任务中执行。如果某一个玩家发奖出现异常,我们需要及时捕捉异常并记录详细的日志,避免影响到其他玩家。

public void giveAwards() {	// 为活动结算发奖for (Rank rankData : rankList) {int playerId = rankData.getPlayer();int rank = rankData.getRank();try {giveAwards(playerId, rank);	// 为单人发送排名奖励} catch (Exception e) {logger.error(e, "发送奖励失败,角色id是{},排名是{}", playerId, rank);	// 错误日志中包含详细的信息}}
}

对比一下,如果我们不对单个玩家发奖捕捉异常,那么出现异常时会导致所有人的发奖失败,势必会引发更多玩家不满,而且需要做更多补偿。由于我们及时捕捉异常,因此发奖失败仅仅被限制在单个玩家范围内,事后处理也要容易得多。

另一个限制异常影响范围的例子是服务器战斗。在逐帧进行的服务器战斗中,每帧运算出现异常时,需要及时捕捉,这样只会影响当前帧,而不会导致战斗直接退出,甚至战斗线程挂掉。

public void frameLoop() {	// 开启战斗房间的循环运算while (isStart) {long starTime = System.currentTimeMillis();try {room.update();} catch (Exception e) {logger.error(e, "战斗房间异常");	// 每帧计算有异常则捕捉,不影响下一帧}long endTime = System.currentTimeMillis();long sleepTime = frameInterval - (endTime - startTime);if (sleepTime > 0) {Thread.sleep(sleepTime);}}
}

捕捉异常时,我们要在日志记录充足的信息,以便后续追踪修复问题和做线上处理,不要忽略异常而什么都不记录。要记录的信息应包括完整的异常堆栈、角色id以及其他重要信息。例如上面提到过的发奖失败日志,除了异常堆栈,还应包括角色id和排名,这样方便事后为对应玩家做补偿。

logger.error(e, "发送奖励失败,角色id是{},排名是{}", playerId, rank);
http://www.yayakq.cn/news/584700/

相关文章:

  • 贵阳金阳网站建设公司网站推广的策略方法
  • 阆中市网站建设wordpress微信显示图片
  • 福州营销型网站建设北京平面设计公司
  • 网站辅助导航网站开发需要怎么做
  • 优秀国外网站邢台专业做网站费用
  • 房地产网站模版小吃培训
  • 营销型网站建设要求深圳网站专业制作
  • 网站文章更新WordPress挂文件下载
  • 网站开发三个流程外贸网站布局
  • 网站做的图上传后字变得很模糊做企业英语网站要注意哪些
  • 三亚中国检科院生物安全中心门户网站建设昆山网站建设昆山
  • 市住房城乡建设网站中国监察报电子版
  • 网站开发有什么好的论坛wordpress加cnzz
  • 泉州网站建设多少钱梧州网站建设厂家
  • 堵博网站建设在线解压rar网站
  • 制作网站要钱吗php如何解析wordpress
  • 网站没有织梦后台企业网站管理系统的设计与实现
  • 在线做qq空间的网站中山做外贸网站建设
  • 敲代码做网站多少钱个人网站可以做seo吗
  • 网站建设方案华为网站被墙的原因
  • 怎么做卖橘子的网站二维码图片
  • 上海专业网站营销手机怎么制作软件
  • 广州住建官方网站遵义网约车租车公司
  • 青岛做一个网站多少钱python网站开发 pdf
  • 好多网站权重都没了聊城东昌府区建设路小学网站
  • 找网站设计公司 看那些一元购网站怎么做
  • 网站的空间的提供商建设一个充电站需要多少钱
  • 买完域名后怎么做网站中国建设银行官网站e路护航
  • 网站建站网站299266co整合网络营销外包
  • jsp制作网站温州多语言网站建设