|
魔兽中提供了Sync系列函数用来同步不同玩家的数据
但是也许是这些函数效率太低的缘故,只要执行的同步达到了一定的数量,就会导致魔兽出现触发停顿的BUG
所谓触发停顿,其实是我自己起的名字……
这种“触发停顿”不是卡,但又很像卡,具体表现在:
游戏能完全正常的运行,所有你的单位都会受你的控制,且并没有延迟。
但是触发在发生了事件的情况下却不会运行动作,而是加入队列。
比如:
正常情况下,我输入load后直接就会有Loading...显示出来
但是实际上什么都不会显示……
直到差不多一分钟后,所有触发会一瞬间全部同时运行
以前输入了多少个load就会同时显示多少个Loading...
[jass]
function test takes nothing returns nothing
local integer i
if(GetLocalPlayer()!=Player(0))then
return
endif
set i = 0
loop
exitwhen(i>5000)
set udg_index = udg_index + 1
call StoreInteger(udg_gc,"test",I2S(udg_index),udg_index)
call SyncStoredInteger(udg_gc,"test",I2S(udg_index))
set i = i + 1
endloop
endfunction
[/jass]
[trigger]对战初始化
事件
时间 - Elapsed game time is 0.00 seconds
环境
动作
游戏缓存 - Create a game cache from MapName.w3v
Set gc = (Last created game cache)
Wait 0.00 seconds
For each (Integer A) from 1 to 10, do (Actions)
Loop - 动作
Custom script: call ExecuteFunc("test")
[/trigger]
[trigger]未命名触发器 001
事件
玩家 - 玩家 1 (红色) 按下 the 向左箭头 key
玩家 - 玩家 2 (蓝色) 按下 the 向左箭头 key
环境
动作
游戏 - Display to (All players) the text: (String(index))
游戏 - Display to (All players) the text: (String((Load 30000 of test from gc)))
游戏 - Display to (All players) the text: Press Left.
[/trigger]
测试触发停顿.w3x
(12 KB, 下载次数: 11)
就像这样,执行触发之后,玩家一就卡住了……
但是玩家二还是完全没有问题…………
当然,单机测试时肯定是什么问题都没有啦,问题只出在多人游戏时。
那么,Sync除了用来做存档系统之外,很少会被用到,这个BUG有什么好说的呢?
实际上,除了Sync还有很多东西可以导致这种“触发停顿”,具体是什么我也不知道……
以前遇到过一些做大图和改DOTA的同学也一样遇到过这个问题,所以随便说一下自己的发现,希望对以后遇到同样问题的童鞋有所帮助吧……
这幅地图至少可以说明两个问题吧……
1)数据的同步和事件的反馈是一个队列里面的,这个队列里面肯定还有其他家伙~!
2)Jass真的是一个很@#¥……&&*的语言,限制太多了…… |
|