小小的代码,提升大大的效率(o)/##
工作中有很多繁琐的流程,重复的流程,是可以编程实现让计算机去做的。编程其实就是教机器去做某些事情,而程序语言,就是跟机器对话的工具~
经常听牛人说用代码改变世界,虽然我改变不了整个世界,但至少还可以改变一下身边的世界哦~
自动化测试##
我们游戏的战斗测试同步问题比较麻烦,每次改动了战斗(主动技能、被动技能、BUFF、怪物等等)都需要开多个号测试一遍战斗流程,非常耗费人力
原来的测试流程##
- 需要多个人用多台手机打战斗
- 开启帧同步日志
- 战斗结束后,会根据各个玩家的数据的一致性来判断这场战斗是否是同步的
- 如果发现有不同步的玩家,则需要把客户端输出的日志文件(在手机上或者模拟器上)发给技术人员排查问题
这样的流程打几次往往一个下午就过去了,收集日志文件也比较耗时,需要把手机连接到电脑上,拷贝出来,用QQ发给技术人员排查。
所以我们要优化一下这个流程,把机器能干的事情,都交给机器去做,让机器来节省人的工作量
自动化测试流程##
- 需要多台手机打战斗,但只需要1个人在不同手机上登陆不同账号,开启自动测试模式
- 服务端开启一个守护进程,每秒检测一次开启自动测试的玩家队列,把条件允许的玩家队伍拉进战斗
- 客户端战斗开启自动AI
- 战斗结束后,客户端输出帧日志,通过HTTP协议自动上传到日志收集服务器
- 玩家退出战斗场景,加载主场景完毕后,又符合了第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"]);