最高指挥官吧 关注:8,986贴子:155,000

技术研究:AI代码分析与修改测试

只看楼主收藏回复

一楼喂百度


IP属地:福建1楼2017-07-30 13:56回复
    作为一名工作多年的程序猿,难得有个经典游戏开放代码,闲下心来,不如做个代码研究。
    本帖以现在比较流行的sorian AI为基础脚本进行分析研究。
    第一步:00_AIFix、01_aisupport、02_sorian_ai_pack、03_lobbyenhancement等scd文件解压出来,解压方法,把scd扩展名改成zip就可以解压了。
    第二部:使用记事本打开其中的lua文件,就能进行编辑。
    作为入口程序,AIFix中的aibrain.lua提供了基本的逻辑架构。这里先从此脚本入手。


    IP属地:福建2楼2017-07-30 14:01
    回复
      2025-08-04 19:48:21
      广告
      不感兴趣
      开通SVIP免广告
      我们先看这两个函数:CollectCurrentScores和SyncCurrentScores。这两个函数里面都有个while true长循环,很明显是独立的两个线程,实现了计分系统,也包括实时的人口统计。事实上,这种代码不会造成CPU瓶颈——一个线程如果用一个2GHz的CPU来计算,这俩函数1秒钟可以执行几千万次的水平,何况还使用了WaitSeconds来做频率控制。之前在贴吧有看到一些优化帖子,说了很多,但没有一个从程序角度去分析。从程序角度讲,降低这两个函数的执行频率,对中后期卡顿的缓解效果微乎其微甚至可以忽略不计——有且只有在执行GetArmyStat时因为做多线程互斥控制会影响到一些运行效率时,这种情况要看互斥量控制范围大不大,需要做更深一层的代码挖掘。


      IP属地:福建3楼2017-07-30 14:31
      回复
        工欲善其事必先利其器,先找一款适合批量lua脚本的编辑器,比如:


        IP属地:福建4楼2017-07-30 14:38
        回复
          这小工具,莫名其妙老闪退,把lua脚本存放路径改为全英文的,就正常工作了= =


          IP属地:福建5楼2017-07-30 14:41
          回复
            现在发现一个规律:GetArmyStat、GetBlueprintStat这类函数不是lua代码,应该是ForgedAlliance.exe中C/C++实现的内部函数。所以这类函数的一般特征是,通过对象或者类型调用,其代码为函数名前面总有“:”或者“.”。按照一般的程序实现套路,这类Get函数只不过是把内部的成员变量return出来,如果是基本类型,不需要做互斥控制。所以这也可以解释为何计分系统不论怎么修改或者关闭之,都不能有效优化CPU利用率的目的。


            IP属地:福建6楼2017-07-30 14:51
            回复
              支持技术型探讨。


              IP属地:四川来自Android客户端9楼2017-07-31 07:23
              回复


                IP属地:广东10楼2017-07-31 18:16
                回复
                  2025-08-04 19:42:21
                  广告
                  不感兴趣
                  开通SVIP免广告
                  支持大佬技术研究


                  IP属地:山西来自iPhone客户端11楼2017-07-31 23:55
                  回复
                    做了个修改:把PlatoonBuildManagerThread函数中第二层循环体的一百多行代码使用ForkThread方法打包到独立线程中,期望提高CPU多核利用率。初步测试比较,原版Sorial AI效果:

                    修改后的AI效果:

                    可以看到,有一定的变化效果:修改后稳定的使用了两个核心线程。原版把计算量较大的操作都打包在一个主要线程中,结果实际只稳定使用了一个核心线程,其余核心其实也有被使用,但很不稳定,浮动也非常大。
                    这个修改也对AI的行为变化产生了一定的方向性影响——更偏向高等级单位的创建,虽然还不明白为什么,但在运行同样时长之后,后者明显出现了更多的T3/T4单位,混战中还提前灭了一个玩家。
                    稍后放出修改AI的网盘链接,广大吧友有兴趣的话可以帮忙做个测试。


                    IP属地:福建13楼2017-08-01 20:48
                    回复
                      链接:http://pan.baidu.com/s/1o8TxDhg 密码:fxlo
                      使用方法:把scd文件拷贝到gamedata目录下,把原来的00_AIFix.scd移到其他目录或者删掉。由于游戏存档会记忆AI脚本,所以建议开新档测试。


                      IP属地:福建14楼2017-08-01 20:53
                      回复
                        luastudio虽然小巧,但功能还是太弱了,准备上巨无霸IDE:微软的Visual Studio 2015。配合使用babelua插件。


                        IP属地:福建15楼2017-08-01 20:56
                        回复


                          IP属地:山西来自iPhone客户端16楼2017-08-24 23:50
                          回复