《Unity3D高级编程之进阶主程》第十章,地图与寻路(四) 地图的制作与优化

地图的制作与优化

场景的制作占到所有项目制作中非常大的一块工作内容,这里我们不说场景制作在美术层面上的制作技巧,我们来说说技术层面的。上节把地图编辑器说了一遍,这节我们就在地图编辑器之外说说,地图场景的制作与优化。

思路探讨(二十七) 如何应对30岁的躁动

idea-talk 27

最近对自己影响比较深的一段话。

《Unity3D高级编程之进阶主程》第十章,地图与寻路(三) 地图编辑器

对于任何游戏来说,地图与场景的是比较重要的,特别是对于中大型游戏来说,在地图和场景上花费的时间和精力占去了大部分。而对于大部分游戏类型来说,布置场景,优化场景,甚至为场景写个编辑器是必不可少的,我们通常称他们为‘地图编辑器’。

地图编辑器有哪几种实现方式,该如何实现,顺便讲一讲从哪些方面下手优化场景,我们这节就来讲讲关于地图的事。

《Unity3D高级编程之进阶主程》第十章,地图与寻路(二) 寻路网格的构建

寻路网格构建

上一节我们了解了A星寻路的算法及其优化,A星寻路只是算法,需要配套的模块和工具链支撑,单独的一个A星无法运作因为它只是一个算法。

需要什么样的模块和工具链呢,我们这节就来讲一讲,最重要的配套模块‘寻路网格构建’。除了网格构建外,还有动态障碍物,以及地图和地形的构建,最后再配上A星寻路,才形成最终的地图和寻路。

《Unity3D高级编程之进阶主程》第六章,网络层(六) - 网络同步解决方案

当前网络游戏中网络同步方案有三种,即状态同步,预测信息同步,帧同步。三种方式并不是完全互相排斥的,很多时候我们在开发的时候,为了能都让游戏显得更加逼真,会让多种的同步方案一起使用。例如魔兽世界这种开放世界的多人在线RPG游戏,就使用了状态同步和预测信息同步两种方案,绝地求生、和平精英等战地竞技类游戏,也同时使用了状态同步与预测信息同步方案,而传奇世界、热血传奇等传奇类游戏因为不需要预测信息就只使用状态同步,王者荣耀等一批5v5地图类竞技游戏则使用了帧同步方案。

思路探讨(二十五) 困境中的中产

还是聊聊关于钱的事吧,人生哲学聊多了也没什么立竿见影的效果,能理解的瞬间就能懂,理解不了也只能等那灵光一现的时候。

思路探讨(二十六) 我们真的聪明吗

更多时候,我们不是败给了外界,而是败给了自己。

《Unity3D高级编程之进阶主程》第十章,地图与寻路(一) A星算法及优化

寻路一直是游戏项目中的热门功能,寻路算法用的最多的就是A星算法,其他也有,比如 Dijkstra算法 与 Floyd 算法,但是他们的在时间和空间上的复杂度都太高,Dijkstra算法时间复杂度为O(N^2),空间复杂度也是O(N^2),Floyd的时间复杂度更高有O(N^3),空间复杂度也在O(N^2),这种复杂度的算法寻路算法如果应用在游戏中稍微大一点的范围、大面积、稍微高一点的频率的寻路需求是CPU是无法承受的。

《Unity3D高级编程之进阶主程》第六章,网络层(五) - 剖析数据协议原理

协议包的格式,json, msgpack, protobuf 以及自定义格式

项目的网路层在建设中,除了选择长短连接TCP,UDP,HTTP方式外,还需要选择在传输过程中使用什么样的协议格式。

前面分析了TCP,UDP,HTTP的原理与应用,现在我们来了解下在传输层和应用层之上的逻辑层中,信息传递格式的选择与利弊。

我们将深入剖析JSON,MessagePack,Protobuf的原理,包括它们都是由什么组成的,怎么序列化的,怎么反序列化的,数据格式究竟是由哪些元素构成的,使我们对网络数据协议的理解更加透彻清晰。

我们以最常见的JSON格式作为切入点,一步步深入了解更加有效却复杂的传递格式。

《Unity3D高级编程之进阶主程》第六章,网络层(四) - 封装HTTP

HTTP协议原理

HTTP俗称短连接,由于其连接的时间较短,不受前端所控制,所以在互联网开发圈内,通常被以‘短’字开头。

在Unity3D短连接可以用.NET库来编写,也可以用U3D的内置API的WWW来写。差别不是很大,WWW对.Net做了封装,其功能已经完全够用在游戏开发上了,即使有情况不够用再用.NET补充也是很容易的事。(WWW在2018及以后的版本中都被废弃了,取代它的是UnityWebRequest,应该说封装的更好,但自定义部分则被削弱了。)

其两者的区别主要还是WWW把.NET库封装后再加了层用协程使得我们开发者在使用时更加的便捷,.NET库则直接用了线程,导致开发者还需要关注主线程与子线程的资源锁。另外WWW里面已经实现了IP6转换,而使用.Net库则还需要自己解析IP6地址,虽然对程序员来说自己用.NET实现更加接近底层实现,但同时也带来了更多需要花精力关注的地方,夺走了程序员些许宝贵的精力。

不管协程还是线程,其实两边都需要缓存和队列,如果没有缓存和队列,当网络请求量放大时就会出现数据丢失的情况。所以缓存机制在网络层是不可或缺的。