请选择 进入手机版 | 继续访问电脑版
查看: 14755|回复: 3

[BUG反馈] 重制版函数的BUG:无法超过约50000个操作

[复制链接]

3

主题

10

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2020-7-28 18:35:32 | 显示全部楼层 |阅读模式
本帖最后由 Blz1225 于 2020-7-28 18:40 编辑

重制版编辑器的函数有BUG:无法超过约50000个操作。也就是函数总操作次数无法超过约50000个,包括调用其他函数等,如果操作比较复杂,例如有乘法、除法、Sin、Cos,总操作数会更少。导致的问题就是,一些操作比较多的函数,会被强制退出,导致功能失效。

以下是测试数据:

情况1:

调用tst0()后,最后打印的信息是:"i0=50500",说明tst0()本应执行10w次,结果却执行了5w+次,说明这里tst0()被强制退出了。

function tst1 takes nothing returns nothing
// empty function
endfunction

function tst0 takes nothing returns nothing
local integer i0
set i0=0
loop
exitwhen i0==100000
if modi(i0,100)==0 then
call msg("i0="+i2s(i0))
endif
call tst1()
set i0=i0+1
endloop
endfunction

情况2:

调用tst0()后,最后打印的信息是:"i0=48900",说明tst0()执行一定的次数后,被强制退出了。

function tst1 takes nothing returns nothing
local integer i0=0
local integer i1=0
set i0=i1
endfunction

function tst0 takes nothing returns nothing
local integer i0
set i0=0
loop
exitwhen i0==100000
if modi(i0,100)==0 then
call msg("i0="+i2s(i0))
endif
call tst1()
set i0=i0+1
endloop
endfunction

情况3:

调用tst0()后,最后打印的信息是:"i0=33000",说明tst0()执行一定的次数后,被强制退出了。

function tst1 takes nothing returns nothing
local integer i0=0
local integer i1=0
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
endfunction

function tst0 takes nothing returns nothing
local integer i0
set i0=0
loop
exitwhen i0==100000
if modi(i0,100)==0 then
call msg("i0="+i2s(i0))
endif
call tst1()
set i0=i0+1
endloop
endfunction


情况4:

调用tst0()后,最后打印的信息是:"i0=3600",说明tst0()执行一定的次数后,被强制退出了。

function tst1 takes nothing returns nothing
local integer i0=0
local integer i1=0
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
set i1=R2I(Sin(i0))+powi(i0,3)+3*i0+10
endfunction

function tst0 takes nothing returns nothing
local integer i0
set i0=0
loop
exitwhen i0==100000
if modi(i0,100)==0 then
call msg("i0="+i2s(i0))
endif
call tst1()
set i0=i0+1
endloop
endfunction
回复

使用道具 举报

2

主题

12

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2020-7-31 11:07:18 | 显示全部楼层
果然感觉没有错,我就说重制版loop 上限提高.看了你的测试数据如果是真实的,那应该确实提高了很多
感觉别说三倍,二倍执行上限是稳稳的
你拿出这代码1.27上跑一下看是不是数据要下降一倍
回复 支持 反对

使用道具 举报

3

主题

10

帖子

97

积分

注册会员

Rank: 2

积分
97
 楼主| 发表于 2020-7-31 14:07:43 | 显示全部楼层
带来的问题是,不能对大量数据进行同时操作,必须要用计时器分开处理这些数据,而且要协调好处理的时间点,确保指定的数据已经得到了处理,才能进行下一步的操作。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2020-12-28 02:41:07 | 显示全部楼层
用lua就没限制了,过去没用过魔兽?jass有30字节码的限制。什么叫函数bug……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

魔兽争霸官方对战平台 ( 互联网违法和不良信息举报电话:0571-28090163 )

GMT+8, 2022-1-17 03:30 , Processed in 0.075534 second(s), 6 queries , Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表