闲鱼技术01 发表于 2023-1-8 19:04

Unity3D游戏开发中一些常见的问题解答(五)

前言

我们在游戏开发中,总会遇到一些问题。那么今天我们就一些常见的问题做出一下解答
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!
1.Java游戏服务器怎么实现热更新?
服务器的热更新是指在不停服的条件下来实现热更新,把最新的代码更新上去,同时玩家能用最新的代码。这里面有两个方向,一个是假热更新,一个是真热更新。我们分别从两个方向来分析。
(1) 假热更新:
虽然不停服,但实际上我们是做了用户迁移,比如线上运营的服A的代码是1.0的版本, 然后我现在开发了1.1的版本,想不停服的情况下,让服A跑1.1版本,准备一个新的服(配置和服A一模一样),然后新服跑1.1版本,把原来老服A的导流入口导到新的服A这里,老服A里面等玩家结束,然后就不再导新流量进来了。这样老服A里面一段时间后就结束了。就可以停了,玩家都在新服上面玩。而玩家感觉不到。所以像《王者荣耀》这样的就很容易做成这种模式。
(2) 真热更新:
不停服直接更新代码部分,这里要特别的注意Java 一个类包含了类的方法与类的数据成员,最终编译完成以后是函数方法+对象实例数据,而不停服,意味着玩家的游戏数据对象(对象的内存布局在前后更新中不能改变) 前后不能发生变化,这种可以直接热更新回来。
在网关模式下,网关背后的游戏服可以先把所有的内存数据对象先生成到磁盘,然后再重启游戏服的进程,然后从磁盘数据里面重建玩家数据对象与当时的数据,然后在和网关连接起来。这种模式的热更新也可以,就可以同时更新代码+数据,可以选在夜深人静的时候做这个事情,可能大家会卡一下。
上面给大家总结了一些热更新的方式,不只是Java对于其它服务器也是适合的。
2.网游服务器逻辑和传输如何分层/解耦?
这个问题,其实是有一个序列化与反序列化的流程来解决,当网络传送层传过来数据后,序列化与反序列化模块会根据接收到的数据,序列化成一个数据对象(网络事件对象),然后根据数据对象的类型,找对应的游戏服务器的处理逻辑,进入处理流程就可以了。当我们要发送一个数据的时候,调用序列化与反序列化接口,把一个数据对象序列化成二进制数据,然后调用网络模块发送出去,即可。
3.现在Unity项目热更新主要采用的是Lua还是把代码写成dll呢?
常用的Unity热更新解决方案:
常用的Lua解决方案有: xLua, ulua, slua等这些Lua方案大同小异;
常用的C#解决方案有: ILRuntime
常用的TypeScript解决方案有: purts
目前公司里面采用哪种方案,一般都是由公司的技术总监来决定,都是比较成熟的技术,最好都能了解。
代码写成.dll,没有办法在IOS平台做热更新。
4.游戏服务器定时任务大家是通过什么方式实现的?
定时器解决方案:
有一些库提供定时器API,也可以调用系统的API函数;
可以使用线程的等待超时来做定时器;
对于服务端也会跑逻辑update的,也可以基于update来做定时器。
5.unity做帧同步的动作游戏,如何防外挂?
任何游戏都能被破解,都可以由外挂程序,防外挂最厉害的手段都不是技术,而是法务。
腾讯游戏的法务非常的厉害。
帧同步的游戏确实容易产生外挂,一般帧同步的游戏可以通过重要事件的验证机制,N个不同的客户端,来迭代计算同一场战斗,一些重要事件(打死一个怪,推掉一个塔)可以相互进行验证。
针对一些辅助游戏的外拐,通过分析他们的工作原理,从原理上来封掉它们,使一些外挂不能用。
附:学习视频地址
页: [1]
查看完整版本: Unity3D游戏开发中一些常见的问题解答(五)