帧同步-自动化战斗测试流程

C#

浏览数:160

2019-7-21

AD:资源代下载服务

小小的代码,提升大大的效率(^o^)/

工作中有很多繁琐的流程,重复的流程,是可以编程实现让计算机去做的。编程其实就是教机器去做某些事情,而程序语言,就是跟机器对话的工具~

经常听牛人说用代码改变世界,虽然我改变不了整个世界,但至少还可以改变一下身边的世界哦~

自动化测试

我们游戏的战斗测试同步问题比较麻烦,每次改动了战斗(主动技能、被动技能、BUFF、怪物等等)都需要开多个号测试一遍战斗流程,非常耗费人力

原来的测试流程

  1. 需要多个人用多台手机打战斗
  2. 开启帧同步日志
  3. 战斗结束后,会根据各个玩家的数据的一致性来判断这场战斗是否是同步的
  4. 如果发现有不同步的玩家,则需要把客户端输出的日志文件(在手机上或者模拟器上)发给技术人员排查问题

这样的流程打几次往往一个下午就过去了,收集日志文件也比较耗时,需要把手机连接到电脑上,拷贝出来,用QQ发给技术人员排查。

所以我们要优化一下这个流程,把机器能干的事情,都交给机器去做,让机器来节省人的工作量

自动化测试流程

  1. 需要多台手机打战斗,但只需要1个人在不同手机上登陆不同账号,开启自动测试模式
  2. 服务端开启一个守护进程,每秒检测一次开启自动测试的玩家队列,把条件允许的玩家队伍拉进战斗
  3. 客户端战斗开启自动AI
  4. 战斗结束后,客户端输出帧日志,通过HTTP协议自动上传到日志收集服务器
  5. 玩家退出战斗场景,加载主场景完毕后,又符合了第2点条件,继续被服务器拉入战斗,形成战斗循环

这样我们可以开几个号,挂一个晚上,打他个几百把战斗,然后第二天早上来看战斗日志服务器上,有多少把不同步?直接可以查看不同步的日志文件分析问题

后期还可以加入一些数据分析:比如战斗平均帧率、网络延迟、内存、CPU峰值等一些性能数据

下面贴一些简单的上传文件实现原理,怕忘了以后还可以回头看看~

Unity中POST上传文件到PHP端

using UnityEngine;
using System.Collections;
using System.IO;
using System.Text;
using UnityEngine.Networking;

public class UpLoad : MonoBehaviour
{
    void Start () 
    {
            byte[] bytes = Encoding.UTF8.GetBytes("日志内容");//这里写文件的二进制,先用测试文本代替

            string url = "http://localhost/UploadFightLog.php";
            WWWForm form = new WWWForm ();
            form.AddField("logName", "123_战士.txt", Encoding.UTF8);
            form.AddBinaryData ("fightLog", bytes);
            WWW www = new WWW (url,form);
            StartCoroutine (PostData (www));
    }


    IEnumerator PostData(WWW www)  
        {  
            yield return www;
            Debug.Log(www.text);
        }
}

在PHP端接收

<?php
/*
    用于接受自动战斗测试的日志文件
    文件名格式:战斗ID_玩家名.txt
    此文件会自动以战斗ID创建父文件夹
    将日志文件存在对应战斗ID的文件夹下方便查找
    by lijia
*/
    if ($_FILES["fightLog"]["error"] > 0)
    {
        echo "0";
    }
    else
    {
        $f_name = iconv('utf-8','gb2312',$_POST["logName"]);//转换编码格式解决乱码问题
        
        $fightID_splt = explode('_',$f_name);//分割字符串,把战斗ID取出来
        $fightID = $fightID_splt[0];
        $dir_path = "AutoFightLog/".$fightID;
        
        if (!file_exists($dir_path)){
            mkdir ($dir_path,0777,true);
        }

        $f_path = $dir_path."/".$f_name;
        
        if (file_exists($f_path))
        {
            unlink($f_path);//已经存在就先删除再创建
        }
        
        move_uploaded_file($_FILES["fightLog"]["tmp_name"], $f_path);
        echo "1";
    }
?>

这里需要注意一下如果有中文文件名的话,会出现乱码问题,所以要转换一些编码格式

        $f_name = iconv('utf-8','gb2312',$_POST["logName"]);

作者:李嘉的博客