找回密码
 点一下
查看: 3042|回复: 6

关于全局变量引起卡机的研究

[复制链接]
发表于 2008-2-20 10:14:54 | 显示全部楼层 |阅读模式
最近在弄地图中发现,原来全局变量也是会引起卡机的,虽然没有缓存那么严重,但是一样会引起卡机事件的发生。

------正文-------------------------
比如以下这个触发:
单位受到攻击
设置udg_TestUnit[ GetRandomInt(0,8192) ]=攻击单位

这个事件会造成延迟么?

测试中,以上事件会引起大概1/20秒的延迟(在肉眼可观察范围内)
测试机器----Intel Core(TM) Duo CPU T2700 @ 2.33GHz   1GB内存(本本)

但是在另外一台机器上测试
---Intel Puntem4 3.0GHz 1GB内存(台式)
就不存在可察觉的延迟现象
--------------------------------------
那么,是什么导致了以上的延迟呢?
--------------------------------------
测试还发现,如果使用DataSystem,给每个单位加上唯一标识,SetUnitUserData后,事件变更为
设置udg_TestUnit[ GetUnitUserData(被攻击单位) ]=攻击单位,
在第一次受到攻击的时候会引起延迟,但是在之后则不存在延迟现象。

但是如果只是If(udg_TestUnit[ GetUnitUserData(被攻击单位) ]==攻击单位)then之类的写法,则不会引起延时。
--------------------------------------
所以结论是:

jass里面在第一次调用全局变量时,如果执行写入操作,会引起极大的延迟,尤其是当一次性对多个全局变量进行写入操作的时候会体现的很明显。

附测试地图。

DOTA_NewHero.w3x

348 KB, 下载次数: 1611

 楼主| 发表于 2008-2-20 10:16:31 | 显示全部楼层
关于如何避免关于全局变量延迟的方法正在研究中。。

以上测试地图里面有很多自己写的技能,学习jass可以拿去参考使用。
回复

使用道具 举报

发表于 2008-2-20 10:48:44 | 显示全部楼层
如果尽量在地图初始化的时候赋初始值~~在游戏过程中会不会好些呢?~~

我的cpu现在是3.0G的台式机~~怕是测试不出来呢~~所以只好问问lz~~

LZ的问题难道是双核的问题?~~
回复

使用道具 举报

 楼主| 发表于 2008-2-20 11:42:54 | 显示全部楼层
这个我正在测试,不过我猜想这样会好一些。

因为实际测试结论是,即使是整数型变量,在第一次赋值的时候也会出现莫名其妙的卡机,我猜想,war3里面的存储空间,是否根本就是从第一次赋值才开始分配地址的。。。。。

所以,需要使用的全局变量尽量在开始的时候赋值一次。
回复

使用道具 举报

发表于 2008-2-20 16:34:14 | 显示全部楼层
如果不用数组的话,普通声明时都set null 的吧
回复

使用道具 举报

发表于 2008-2-20 17:25:04 | 显示全部楼层
事实上,偶认为,war3中的数组本质上是一个"map"或者说是"dictionary"
在第一次写入时会创建一个内存空间所以会有一些延迟~
回复

使用道具 举报

发表于 2008-2-20 17:37:31 | 显示全部楼层
恩,同意LS的,最近研究了WAR3内存的分配方式,除了搞清楚所有结构类型数据的大小外,很明显的可以看出set XXX=AAA是要在先在一个MAP里搜索AAA数据然后将其索引附值给XXX的,MAP中数据是在UNIT等结构类型数据创建时写入MAP的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-21 21:47 , Processed in 0.127272 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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