01Recast & Detour 寻路引擎的基本流程
Recast & Detour是一个开源的寻路引擎,其遵循zlib协议,基本上你可以免费且无限制的将它用作个人和商业产品中。
从名字中我们可以看到,这个引擎分成两部分:
第一部分是Recast,主要功能是将场景网格模型生成用于寻路的网格模型(Navigation Mesh)。所生成的寻路网格模型当然要比原模型简单很多,这也提高了实时寻路算法的效率。
第二部分是Detour,主要功能是利用上一步所生成的Navigation Mesh进行寻路,其包含了多种寻路算法,根据不同的路径光滑程度与寻路时间效率的要求可做不同的选择。
02龙之谷服务器设计
9月23日,首届“梦想·匠心”腾讯游戏开发者大会于深圳举行,在技术分论坛上,盛大游戏《龙之谷》手游技术总监李阳分享了龙之谷的服务器设计。作为《龙之谷》的手游技术负责人,李阳从事多年游戏后端开发,参与多款上线项目研发。李阳于本次论坛上分享《龙之谷》手游服务器在架构设计、灾备处理、性能优化、压力测试等方面遇到的一些问题和经验总结。03pbc的一个陈年老BUG
这里就得提到pbc的两个feature。第一个是,如果一个optional字段的数据不存在,那么你尝试去读的时候,会返回一个默认值。这个默认值的话如果协议里不定义,整数是0,字符串是空串,而table就会生成一个新table,里面的数据全是默认值。
第二个是,如果某个optional的字段的内容是默认值,那么打包的时候会忽略。也就是说pack的结果的二进制里什么也没有。
说它是两个feature是因为,原生的protobuf是没有这回事儿的。二进制里没有,unpack的结果里去读也不会有;有数据但是是默认值,打包的二进制里也会有key-value,只是value是默认值(0或者空串),默认值一般都很小。
然后既然要自己动手,就得去读代码了。对以上features的实现,特别是读取不存在的数据的实现,并且为了高效pbc采用了默认值table的方法。什么叫默认值table呢?就是每一个protubuf的message,在第一次解包的时候,pbc的lua-binding都会生成一个默认值的table。
假设某个要读取的数据不存在,pbc的lua-binding会返回这个默认值的table。举个例子:
local msg1 = pbc.unpack('abc', buffer1)
-- 假设这时候nodata这个数据不存在
print(msg1.nodata.int_type)
-- 假设0是默认值,这里会输出0
local msg2 = pbc.unpack('abc', buffer2)
-- 如果buffer1和buffer2里都没有nodata的数据,下面两行会输出同一个table
print(msg1.nodata)
print(msg2.nodata)
那么问题就来了,这种情况,如果对解包数据是只读还好,一旦进行了写入,假设执行了msg1.nodata.int_type = 100,那么msg2.nodata.int_type也变成了100,并且以后解包的这个message的空数据里的nodata.int_type都变成了100。这也是最开始提到的那个BUG的原因。

04Lua查找表元素过程(元表、__index方法是如何工作的)
举个栗子:)
father = {
house=1
}
son = {
car=1
}
setmetatable(son, father) --把son的metatable设置为father
print(son.house)
输出的结果是nil,但如果把代码改为
father = {
house=1
}
father.__index = father -- 把father的__index方法指向自己
son = {
car=1
}
setmetatable(son, father)
print(son.house)
输出的结果为1,符合预期
05响应式布局设置--@media only screen and
body { background-color: gray; }
@media screen and ( max-width: 960px ) { body { background-color: red; } }
@media screen and ( max-width: 768px ) { body { background-color: orange; } }
@media screen and ( max-width: 550px ) { body { background-color: yellow; } }
@media screen and ( max-width: 320px ) { body { background-color: green; } }
这条规则翻译过来就是:
1. 显示灰色背景;
2. width为0-960px的,显示红色背景;
3. width为0-768px的,显示橙色背景;
4. width为0-550px的,显示黄色背景;
5. width为0-320px的,显示绿色背景;
06c++delete后虚拟内存不降的原因(疑似内存泄漏)
简单来说,文章开头内存不断增长的趋势的根本原因是:glibc在利用操作系统的内存构建进程自身的内存池。由于进程本身处理请求量大,频繁调用new和delete,在一段时间内,进程不断的从操作系统获取内存来满足新增的调用要求,但是从最终结果上来讲,总有一个临界点,使得进程从操作系统新获取的内存和归还给操作系统的内存达成相对平衡。在这个动态平衡建立前,内存会不断增长,直到到达临界点。
07GDB加载调试共享库
GDB要调试的共享库一定要加-g编译才可以调试,检查共享库是否有调试信息,需要在应用程序目录用gdb启动应用程序,然后执行指令 info sharedlibrary 即可查看否加载了符号表和调试信息08通过共享内存进行进程间通信
从表面上看,UNIX® 应用程序单独控制底层主机。它随时可以访问处理器,它的内存是神圣不可侵犯的,连接它的设备只为它服务。但是表面现象会骗人,这样有如君主一般的绝对地位只是幻想而已。UNIX 系统同时运行大量应用程序,有限的物理资源要在它们之间共享。处理器能力被划分为时间片,应用程序映像经常被换入和换出真实内存,设备访问由需求驱动,还受到访问权限的限制。尽管您的 shell 提示符不断闪烁,但是 UNIX 系统并非只是等着您发出命令,在幕后有许多活动正在进行。09Mysql使用和优化
游戏有大量的数据需要存储, 最早的服务器并没有选择数据库这种技术来做存档(那时候商业数据库太贵, 开源数据库太垃圾), 不过现在的游戏 大都用各种数据库在存储玩家的数据
数据大致分为游戏数据和日志数据, 前者主要和服务器交互, 后者主要用来做挖掘或者数据分析.

10游戏服务器的技术及组件
这篇文章, 不介绍通用的技术, 专门介绍游戏服务器内能用上的技术及组件等.11分布式模式
分布式定义:将一个完整的服务,按照业务功能,拆分成一个个独立的子服务。这些子服务能够独立运行在部署的环境中,它们之间通过RPC方式通信。12设计模式和反模式
设计模式提供了一个在架构师和设计人员中捕获知识和经验的机制。它们提供了一种公共语言,可促进对其他地方成功应用的方法的重用,从而为软件项目带来以下方面的好处:风险更低、质量更好且交付时间更短。
而在另一方面,反模式则记录出现错误的情况——对于普遍存在的软件设计缺陷、问题进行总结。
我们将从反模式入手,通过对错误的设计方法总结,延申出正确的设计模式。

点击排行

站长推荐

猜你喜欢
站点信息
- 建站时间:2016-04-01
- 文章统计:728条
- 文章评论:82条
- QQ群二维码:扫描二维码,互相交流
