关于network:在MMORPG中其他玩家和怪物的同步做法

1)在MMORPG中,其余玩家和怪物的同步做法2)AssetBundle通过Offset加密/解密问题3)加载预制体API区别4)对于MaterialPropertyBlock的应用问题 这是第340篇UWA技术常识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地把握和学习。 UWA社区主页:community.uwa4d.comUWA QQ群:465082844 NetworkQ:对于在MMORPG中,其余玩家和怪物的同步做法: 目前的做法是怪物和玩家都有一个状态机,状态的扭转是依据服务器下发的状态进行状态设置的,然而目前有个问题就是如果呈现本地卡顿或者网络稳定等其余起因导致客户端之前的动作还没有完结,服务器又下发了新的状态,这个时候如果间接设置新状态就会体现异样也会呈现地位不同步的状况(例如客户端还没有挪动完结,因为卡顿或者提早起因又收到了攻打状态,如果这个时候间接攻打就体现出又挪动又攻打的状况)。 因为之前没有这方面的教训,在网上查了其他人的做法,说是要做对其余角色的状态预测,如果呈现同步异样,用插值让异样的对象迅速复原到失常的状态。 那么:1. 其余玩家和同步是用状态机加预测去做的吗?2. 怪物同步的个别做法大略是怎么样的?和其余玩家相似吗?3. 在做同步的时候有哪些要留神的点呢? A: 其余玩家和怪物的同步个别会采纳状态同步和状态预测相结合的形式。状态同步是指服务器将所有角色的状态同步给客户端,客户端依据这些状态来更新角色的状态机。状态预测是指客户端依据本人的状态机来预测其余角色的状态,并依据这些预测后果来更新本人的视图。预测的后果须要通过与服务器的同步来验证,如果预测的后果和服务器的后果不统一,就须要进行状态修改。怪物的同步和其余玩家的同步相似,都须要采纳状态同步和状态预测相结合的形式。不同的是,怪物通常由服务器管制,因而服务器能够更准确地管制怪物的状态和行为,这样能够缩小客户端的预测量和同步量,从而进步同步的效率。在做同步的时候,须要留神以下几个点:状态同步的频率要足够高,确保角色的状态可能及时同步到客户端,缩小状态预测的误差。状态预测要尽量精确,采纳适合的算法和参数来进步预测的准确率。当客户端呈现卡顿或者提早时,须要采纳插值和修改等形式来让角色迅速复原到失常的状态,避免出现地位不同步的状况。须要对角色的挪动和攻打等行为进行校验,防止舞弊和外挂的呈现。对于客户端和服务器之间的通信,须要采纳牢靠的协定和加密形式来保障通信的平安和稳固。感激NG週@UWA问答社区提供了答复 AssetBundleQ:打包AssetBundle想用偏移量简略做一下加密: App版本应用:AssetBundle.LoadFromFile(filePath, 0, offset) 然而WebGL版本应用:UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(urlPath);AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request); 未找到相干接口,请问大家有没有什么思路? A:在WebGL平台上应用UnityWebRequest发送网络申请获取AssetBundle文件,获取到后在内存中进行解密,而后将解密后的AssetBundle内容存储到内存中。 在内存中加载AssetBundle,能够应用AssetBundle.LoadFromMemoryAsync(byte[] buffer)办法或者AssetBundle.LoadFromMemory(byte[] buffer)办法。 感激NG週@UWA问答社区提供了答复 LoadingQ:请问PrefabUtility.LoadPrefabContents和AssetDatabase.LoadAssetAtPath这两个加载预制体的API具体有什么区别呢? 都试过测试感觉差不多,速度上没多大区别:PrefabUtility.LoadPrefabContents之后须要PrefabUtility.SavaAsPrefabAsset保留和PrefabUtility.UnloadPrefabContents开释;AssetDatabase.LoadAssetAtPath之后,应用EditorUtility.SetDirty标记,而后AssetDatabase.SaveAssets保留。 针对以上问题,有教训的敌人欢送转至社区交换分享:https://answer.uwa4d.com/question/648047ab47691b75be04aa96 RenderingQ:3D麻将我的项目,一个牌面一个材质球。我应用了一个不带材质球的麻将预制体,而后在创立麻将牌的时候实例化预制体,依据牌面值查找并赋值对应材质球, GetComponent<MeshRender>().shareMaterial = XXXXX。 材质球应用的Shader是URP里的Complex Lit。 有个需要是点击手中麻将牌时,批改曾经打出的牌(雷同牌面的)在桌面的牌的色彩,但不能影响手中的牌的色彩。于是我用MaterialPropertyBlock的SetPropertyBlock办法批改已打出的牌的色彩值,然而不失效。 已打出牌的材质球的Inspector下方有提醒“MaterialPropertyBlock is used to Modify these values”。网上也有一些解答,但还是没搞懂。请问正确流程和做法应该怎么才行呢? 针对以上问题,有教训的敌人欢送转至社区交换分享:https://answer.uwa4d.com/question/647e96efe63c097f73e2f2d9 封面图来源于网络 明天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,咱们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起摸索分享。欢送更多的开发者退出UWA社区。 UWA官网:www.uwa4d.comUWA社区:community.uwa4d.comUWA学堂:edu.uwa4d.com官网技术QQ群:465082844

July 3, 2023 · 1 min · jiezi

关于network:使用Streaming-Mipmap后纹理内存没有下降的疑问

1)应用Streaming Mipmap后纹理内存没有降落的疑难2)TCP网络传输大端/小端疑难3)Texture Compression,Default和Override有什么关系4)如何疾速革除Log 这是第299篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。 UWA 问答社区:answer.uwa4d.comUWA QQ群2:793972859(原群已满员) TextureQ:为什么我在我的项目中应用了Streaming Mipmap然而在GOT报告中看纹理内存没有降落?是没有正确失效还是统计有问题? A:之前做过相干测试,发现GOT Online是能够统计到被Streaming Mipmap影响的纹理的正确内存的,所以我揣测你遇到的状况大概率还是没有正确失效导致的。以下是对如何让一张纹理利用Streaming Mipmap的简略流程总结,其中会注明须要特地留神的一些条件(有些被官网文档收录,有些则文档中没有,但试验证实为必要): 在Project Settings-Quality中开启Texture Streaming选项。然而试验发现Editor中开启该选项而真机上却会生效的景象,导致所有纹理的Streaming Mipmap设置全副生效。所以为了确保失效,首先应该在代码中调用QualitySettings.streamingMipmapsActive API全局地开启这个选项,能力确保Streaming Mipmap可用。调整1中设置的参数。比拟重要的参数是Memory Budget参数和Max Level Reduction参数。Memory Budget示意纹理资源的估算,默认值是512MB,但依据UWA的大量我的项目数据来看,中低端机上个别为200MB左右。它的数值代表的是所有纹理资源的估算——即,它既包含了非流式的纹理、又包含了咱们想要采纳流式的纹理——但这个“估算”并不代表纹理资源可占用的下限,只是Unity判断对于一个开启Streaming Mipmap的纹理到底采纳它的哪些Mipmap通道的参考值,非流式纹理可能轻易冲破这个估算。Max Level Reduction则是代表着Unity通过流式存储最高能取到哪一级的Mipmap通道,这个参数的优先级比Memory Budget要高,也就会造成理论内存超过预算的状况。(比方该参数为2时,则最多剔除Mipmap0和1通道,即使抛弃当前还远超出预算值也不会进一步剔除。) 也就是说,如果Memory Budget值设置的远高于我的项目中纹理理论占用的内存,则Texture Streaming可能齐全不起效,所有开启Streaming Mipmap的纹理仍将保留它们的全副Mipmap通道。 设置开启Streaming Mipmap的纹理。1、2中提到的设置只对开启了Streaming Mipmap的纹理起效,而这只是官网文档的说法,从实际操作来看,Texture Streaming只对同时满足以下三个条件的纹理失效: 1)开启了Streaming Mipmap且开启了Generate Mipmap的纹理(这一点官网文档中没有提及,事实上开启Generate Mipmap才会生成Mipmap通道供Streaming Mipmap剔除); 2)被即时加载的纹理(如一开始就曾经在场景中被依赖的纹理,即使开启了Streaming Mipmap其内存也不会发生变化,通过AssetBundle加载和Res.Load()加载的纹理则能够),也即官网文档中这句话的理论含意: 如果是进行Android开发,还须要关上Build Setting,并将Compression Method设置为LZ4或LZ4HC。Unity须要应用其中一种压缩办法进行异步纹理加载,这是纹理串流零碎所必须的操作。 3)Gfx局部内存(这里指的是纹理资源开启Read/Write选项时,复制到CPU端的那一部分内存是不受Streaming Mipmap影响的); Streaming Mipmap剔除Mipmap通道的法则。它的机制其实和Texture Quality是相似的。咱们晓得,开启Mipmap的纹理之所以会变成原来的4/3倍,实际上是它各个通道所占用的内存之和。举例而言,一个具备11个Mipmap通道的原大小为1MB的纹理(10241024分辨率、ASTC44格局),其内存占用为1+1/4+1/16+…的11项等比数列之和,即约4/3。等比数列的各项就对应了Mipmap0、Mipmap1、Mipmap2…等各个Mipmap通道。那么,当Max Level Reduction参数设置为2时,其实际意义就是保留Mipmap2和后续所有更小的通道,而剔除Mipmap0和Mipmap1通道,此时的内存大小为4/3MB-1MB-1/4MB=85.33KB。这和我在Profiler或GOT Online中看到的数据基本一致。对于采纳Streaming Mipmap计划的倡议。根据上述试验和剖析不难看出,Streaming Mipmap是的确具备一些长处的,对于对内存比拟敏感,尤其是纹理内存占用很大的我的项目,采纳Streaming Mipmap计划是十分正当和举荐的选项。与此同时,它的理论应用要求对我的项目中纹理资源的内存占用有相当的理解和布局——相干设置在Quality中,天经地义地应该思考到不同设施Lod分级时不同的设置。在中低端机中,设置尽量低的Memory Budget和尽量高的Max Level Reduction;在高端机上则恰恰相反,在内存可承受范畴内尽量开启最好的画面体现。除此之外,对于哪些纹理要开启Streaming Mipmap,个别是场景中3D物体的纹理,而UI模块采纳的纹理则尽量敞开。因为Mipmap的意义次要在于适应纹理在间隔镜头远近时的体现须要、防止失真等,而UI齐全不须要这些,开启只会白白浪费内存和计算工夫。感激Faust@UWA问答社区提供了答复 NetworkQ:网络协议规定对立应用大端数据传输,然而测试用小端数据发送,而后服务器收到间接返回给客户端,客户端能够正确解析。所以就有个疑难:数据传输不须要大小端转换?还是底层帮忙转了? 测试例子如下:音讯头部固定4个字节,值为body的长度。服务器没做任何解决收到音讯间接返回。客户端收到音讯先解析头部长度4个字节,拿到body长度再获取body具体数据。没有大小端转换然而解析都正确: { // 测试发送整数 var bodyMsg = "测试发送数据"; var bodyBytes = Encoding.UTF8.GetBytes(bodyMsg); // 发送头部长度,固定4个字节 int headLen = bodyBytes.Length; var headBytes = BitConverter.GetBytes(headLen); // 发送头部长度音讯 _sendSocketAsyncEventArgs.SetBuffer(headBytes, 0, 4); _socket.SendAsync(_sendSocketAsyncEventArgs); // 发送body音讯 _sendSocketAsyncEventArgs.SetBuffer(bodyBytes, 0, bodyBytes.Length); _socket.SendAsync(_sendSocketAsyncEventArgs);}A:测试发送的数据只有在多字节数据处理时才须要思考字节序,如果是Protobuf,是不必思考字节序的。 ...

June 1, 2022 · 1 min · jiezi