//没登陆

欢迎您来到凯恩之角,奈非天!

帖子:319

符文:70

跳转到指定楼层
1#
发表于 2019-9-19 00:04:40 |只看该作者 |倒序浏览 来自:江苏
本帖最后由 雪落丶丿寒 于 2019-9-19 23:56 编辑

罗技宏作为目前比较常用的暗黑三硬件宏,其‘简单’、‘轻量’的优点,吸引了很多的玩家涉及于此。其中不乏有些没有编程经验者,纯粹因为爱好而学习并克服困难坚持开发出优秀的作品,给广大的使用者带来便利,但是随着宏功能的增加,计算量不断扩大,便出现了一些速度过慢与内存不足的问题,同时又不想牺牲宏的精度,于是本文将从这个角度聊一聊优化。
1.Sleep
  Sleep函数承担着挂起等待的功能,我目前没有找到罗技在封装此函数时的具体细节(如果有哪位大佬有,跪求给我一份),故结合我对于其他语言的了解在此分析一下。sleep函数挂起当前进程时,将Cpu资源交给其他进程,其他进程会在至少运行一个时间片周期后才将资源放弃交还(切换上下文),而cpu的时间片会根据目前进程的数量进行自我调节。一般情况下,对于一台较新的电脑来说,此时间片一定是低于1ms的,故Sleep(1)可以达到目的。而对于一些cpu较为陈旧的电脑,其时间片就可能出现不稳定了,甚至是早上还是1ms,晚上再来就是15ms了(我家电脑=_=)。这样会发生什么问题呢?比如我想在按键后停100ms,如果直接Sleep(100)不会出现太大的误差,而如果出于某些目的,在循环里写100个Sleep(1),就会出现问题了,实际停止时间是100*实际时间片,就会造成宏的停止时间对不上。
  那么,有没有什么解决方法呢,在代码的层面并不能控制时间片的长短,只能将误差尽量的缩小,比如使用sleep(100)进行优化,如果必须要分为1ms的sleep,可以每次运行时和当前时间做对比,而不是输入明确的循环次数,将误差控制在一个时间片以内。
2.表
  表作为lua语言最具有代表性的东西,其使用技巧也是有很多注意点的
1)尽量用一个大表代替多个小表
    这个非常好理解,每一个表都会占有较大的内存(包括数组),即使是空表,也是比较大的,尽量不要过多的创建过小的表以及数组
2尽量在创表初期就设置其容量(不要用{},尽量用{nil,nil,nil}或者{x=nil,y=nil}填充)
    lua中的表包括两个空间,一个空间存放从1-n的连续元素,另一个空间以hash码的形式存放其他元素(如对象的参数,所以一般对象内存要大于数组),

  这个空间的容量是在开始创建时就给好的,加新的元素之后超过了一定比例,则会进行扩容,若创建时为空表,则需要扩容两三次,而创表时进行预设,就会跳    过此阶段
3清除表时,将表内所有元素设为nil,表的空间不会变化(撑开就回不来了),然而若设为nil后继续向表内插入元素到一定程度,表会自动收缩(撑爆了2333)
3.局部变量
  这里要着重说明一下,尽量使用局部变量!!!即使用local修饰变量,函数,表,对象。。。这个是重中之重,首先局部变量是跟随其函数域存放在寄存器里的,lua在运行时直接就可以调用,而全局变量需要去全局表内get出来,操作完后又要set回去,大大增加了操作时间。同样函数也是一个变量,全局函数会导致在循环中频繁调用浪费许多时间,可以在大循环前用一个局部变量接住此函数,在循环中调用此变量,可加快约30%的时间 。
4.闭合函数
    虽然局部变量对于性能的优化很重要,但是有些情况下局部变量并不能满足,比如构建一个非纯函数后,需要迭代输出时,作为迭代变量自然不能使用单纯的局部变量啦,那么只能使用全局变量么?自然也不是,此处可以使用闭合函数来封装一个‘非全局变量’,此变量在调用原函数时被创建,并随其一同存放在寄存器内,在函数结尾创建一个局部函数return回去,故此函数和变量在同一词法域内,可以相互访问到,而对外是关闭的,既达到了局部变量没法达到的效果,又不像全局变量那样存放在全局表中,还是比较实用的。另外闭合函数也可以起到封装函数的功能,具体的使用方法有兴趣的可以自行研究。
5.缓存器
  对于作者自己写的一些计算量较为庞大的纯函数(具有亲系透彻性,即针对相同输入值,一定给出相同输出值),例如双黑宏中输入剩余时间计算需要刷几次黄道之类的,这种函数一般会有意无意的被多次调用,并且经常传入的值是相同或类似的,而且计算量较大较复杂。此时便可以构建一个缓存器去缓存已计算值。
  具体的实现方法为:首先创建一个弱表,在调用纯函数处改为调用缓存器,缓存器查询弱表中是否有已查询过的数据,若有则直接返回该数据,若无,则调用纯函数,将返回值插入表中,再返回数据。而因为是弱表,其中不太常用的数据会在gc被调用时回收。
6.待续。。。








帖子:319

符文:70

2#
各位宏作者,若在编宏时遇到什么技术上的问题,可以提出来大家讨论讨论
发表于 2019-9-19 00:08:54 来自凯恩之角App |只看该作者 来自:江苏

帖子:231

符文:32

3#
不明觉厉紫薯布丁
发表于 2019-9-19 00:24:11 来自凯恩之角App |只看该作者 来自:山东

帖子:18340

符文:172

4#
挺好的,挺好
发表于 2019-9-19 00:43:06 来自凯恩之角App |只看该作者 来自:广东
头像被屏蔽

帖子:507

符文:27

5#
遇到问题了,看不懂,希望发出一个从不哑炮4爆回满能4cdr的全自动双黑宏出来。
给大众对比一下,宏效率是如何搞得,能不能满灵光,满能,全程吃引导。
变量什么的也看不懂,期待楼主的作品!
发表于 2019-9-19 00:45:21 来自凯恩之角App |只看该作者 来自:河南
头像被屏蔽

帖子:256

符文:3

6#
建议请阿尔法狗四开挑战大秘境150
发表于 2019-9-19 00:53:49 |只看该作者 来自:浙江

帖子:4135

符文:80

7#
不会编程,但为楼主点个赞。

点评

雪落丶丿寒  谢谢啦~  发表于 2019-9-26 17:04
发表于 2019-9-19 01:22:29 |只看该作者 来自:江西

帖子:319

符文:70

8#
心照不宣丶 发表于 2019-9-19 00:45
遇到问题了,看不懂,希望发出一个从不哑炮4爆回满能4cdr的全自动双黑宏出来。
给大众对比一下,宏效率是如 ...

本贴仅面向于有过写宏经验的宏作者,故而措辞上专业性较强。至于你所说的完美的奥陨宏,我也提到了,宏作者只能在代码层面尽量减少误差,而许多变数是来自于宏以外的,宏并非可读内存的外挂,所以也就不存在所谓的普适、完美的宏了
发表于 2019-9-19 07:29:10 来自凯恩之角App |只看该作者 来自:江苏

帖子:170

符文:30

9#
这游戏已经到了要有游戏开发制作能力才能愉快玩耍了
发表于 2019-9-19 07:34:03 来自凯恩之角App |只看该作者 来自:四川

帖子:319

符文:70

10#
ymmmmh 发表于 2019-9-19 07:34
这游戏已经到了要有游戏开发制作能力才能愉快玩耍了

宏开发出来自然是给普通玩家使用的,若没有广大的玩家受众,自然也不会有我们这些致力于研究开发的人存在了
发表于 2019-9-19 07:55:55 来自凯恩之角App |只看该作者 来自:江苏

帖子:171

符文:26

11#
666
发表于 2019-9-19 08:08:18 来自凯恩之角App |只看该作者 来自:四川

帖子:23

符文:3

12#
都很有用,mark下,虽然没写,但是经常改改
发表于 2019-9-19 08:16:14 |只看该作者 来自:北京

帖子:718

符文:162

13#
顶这样热心的专业人士

点评

雪落丶丿寒  哈哈,谢谢  发表于 2019-9-19 10:39
发表于 2019-9-19 08:39:40 来自凯恩之角App |只看该作者 来自:上海

帖子:523

符文:763

14#
很好的经验,支持

点评

雪落丶丿寒  谢谢~  发表于 2019-9-19 23:10
发表于 2019-9-19 13:19:00 |只看该作者 来自:河北

帖子:1059

符文:184

15#
sleep这个我也没搞懂,但是我看罗技那个word文档里面说明,好像sleep不能用于高延迟,我看宏里面的延时都是作者自己定义的一个函数。
发表于 2019-9-19 13:24:08 来自凯恩之角App |只看该作者 来自:四川
您需要登录后才可以回帖 登录 | 注册网易通行证