小小的代碼,提升大大的效率(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"]);