精华内容
参与话题
问答
  • 海思开发经验

    千次阅读 2013-08-28 10:30:31
    海思网络摄像机常见芯片大概有 ...开发起来其实十分方便, 现在把开发过程中常遇到的问题列出如下,对初学者有个帮助 1.参考设计的原理图和PCB用什么打开?  请用OrCad打开 2.ubuntu系统,执行安装脚本的时候,提示sourc

    海思网络摄像机常见芯片大概有

    Hi3510 Hi3511 Hi3512 Hi3515 Hi3516 Hi3520

    海思官方提供了SDK, 开发板在taobao上都可以买到,非常便宜,

    开发起来其实十分方便, 现在把开发过程中常遇到的问题列出如下,对初学者有个帮助

    1.参考设计的原理图和PCB用什么打开?
      请用OrCad打开

    2.ubuntu系统,执行安装脚本的时候,提示source: not found ECHO: not found
    怎么办?
      ubuntu的默认shell不是bash,你要执行 mv /bin/bash /bin/sh 把默认shell改成bash

    3.make过程中,提示arm-hismall-linux-gcc: Command not found
      请把arm-hismall-linux-gcc添加到路径中去

    3.如何使用U盘
      插入U盘,然后 mount /dev/xxx /mnt/usb -t vfat

    4.如何tftp下载程序
      tftp -l 本地文件 -r 远程文件 -g 服务器ip

    5.为什么mount nfs不成功
      先在sdk里面找到lockd.ko nfs.ko sunrpc.ko,然后tftp到板子上,然后运行insmod xxx.ko

    展开全文
  • Unity游戏开发经验点滴

    千次阅读 多人点赞 2019-10-07 18:26:03
    游戏开发中会遇到各种各样的问题,只有经历过了才会深刻,这里就游戏开发的一些经验点滴给读者分享一下,先从代码说起。 从事IT行业这么多年了,写过或者看过很多代码,有的项目代码写的不错的,大家经过多年的努力...

    游戏开发中会遇到各种各样的问题,只有经历过了才会深刻,这里就游戏开发的经验点滴给读者分享一下,下面先从代码说起。
    从事IT行业这么多年了,写过或者看过很多代码,有的项目代码写的不错的,大家经过多年的努力都会从初级程序员到主程的发展,作为主程除了做架构设计,带团队外,就是审核代码,现在程序员写的代码,大部分都是只根据需求而写,游戏开发与其他开发最大的不同是需求经常变化,朝令夕改用于游戏策划一点都不为过。这就要求程序员再根据需求写逻辑时,多跟策划沟通,把一些可能发生的事情都考虑完整再动手写代码,即使这么做了,后期还会修改。所以作为逻辑程序员很难的。程序员能做的事情尽量减少自己的工作量,把代码设计的灵活一些,最好的方式就是采用数据驱动。

    数据驱动

    我在做端游的时候,项目经理说的最多的就是数据驱动,我们的逻辑是通过配置数据让其运行的,表的设计,这些就需要程序员跟策划协商沟通,每个表都有自己的唯一ID项,通过ID去查询数据,程序要做到,逻辑的增加只局限于几个文件,不要牵扯太多。切记在代码里面不能出现具体的ID号,这样一旦策划修改表项,你的逻辑就需要修改,看过一些代码把具体的ID号都写到程序里面了,这么做是非常不好滴,让人感觉不专业,非常业余,还有代码不加注释也是不能容忍的,这个是为了更好的传承,我们说一个公司的技术积累,这个积累也包括代码注释。
    在程序启动时,关于数据表的加载问题,很多程序员的一些做法是:在程序启动时,把数据表一次性加载到内存,然后用到数据时再去一条一条查找。这么做可以不?答案是可以的,但不是最优方案,因为首先把所有的数据表一次性加载到内存中,会占用大量的内存,很多人见过的表可能不是很多,但是一旦表格数量很多,表格数据达到万行以上就是一个灾难啊,为了防止灾难发生,加载时就要有选择的去加载,当前场景用到的数据表加载进来,分步骤进行。再有一个问题是遍历数据,服务器大家如果了解过应该知道,它可以离线加载数据,而且可以一次性加载,查找数据不需要去每条遍历,这样提高了运行效率,这种方式客户端也可以使用的,优化要从一点一滴做起。

    代码拆分

    再说代码的编写,看过游戏开发的代码,动辄几万行,至少几千行。让新人阅读起来非常费劲,再加上没啥注释,看代码简直就是灾难。这种代码就需要重构了,怎么重构?很简单的,首先根据功能进行划分,类有一个修饰词partial,它可以将一个类拆分成多个类,类的名字可以根据功能进行命名,这样一旦扩充起来可以使用多个类文件表示,不用在一个类里面一直写,这样会导致代码非常庞大,函数的定义可以根据类的功能名字去划分。比如下图所示的:
    在这里插入图片描述

    资源打包

    unity官方提供了一个打包工具,Assetbundle,我们可以将美术资源,音效,文本文件都可以打成Assetbundle,关于资源打包,我们还需要考虑依赖打包,因为很多模型都会彼此依赖,这个关乎内存的加载和释放。很多人打包并没有使用依赖打包,导致资源重复的加入到内存中,依赖打包还需要注意释放的先后顺序,这个可以通过引用计数的方式进行,另外,这个工具我们可以在此基础上进行扩充,比如加入版本更新的处理等等,效果如下图所示:
    在这里插入图片描述

    角色动作处理

    随着Unity版本更新,大部分公司使用的都是Animator,采用AnimatorController控制器的新动画状态机去处理Unity的动作切换,使用这个的好处是,该动画状态机使用了FSM的封装处理,加入了动作的融合,另外,提供了Humandoid模式,不同的角色可以采用同一套骨架的处理等等,Animator作为Animation的替代品,Unity官方一直维护着,细节的东西,Unity引擎都为我们处理过了,我们只需要使用诸如SetTrigger,SetInteger这些函数接口调用就可以,另外还需要动作的帧回调函数,可以采用配置表的方式进行,不需要每次都是在动作上自己填写,一旦动作更换非常麻烦,因为Animator它会牵涉到一些矩阵变换,所以,在不需要的物体上切记不要挂Animator这个组件。因为Max导出模型直接放到Unity引擎时,会自动挂上,导致程序运行时帧率降低,所以可以写个工具检测一下,不需要的可以直接删掉。

    Shader优化

    Unity官方提供了一些Shader,这些都是最基本的,在开发高品质产品时基本用不上,在我看来,它只适合于学习,不适合做产品开发。Shader的编写其实我们不需要一行一行的代码敲,有几个插件可以使用比如:Shader Forge和Unity自身的Shader Graph。Shader Forge,它为了适配不同的硬件会使用D3D,OpeGL,Metal等等图形库,它做的是非常全面了,但是在Android比较挑剔的情况下,我们是不需要的,可以把对应的#pragram 注释掉,这个也是一种优化方式,还有看一下Setpass call的数量,它也是Shader优化的一种方式,当然数据变量的精度也是需要考虑的,另外Shader中尽量避免判断条件语句和循环语句的出现,以及复杂函数的计算等等。
    现在游戏品质要求越来越高,角色Shader的渲染,为了提升渲染效果,美术需要制作多张图片,普通的制作方式已经不能满足需求了,也就是通用的法线,高光,反射这些已经无法满足需求了,这就带来一个问题,当程序加载角色资源时,会涉及到大量的图片加载,这样的后果会导致实例化一个角色时间比较长,当然加载时间长也会有其他因素,比如一些废弃的面和动作没有删除掉,但是我们能够控制的是可以将多张图片进行优化,比如颜色有RGBA,我们也可以将贴图按照RGBA通道进行合并,这种方式比较流行。
    后处理渲染效果,Unity提供的Post Processing Stack由于效率问题,我们一般会做一些优化操作,这个可以参考UE4的处理方式,可以将一些传统的算法优化,可以将UE4的移植到Unity里面。
    贴图的优化可以使用国外提供的压缩方案:www.tinypng.com

    特效制作流程

    美术制作特效流程,很多特效人员对其执行的并不是特别好,其实非常简单,主要分以下几步:
    第一步:一般的特效需要特效人员把特效制作好,按照原点的方式制作,不要产生位移;
    第二步:特效名字是根据使用者命名的,命名规范要做好。
    第三步:特效的挂节点通过配置表进行配置,然后程序动态的生成虚拟挂节点,这个事情可以由策划提供。
    第四步:关于一些特效大招,比如有镜头的控制,一般是由特效人员去制作完成,当然动作这块可以进行配 合,也可以在MAX工具里制作镜头移动然后交付给特效人员使用。
    第五步:特效制作完成后,需要策划跟动作一起验收,看是否满足需求,提出修改意见。
    第六步:将角色和特效放到游戏实际场景中去看效果,这个需要程序配合,提出修改意见。

    总结

    游戏开发会涉及到方方面面,这里只是把项目中暴露的一些问题做了总结,以备查阅使用。
    
    展开全文
  • 开发经验和屁股的关系

    万次阅读 多人点赞 2012-03-17 08:39:32
    昨晚为CSDN俱乐部的同学们做了一个讲座《微博开发、云平台及一个微博...按照预先的准备,要讲如何在校积累开发经验,突然冒出了批评某些官员“屁股决定脑袋”的观点,也就将屁股和开发经验放在一起发挥了一下。  当
      昨晚为CSDN俱乐部的同学们做了一个讲座《微博开发、云平台及一个微博应用开发的简单方案》。已经用屏幕录相机记录下来了,不想讲完一边和同学聊着,一边收拾,直接关机,教室中带有保护卡的电脑自然不给面子,录相文件就此完蛋。
      讲座中,难免要对同学们的学习做些指导。按照预先的准备,要讲如何在校积累开发经验,突然冒出了批评某些官员“屁股决定脑袋”的观点,也就将屁股和开发经验放在一起发挥了一下。
      当讲到了为什么可以尝试微博应用开发,我讲了三点:好玩、就业、创业,提纲如下:
             
      和同学们分析如何达到职位的要求。其中,最令人纠结的可能就是“两年以上开发经验”的问题。听到过不少同学的抱怨:“用人单位招应届毕业生,还要开发经验,坑的什么爹?”同学们的这种声音,似乎有道理。但细思量,这是一种典型的屁股决定论:屁股坐在大学校园中,还能有开发经验?
      我接触过不少的同学,他们真的是在校时就拥有了开发经验的。在校期间,利用可以支配的时间,选择合适的切入点,同学们完全可以开展课外的学习。学IT相关专业的,这种课外学习,一定是要结合实际,要奔着开发而去的,开发经验由此而来。其实,由于在校期间能够自由选择,开发经验所涉及的领域、层次可以更广些,多变些,随着自己的兴趣走。这个定在校园中的腚,在开发经验积累中还是有其优势的。
      开发要面向实际,面向生产一线,身在校园中,这一点如何做到?放在其他行业可能真是障碍。但在IT界,我们有的是优势。放眼整个行业,开源、共享、开放平台、外包,种种不受地域、时间、身份的机会,以各种各样的形式呈现在我们的面前。例如,Web开发、移动应用,门槛不是很高,同学们完全可以借助各种资源将自己的课外学习安排的有声有色,由做案例教程中的应用开始,到做出属于自己(最好是一个小的团队)的作品来。甚至,在不少场合,开发出的应用可以直接在互联网中发布,实现赢利的。这种模式在多年前似乎是个奇迹,但在网络发达的今天,在这样一个开放的世界中,应该是一个自然的事情了。
      注意到一些公司(尤其是大公司)的表述,要的是“开发经验”,而不是“工作经验”。没有讲开发应该是在哪儿开发的,为什么我们自己都不能接受在校园中积累开发经验的观点呢?当你在求职面试时,将自己在互联网中已经运行良好的作品呈现给用人单位,谁还会在乎这是几年的开发经验呢?当看到两年、三年的表述时,也千万不要掰着手指数自己几年了。有人开发了十年也就那水平,而有人一个月就能牛起来。人和人不一样,不承认不行。此语可能引出一些人的消极,看人家某某某,牛,我就不行。何不换种思维想问题:他能做,我为何不能?我现在不能,他能了,区别何在?我的应对方法何在?我没有方法,是否观察并仿效他,逐渐找到自己的节奏和方法?Everyone can cook. (《料理鼠王》中的名言,我喜欢。)不在乎能不能,只在于做不做。在校学习期间,同学们也正好处在一个可塑性非常强的时期,我给自己改变的机会,要倾力实施这个改变。
      实际用人单位,尤其是企业,真没有把“两年以上开发经验”太放在心上,似乎更在乎有个借口,将那些读了几年死书的人挡在门外。请看大量招聘要求中的最后一条:欢迎优秀应届毕业生加入。应届毕业生有的是优势,只在于你是否优秀。这个优秀也并非是门门功课90分以上。具体标准,不言自明。
      反观有些人,在校没有投入开发经验的积累,出了校门做了些杂事。如果真的不愿从事开发或者有机会做其他事情也倒罢了,只是有些人等来了两年,却没有积累上经验。大家想想,在“两年以上开发经验”中,是“两年”重要,还是“开发经验”重要?
      所以最重要的是尽快地投入,将自己的课外时间个性化地安排起来。如果做起来了,大学里有的是机会;反之,日子也就这样一天天地度过。
      屁股坐在了大学校园里,培养方案中规定的课程是要学的,非富的课余生活也是要的,对IT学生,开发经验也是可以积累的。只是需要同学们有一颗不断求变的心,抓住有利于你健康发展的机会。
      这么说来,屁股在哪的问题,对开发经验并无决定性的意义。





    =================== 迂者 贺利坚 CSDN博客专栏=================
    |== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==|
    |== C++ 课堂在线专栏  贺利坚课程教学链接(分课程年级) ==|
    |== 我写的书——《逆袭大学——传给IT学子的正能量》    ==|
    ===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====

    展开全文
  • Erlang 游戏开发经验总结

    万次阅读 2016-03-20 22:43:55
    现在回头看下这个问题,总结下erlang 游戏开发经验。就当是,为我过去一段时间的erlang开发经历,画上一个小句号。在写这篇文章前,我看过孔庆泉同学写过的Erlang 性能优化总结,字里行间有一点自己的体会,使得我...
    早早就想写这篇文章,但这段时间忙于工作的事情,就不自觉地给了自己各种懒惰的理由。现在回头看下这个问题,总结下erlang 游戏开发经验。就当是,为我过去一段时间的erlang开发经历,画上一个小句号。

    在写这篇文章前,我看过孔庆泉同学写过的Erlang 性能优化总结[2],字里行间有一点自己的体会,使得我心血来潮,好像重新做回了erlang开发的感觉。所以,现在回过头,整理下游戏开发对erlang的使用。

    1. 架构设计

    很多人都说Erlang天生分布式,归结原因是erlang分布式这块实现比较完善。节点间的通信是透明的,无论是节点内的进程,还是不同节点的进程,都可以使用 erlang:send/2 发送消息,而且数据不需要做任何转换。
    所以,很多项目会选用多节点架构,可以通过横向拓展(增加机器数量)来支撑更多负载,把性能压力大的子系统分配到不同的节点,这样,就可以支持更多的在线玩家。
    这样做的出发点是好的,但会引起一系列的问题:
    1、业务逻辑的问题:
      跨节点逻辑变得复杂,玩家数据同步、一致性问题,节点断开及重连的处理等
    2、语言局限性问题:
      节点间消息通讯要序列化和反序列化,原子传输要转成字符串,二进制复制

    那架构选择单节点,还是多节点?
    没有绝对,这要看游戏而定。假如你的游戏像页游那样,分服而且各个服之间交互较少,单节点会比较适合。但如果像lol那种对战玩法的游戏,多节点会比较合适,登录和玩法在不同的节点,玩家对战时选择集群内压力较小的节点做战斗计算。

    单节点,好处是玩家数据容易保证一致,运维方便。以常见的MMORPG游戏,单节点在16G内存,8核心CPU,可以支撑2k人稳定在线,考虑非活跃玩家,达到5000也是可能的。当然,游戏的框架要合理设计,做一些妥协,比如玩家寻路不能在服务端做,地图九宫格的设计,排行榜不实时刷新,控制同屏玩家数量等。现在,单节点做游戏服,还有一个重要原因是,现在的机器性能相较以前高很多了,加上erlang无锁的Actor设计在并发场合下解放了cpu,从某种程度上讲提高了cpu的运算能力。

    单节点的设计:


    多节点的设计:


    erlang节点注意一个问题,默认erlang节点是全联通的,也就是当一个节点加入集群时,集群其他所有节点会和新加入的节点建立联系。全联通带来的问题,集群节点间两两连接,随着节点增加,连接数量呈N*(N-1)/2增长,越发恐怖,连接本身占用了端口资源。更坏的是,为了检测节点的存活,erlang会定期发心跳包检查,即使一分钟一个tick,节点多的话也会造成大量的网络风暴。
    解决方法就是在集群中隐藏节点,就可以避免全联通,只要erlang启动加个参数即可 -hidden

    2. 数据库

    数据库io向来都是游戏的主要性能瓶颈,处理不好容易导致游戏卡顿,甚至崩溃。而通用的持久化策略就是,内存读写+定时持久化。玩家上线时,加载玩家频繁用到的数据到内存,玩家大多时候就是在读写这些数据。然后定时把这些数据从内存刷到磁盘,在玩家下线时也做一次持久化。

    说下erlang自带数据库 - mnesia
    实际上,erlang已实现了这样一套持久化机制,也就是 mnesia数据库。
    mnesia数据存储是基于ets和dets实现,对于ram_copies表使用ets;disc_copies表同时使用ets和dets,数据读写使用ets,dets做持久化;而disc_only_copies表使用的是dets
    这里先讨论 disc_copies的情况,mnesia启动时,会将 disc_copies表所有数据加载到ets表中,每次读数据都是读ets,写数据则会先写到ets,然后再写一份到日志文件中,等待定时(或定量)持久化刷到dets。
    通常disc_copies表可以满足我们的业务需求,但使用mnesia要注意一个问题。前面也提到了,mnesia启动会将表中的数据加载到ets,假如你的表过大,就会导致内存被急剧消耗掉。(特征就是,ets所占的内存比率过大)
    所以,使用mnesia表时,经常都是要disc_copies表和disc_only_copies表配合使用。那问题来了,什么时候使用disc_copies表,什么时候disc_only_copies表。

    最简单的就是,对玩家数据动刀。玩家数据默认用disc_copies表,如果长时间没登录后将这个玩家的数据移到disc_only_copies表,等到他下次登录时再将数据移到disc_copies表。
    之所以可以这么做,理由有两个:
     1. 游戏中玩家数据所占的比例较大,调整玩家数据可以获得明显收益。
     2. 玩家流失后回到游戏的可能性很小,就算有的话比例也不大。
    这么做的弊端就是玩家流失后重新登录的时间较长,但通过这种方式减少的内存很可观。

    mnesia的使用,还要注意3个问题:
    1. mnesia单个表2G文件大小限制,所以要自己分表,或者使用表分片
    2. mnesia集群功能,过多的人说有坑,但我没有这方面的经验,就不做讨论
    3. mnesia事务并发性太差,尽可能不用mnesia事务,多脏写;事务可利用进程实现,保证数据安全


    3. 进程

    每个玩家一个进程的设计已经成为了erlang游戏开发的潜规则了。这个没什么好讲,玩家进程修改自己的数据,进程消息同步处理机制保证数据一致性。可能有些游戏还会将玩家进程和scoket进程独立开,负责连接的建立和维护,协议封包解包,甚至做攻击的防范等。但如果玩家进程和socket进程同在一个节点内,显然整合在一个进程较好,erlang消息基于复制,中间多了一个进程,一次前后端交互要多了2次内存复制。

    那么,除玩家外,其他进程怎么确定?
    1. 地图进程
    每个玩家都是独立的进程,玩家pk要交换两个进程的私有数据,就要发消息给另一个进程处理。假如是强pk的游戏,同时有N个玩家一起打斗,消息就会繁多。因为数据一致性问题,进程间的并发机制就会弱化成同步机制,增加了战斗时延。
    所以,这里会引入地图进程,通常以一个地图一个进程。玩家进入地图时,会同步战斗相关数据到地图进程,玩家离开地图时,再将战斗数据同步回玩家进程。而在玩家进入地图到离开前的这段时间,一切的战斗计算都由地图进程完成。
    或者有人会有疑惑,就算有了地图进程,还是有同步问题,地图进程还是要同步处理pk请求,无法并发处理,玩家进程还是要等待地图进程操作完成。
    其实,对于玩家的pk请求,处理至少有两个过程,第一个过程是验证攻击的合法性,如是否有这个技能,技能cd,等等。第二个过程才是战斗计算,玩家进程检查合法性,再由地图进程做核心的战斗计算。另外一个,玩家进程除了战斗请求外,还有其他业务逻辑上的消息,容易出现进程挂起的情况,这时候,玩家进程不可能处理到战斗计算,就会导致战斗卡顿。

    2.公共进程
    公共进程指的是那些提供公共服务的进程,比如:
     1. 社交类,有好友、帮派、组队等,这些服务管理着多数玩家的数据,都需要一个进程来管理。
     2. 计算类,这类有一定的计算量,比如说排行榜,要有一个进程来承担计算。
     3. 广播类,有聊天室、世界聊天、帮派聊天、地图广播等
     4. 开关类,有活动系统,比赛系统等等,控制游戏活动的开启和关闭

    erlang进程虽然廉价,但是不要太过随意创建进程,比如创建一个临时进程异步传输数据等等。虽然这在某种程度上提高了并发性,但进程的创建和销毁需要一定的系统消耗,而且会导致项目中进程数量不可控,可能系统莫名其妙多了很多进程,这些维护起来也麻烦。再说,erlang同时存在的进程有最大数量限制


    4. 进程字典与ets

    进程字典是erlang游戏开发中最为常用的数据记录方式,理由很简单,因为它够快,差不多比ets快了一个数量级。但是,进程字典的数据为所在进程私有,无法跨进程直接get到进程字典的数据,而且,在进程被销毁时,进程字典的数据也会被回收。
    再说下ets,对比进程字典,ets的适用场景是跨进程读写数据。遇到一个数据频繁被多个进程读到,就要考虑使用ets了。另外,ets有归属进程,但归属进程销毁时,ets的数据就会被系统回收。

    对比进程字典和ets的实现,区别如下:
    1. 锁方面,进程字典为无锁操作,ets是读写锁
    2. 数据方面,进程字典数据在进程中,查询没有多余的复制操作;而ets,因为数据不在进程中,查询时会复制一份到进程。

    所以,进程字典通常是最优先的选择。假如玩家的数据是存储在mnesia,特别是玩家的核心数据,就有必要从mnesia读到放在进程字典中。前面讲到了mnesia是利用ets和dets实现的,玩家上线时将核心数据读到进程字典,这样,读写都在进程字典,就可以利用进程字典带来的性能提升。这个提升是很可观,毕竟快了一个数量级。

    前面提到了ets归属进程销毁时,ets数据也会被回收?
    那么如果预防数据丢失的问题,ets也提供了方法,通过设置继承者进程就可以了。
    ets:new(person, [named_table, {heir, HeirPid, HeirData}])
    当归属进程崩溃时,继承者进程就会收到信息 {'ETS-TRANSFER', Tid, FromPid, HeirData},并且,ets的归属权就会转交到继承者进程。


    5. 消息广播

    消息广播是游戏中的性能消耗大头,主要包括地图的行走、战斗广播,世界聊天广播。世界聊天广播可以通过控制玩家发送时间间隔来限制,地图中的广播包,比如行走和战斗包的广播实时性高,只需发给视野内的玩家就可以,不用全地图广播。所以常见的处理方式是,玩家的视野通过九宫格划分,玩家的地图广播只发送给九宫格内的玩家。

    如何在服务器压力大时,进一步优化广播消息:

    针对时效性高的数据包,不重要的广播包,可以选择性丢弃:
    1、挂机玩家不发送战斗包,特别是战斗buff。
    2、每N个包丢弃一个
    挂机玩家的判定,前端以玩家长时间没动作来判定,或者将游戏切到后台运行时判定。等玩家在游戏内点击鼠标,或键盘时解除挂机状态。

    这里再谈下,消息广播还可能进一步优化。通常,后端发数据给前端都会对协议数据进行序列化(封包),然后再发给前端反序列化(解包)。而广播数据,对于每个玩家可能都是一样的,没必要每个玩家发给前端时都各自序列化一次,就只要序列化一次,然后每个玩家拿到数据后直接发给前端。

    erlang消息广播要注意什么问题?
    1、reduction计数
    通常会启动一个消息管理进程,这个进程就负责把广播消息转发给对应的所有玩家进程。启用管理进程的一个好处是,进程发消息会扣除reduction,而且这个reduction扣除大小还受到接收者进程影响。假如直接在地图进程做消息广播,就会导致地图进程受到的调度极度减少,影响战斗计算。
    2、消息复制
    erlang消息发送基于复制,但对于比较大的二进制数据,则会优化成二进制引用,减少二进制复制带来的开销。所以,当一个消息要发给多个进程,特别是协议数据(发给前端也要先转成二进制),可以先转成二进制再发送。


    结束语

    文章到这里就结束了,这是我做 Erlang 游戏开发经验总结的一些经验,后续,我还会找时间总结更多的开发经验。最后呢,建议大家少上复制网站,如红黑联盟,这些网站复制了还会把文章来源网址删了,然后给了搜索引擎几个钱就排到前面去了。这样带来的问题是,文章我一开始写错了,但后来改过来了,这些网站是不会更新的,看到的人还以为原来的内容是对的。


    最后补充下,庆亮同学在知乎上提到的 erlang 游戏开发的情况:

    1. 捷游的梦幻飞仙在线人数峰值过了 4700(不分线、回合制)

    2. 明朝的仙落凡尘在线人数峰值到了 4300(不分线、ARPG)

    有兴趣的同学不妨看看这篇知乎讨论, 为什么一些网页游戏喜欢用Erlang做服务端 


    参考:

    [1] http://blog.csdn.net/mycwq/article/details/50939354

    [2] http://www.kongqingquan.com/archives/221

    展开全文
  • 多年大数据开发经验总结

    千次阅读 热门讨论 2018-08-24 10:02:23
    多年工作经验总结 初入行,搞大数据开发。得高人指点,先学mapreduce,不足一年,tez兴,后入此道。朝夕不倦,发愤图强,才能略知一二。无奈后浪推前浪,tez被spark拍在沙滩上,遂投spark之怀。继而抖擞精神,奋袂...
  • 十八年开发经验分享(01)学习篇

    万次阅读 多人点赞 2012-11-12 15:09:30
    很偶然的写了一篇博文“十八年开发经历小结”,本来打算只是简单回顾一下自己经历。结果没想到被CSDN放到了首页,反映也还可以,感兴趣的可以访问我在CSDN上的博客,点击这里,或者访问我在博客园上的博客,点击这里...
  • 跨平台客户端开发经验总结

    万次阅读 热门讨论 2015-09-22 16:25:21
    1 前言因为《猫科动物和企鹅在窗口外看机器人吃苹果》这出戏太美,很多公司都希望能全平台同时发布新版本app,还要能复用代码以降低开发成本。这迫使一部分已熟悉某个平台的先锋们转岗到另一个平台边学习边开发。...
  • 如何获取独立项目开发经验

    千次阅读 热门讨论 2009-07-31 10:48:00
  • IM开发经验

    千次阅读 2015-08-06 20:26:05
    已经连续写了7天的代码了。现在应该可以叫做有点经验开发人员了。 脑子有点乱乱的,明天再写。。。
  • UIWebView 开发经验

    千次阅读 2012-04-19 15:48:41
    1.禁止回弹 jQuery方式: $().ready(function(){ document.ontouchmove = function(e){ e.preventDefault(); } });其他方式: ...document.onload = function(){ document.ontouchmove = function(e){ e.pr
  • 1.Android目前的主流设备分辨率为480×800、720×1280、1080×1920,单位是像素。在做界面设计的时候请重点关注这几个分辨率。 2.在制作高清原型图的时候,推荐使用729*1280像素作为基础分辨率,这个尺寸720×1280...
  • 嵌入式GPS导航系统开发经验

    千次阅读 2011-01-21 14:00:00
    嵌入式GPS导航系统开发经验 一.地图数据篇 1.地图数据引擎与界面显示的代码分离; 2.地图数据与符号显示也就是地图数据显示分离(类似XML与XSL,XSLT关系); 3.地图数据要分层:如街道,国道,小区,...
  • 服务器端开发经验总结 Linux C语言

    千次阅读 2011-06-28 22:51:00
    简介在进行服务器端开发的时候需要考虑一些算法和性能问题,经过了几年的开发,对这方面有了一些经验,现在写下来跟大家分享和讨论。我主要是在Linux下进行C语言的开发,所以后面的实现都是基于Linux操作系统并用...
  • 但是公司都要求有开发经验,所以想自己上网学一个开发过程-- 因为从网上看到过一个视屏 就 是一个什么管理系统,有视频 手把手叫你一步步走下来 ,不也是相当与有开发经验了 所以想让大家推荐一个新手 的C语言...

空空如也

1 2 3 4 5 ... 20
收藏数 93,267
精华内容 37,306
关键字:

开发经验