|
一直对war3进行多人游戏时的同步机制很困惑,特别是发现GetLocalPlayer函数以后,所以在两台机器上做了一些测试,把测试结果给大家分享一下,可能很浅显,只是在论坛里没有找到讲解这方面问题的帖子
结论1. 全局变量和cache保存的数据是不进行同步的
定义全局变量integer g_test_num = 0
在函数里使用
set g_test_num = GetPlayerId(GetLocalPlayer())
那么玩家0的g_test_num就是0,玩家1的就是1,完全不会同步,即使过了很长的时间
使用StoreCacheInteger和StoreInteger之类的cache变量操作函数进行操作,cache变量也不会同步
结论2: 如果对象数据不一致,会导致非主机玩家掉线
其中的"对象"目前测试来看,包括unit, item, destructable, 等常用的界面元素,fogmodifier 不同步没有问题,更多的需要更有经验的前辈们说一下
结论3:每台机器的随机结果一致,如果使用如下的代码,会导致掉线(可能是让某个主机单独执行随机函数导致随机数不同步 )
if GetLocalPlayer() == GetTriggerPlayer() then
set rand_num = GetRandomInt( 0, 100 )
endif
结论4: 当一个单位被杀死时,实际所有的主机都执行了单位死亡的响应函数,而不是在某个机器上执行后,再把数据同步给其他主机(我开始以后会是这样)
因为,变量都一致,随机结果也一样,最后单位爆的东西也一样,如果你一定要加上GetLocalPlayer的函数,导致爆出来的东西不一样,对不起,下一秒你就掉线了
最后发现一个有用的东东:
如果一定需要同步的全局变量,可以使用如下类似的方法进行同步
call TriggerSyncStart()
call StoreInteger( cache, "test", "num", ??? )
call SyncStoredInteger( cache, "test", "num" )
call TriggerSyncReady()
主要注意的是:必须在trigger下使用此函数,如果在timer中使用,执行TriggerSyncStart后程序就跑飞了,后面的不会执行
处于Start和Ready之间的语句,应该是只在主机(第一个玩家)上执行,然后ready是把数据发给其他机器
结论:小心的使用GetLocalPlayer函数,这个函数很容易导致掉线问题
|
评分
-
查看全部评分
|