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


    小小的代码,提升大大的效率(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"]);
    
  • 相关阅读:
    PB中的Grid视图
    MVC加jquery的无刷新列表分页摘要
    Quartz.Net 1.30的一些设置说明
    将Excel的数据库字典导到PDM中
    HubbleDotNet使用备忘
    EntLib5.0 日志应用程序块(logging) 使用与配置
    生成随机密码
    网站整合QQ登录
    PB代码参考段
    SQL查询之 Pivot 详解
  • 原文地址:https://www.cnblogs.com/lijiajia/p/7668878.html
Copyright © 2020-2023  润新知