找回密码
 点一下
楼主: 10235724429

整数组会导致变卡

[复制链接]
 楼主| 发表于 2011-12-19 23:47:26 | 显示全部楼层
我在想怎么办额
楼上有办法吗???

我的图系统很庞大的,如果少了文字的说明,那么等于这个图已经死了!!!!
回复

使用道具 举报

 楼主| 发表于 2011-12-19 23:51:56 | 显示全部楼层
我看了两遍你所讲的泄露问题。。。。
不好意思,看不懂= =!
有什么办法解决这个问题么?

PS:我去做一段录像,然后传过来你们看看,怎么解决这个问题!!!!
回复

使用道具 举报

 楼主| 发表于 2011-12-20 00:03:41 | 显示全部楼层
好像没有办法解决额。如楼上上上所说一样,3个字就5个泄露的话,我显示一堆文字,那岂不是要泄露致死= =!

看来已经没有办法,无力回天了

[s:198] [s:198]
回复

使用道具 举报

发表于 2011-12-20 00:07:31 | 显示全部楼层
Conflux:据说呢,初始有256个字符串空间,之后每满256个字符串会请求新的空间,这样子
影响到速度的是字符串的个数,而字符串的长度就无关紧要了。 (2011-12-19 23:45)
所以说。。

比如显示文字,显示完之后就没用了吧,那么直接free掉不就好了……下次再用再申请,虽然效率稍微低了点

莫非由于魔兽本身不需要过多的字符串,于是暴雪优先考虑效率了……

算了。。不去想了,WE本来就是各种受限的东西
回复

使用道具 举报

 楼主| 发表于 2011-12-20 00:10:05 | 显示全部楼层


意思就是说我的图完蛋了= =!!!!

真他娘的给力,我做了这么久,居然就这么他娘的完蛋了!!!
回复

使用道具 举报

 楼主| 发表于 2011-12-20 00:14:06 | 显示全部楼层
话说有一点意思就是,相同的文字显示不会产生新的泄露是吗?
回复

使用道具 举报

发表于 2011-12-20 00:24:46 | 显示全部楼层
10235724429:话说有一点意思就是,相同的文字显示不会产生新的泄露是吗? (2011-12-20 00:14)
狼大的那篇我很早以前看的,有些东西忘了。。之后空了再去看一遍吧……

大致上应该是那样,你可以减少两个字符串相加以减少字符串个数,那样的话多少能提高点效率
比如之前Conflux说的“不”+“要”+“啊”会创建五个字符串,那么写成“不要啊”就只产生一个字符串了

还有一种就是,要用+拼接的字符串用多次运行显示字符串分开,虽然多次运行也会降低效率,但感觉上比泄漏要好一点
比如显示“不”+“要”+“啊”
改成显示“不”;显示“要”;显示“啊”
于是只产生了3个字符串


PS:以上是没有任何测试的猜测……
回复

使用道具 举报

 楼主| 发表于 2011-12-20 00:37:32 | 显示全部楼层
[s:166]

真的还是假的= =!我有点想要做成漂浮文字,这样单个文字生成的话,那么基本上可以解决泄露问题。虽然工程量很浩瀚啊

问题还有就是如果按你说的分开显示文本,那么就不能对应行距了!!!
回复

使用道具 举报

发表于 2011-12-20 00:44:46 | 显示全部楼层

回 26楼(chyj4747) 的帖子

chyj4747:狼大的那篇我很早以前看的,有些东西忘了。。之后空了再去看一遍吧……

大致上应该是那样,你可以减少两个字符串相加以减少字符串个数,那样的话多少能提高点效率
比如之前Conflux说的“不”+“要”+“啊”会创建五个字符串,那么写成“不要啊”就只产生一个字符串了
....... (2011-12-20 00:24)
嘿嘿 我是没经过任何测试的搬运...

楼主稍安勿躁 字符串没有几万几十万不会明显卡的
但愿是别的问题,如果不是也没关系
楼主用jass写这一类东西可比用触发编辑器一个格子一个格子改轻松的多,又美观又方便修改。
回复

使用道具 举报

 楼主| 发表于 2011-12-20 00:46:16 | 显示全部楼层
也就是说这样子的东西泄露量巨大= =!
[trigger]
如果所有条件成立则做动作1,否则做动作2
                            If - 条件
                                A212[A27] 大于或等于 1
                            Then - 动作
                                如果所有条件成立则做动作1,否则做动作2
                                    If - 条件
                                        (转换 (截取 (A215[A212[A27]] 的名称) 的 5 - 5 字节部分) 为整数) 等于 1
                                    Then - 动作
                                        游戏 - 对 ((触发单位) 的所有者) 在屏幕位移(0.00,0.00)处显示 12.00 秒的文本信息: (((|cffffff00(等级 + (转换 A213[A27] 为字符串)) + )|r|cff00ff00) + ((A215[A212[A27]] 的名称) + (|r |cffffff00 + ((转换 ((转换 A214[A27] 为实数) / (转换 (截取 (A215[A212[A27]] 的名称) 的 3 - 4 字节部分) 为实数)) 为字符串) +

  如果所有条件成立则做动作1,否则做动作2
                    If - 条件
                        A30[A27] 大于或等于 1
                    Then - 动作
                        如果所有条件成立则做动作1,否则做动作2
                            If - 条件
                                A30[A27] 不等于 A32[A27]
                            Then - 动作
                                游戏 - 对 ((触发单位) 的所有者) 在屏幕位移(0.00,0.00)处显示 12.00 秒的文本信息: (|cff00ff00装备镶嵌孔:|r|cffffff00 + ((转换 (A30[A27] - A32[A27]) 为字符串) + |r))
                            Else - 动作
                        如果所有条件成立则做动作1,否则做动作2
                            If - 条件
                                A32[A27] 大于或等于 1
                            Then - 动作
                                游戏 - 对 ((触发单位) 的所有者) 在屏幕位移(0.00,0.00)处显示 12.00 秒的文本信息: ((|cff00ff00镶嵌的宝石:|r|cff00ff00( + ((A106[A35[A27]] 的名字) + )|r|cffffff00)) + ((A41[A35[A27]] 的名字) + (|cffffff00+ + (转换 A36[A27] 为字符串))))
                                如果所有条件成立则做动作1,否则做动作2
                                    If - 条件
                                        A32[A27] 大于或等于 2
                                    Then - 动作
                                        游戏 - 对 ((触发单位) 的所有者) 在屏幕位移(0.00,0.00)处显示 12.00 秒的文本信息: ((|cff00ff00镶嵌的宝石:|r|cff00ff00( + ((A106[A37[A27]] 的名字) + )|r|cffffff00)) + ((A41[A37[A27]] 的名字) + (|cffffff00+ + (转换 A38[A27] 为字符串))))
                                        如果所有条件成立则做动作1,否则做动作2
                                            If - 条件
                                                A32[A27] 大于或等于 3
                                            Then - 动作
                                                游戏 - 对 ((触发单位) 的所有者) 在屏幕位移(0.00,0.00)处显示 12.00 秒的文本信息: ((|cff00ff00镶嵌的宝石:|r|cff00ff00( + ((A106[A39[A27]] 的名字) + )|r|cffffff00)) + ((A41[A39[A27]] 的名字) + (|cffffff00+ + (转换 A40[A27] 为字符串))))
                                            Else - 动作
                                    Else - 动作
                            Else - 动作
                    Else - 动作
[/trigger]

这样泄露就是超级恐怖了。这个意思就是= =!
回复

使用道具 举报

 楼主| 发表于 2011-12-20 00:49:16 | 显示全部楼层
那么假如我去掉其中一部分,就是字体颜色那部分,也只是杯水车薪啊。。。。。。
因为这么庞大的数据量。点击一次泄露就娘的上百号人。。。
回复

使用道具 举报

 楼主| 发表于 2011-12-20 01:05:10 | 显示全部楼层
几万一会就堆出来了!!我一点都不骗你。。。。我的图有救的与否。
我需要给我个明确的答案啊。拜托各位了!


1问题:相同的字串符会不会产生新的泄露。
2问题:字串符长度是不是衡量泄露量大小
3问题:数字的情况是不是也包括在以上2个问题里面。
好吧,就这么多。
需要你们说下以上说法的到底是什么情况。请帮我判断下吧。。
PS:根据你们帮我做的判断,我会看出我的图到底还有救没有救
回复

使用道具 举报

发表于 2011-12-20 06:28:00 | 显示全部楼层
10235724429:几万一会就堆出来了!!我一点都不骗你。。。。我的图有救的与否。
我需要给我个明确的答案啊。拜托各位了!


1问题:相同的字串符会不会产生新的泄露。
....... (2011-12-20 01:05)
数字的话。。之前Conflux不是已经说了嘛……
没有任何问题,数字和布尔值都是电脑自动清理的

另外Conflux给的那个帖子是RBGC(附带String)的。。我以前看的不是那个呢……
是血戮魔动冰和别的一些大大的。。

然后,表示LZ各种没看前面Conflux的回复……
19楼:影响到速度的是字符串的个数,而字符串的长度就无关紧要了。

意思就是相同字符串不会产生新的字符串,比如s1="a"+“b”,s2="ab",由于在处理s1的时候已经注册了"a"、"b"、"ab",于是赋值s2的时候直接调用已经注册好的"ab"

然后,长度的话基本没有关系(魔兽用的是utf-8吗……)
数字、英文字母以及英文标点都占一个字节,中文的记得是占3个字节,1KB有1024字节,然后字符串的尾端还要加上一个结尾'\\0',占一个字节;
所以,长度基本没影响,1KB约等于340中文字,关键就在于你有多少个这样的字符串了;
每创建一个字符串,不止字符串本身要占用内存,其句柄也要占用一点内存;
PS:不要妄想用字符串长度估算占用的内存量来判断会不会卡

其实大多数字符串都是用+创建出来的……
比如显示“XX物品的拥有者是”+(获取所有者的名字)
除了前面“XX物品的拥有者是”只注册一次,后面的名字只要换个所有者就注册一次,并且两个字符串合起来后又产生一个新的
回复

使用道具 举报

 楼主| 发表于 2011-12-20 13:30:58 | 显示全部楼层
额,我的意思是这样的

如果是这个输入会有几个字串符?
我+123+你+321或者就只是123+321

PS:以上整数是某个地方截取出来的整数!
回复

使用道具 举报

 楼主| 发表于 2011-12-20 14:34:16 | 显示全部楼层
而且对于楼上所说的那些我看是看了的,不过只是让你们确是确认下

[s:186]

我没那种不认真看得坏习惯,所以求32楼老大出现吧,解答下我的疑难杂症!

PS:刚才又测试一次整数到底是不是无辜的,的确整数是无辜的。创建100W个局部整数变量都不会卡那么一小下
回复

使用道具 举报

发表于 2011-12-20 17:22:31 | 显示全部楼层
粗略的看了楼主的触发,发现有很多转换实数为字符串或者截取字符串转为实数,这样做确实会造成很多泄露,关于字符串的泄露,我觉得chyj4747与Conflux回复已经说的很清楚了,没必要再作解释.
我就给楼主提一些关于简单地处理字符串的建议吧:
1,对于"a"+"b"+"c"+.....类型的字符串相加操作,可以这样写((("a"+"b")+"c")+......),两两相加再括号.减少字符串的产生.
2,尽量不要使用实数转字符串,而是先将实数转整数,再将整数转字符串,这样如果是100个整数,也就只有一百个字符串,而不是1W个或是10W个,一般的地图中,也没人会留意小数点之后的数值.又不是搞科研.精度不需要那么高,精度越高泄露也就越大.
3,尽量不要显示过多的信息,这样既占屏幕,让人玩着不爽,同时加大了自己的工作量,比如某玩家镶嵌武器成功,你就显示"镶嵌成功"或者"成功",亦或者直接不显示文字,弄个特效表示成功即可.如果你弄成:获得XX玩家的名字+获得XX单位的名字+获得物品的名字+镶嵌XX宝石成功+属性增加5.12点,这样泄露问题可就明显了.
回复

使用道具 举报

 楼主| 发表于 2011-12-20 18:12:06 | 显示全部楼层
好吧,我试试,不过我发现我的图里面一个系统的泄露大得不得了,也许那个才是真正的原因!!!


[s:198] [s:198]


不过这个东西让我也学习了不少。。。。。感谢各位大大了!!
回复

使用道具 举报

发表于 2011-12-20 20:01:13 | 显示全部楼层
唔.....好有趣的话题喵~

表示星记得war3内部有一套自己的字串管理系统~

唔......字串需要调用game里面某处函数进行生成(貌似素传递char *指针,然后war3把字串内容复制到某处,然后给一个编号?)重复的直接返回已有编号~
觉得这里它可能就会做一个大量的判断?(不确定是否使用了hash之类的东西,如果素for+strcmp就太糟糕了的说~)

然后貌似内部传递字串的时候,传递的都素这个编号,然后还有内部函数是获取编号然后返回字串实际地址......

嗯~反正不管怎么样BLZ没有任何把string删掉或清理的打算的说~
回复

使用道具 举报

发表于 2011-12-21 19:06:52 | 显示全部楼层
好啊~~~~~~








凰图腾 下载
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 00:21 , Processed in 0.157770 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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