Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 生成和发送大量文本-如何优化它?_Javascript_Php_Optimization_Client Server - Fatal编程技术网

Javascript 生成和发送大量文本-如何优化它?

Javascript 生成和发送大量文本-如何优化它?,javascript,php,optimization,client-server,Javascript,Php,Optimization,Client Server,这可能是最奇怪的问题之一。。。对不起 我正在尝试创建一个基于文本的网络游戏与战斗系统。让我们想象一下,这场战斗的结果如下: ROUND 1: AAA hit BBB for X amount of damage. BBB hit AAA for Y amount of damage. ROUND 2: AAA missed BBB. BBB hit AAA for Z amount of damage. $char1 = 'AAA'; $char2 = 'BBB'; $char1_hp = $

这可能是最奇怪的问题之一。。。对不起

我正在尝试创建一个基于文本的网络游戏与战斗系统。让我们想象一下,这场战斗的结果如下:

ROUND 1:
AAA hit BBB for X amount of damage.
BBB hit AAA for Y amount of damage.
ROUND 2:
AAA missed BBB.
BBB hit AAA for Z amount of damage.
$char1 = 'AAA';
$char2 = 'BBB';
$char1_hp = $char2_hp = 1000;
$msg = '';
$fight_continue = true;
$round = 1;

$msg[0][1] = $char1;//input data to decode names
$msg[0][2] = $char2;//input data to decode names
while ($fight_continue)
{
    if (mt_rand(0, 100) <= 50)
    {
        $dmg = mt_rand(1, 10);
        $char2_hp -= $dmg;
        $msg[$round][1] = array(1, 1, 2, $dmg);//1, 1, 2 decodes for char1, hit, char2
    }
    else
        $msg[$round][1] = array(1, 0, 2, 0);//1, 0, 2 decodes for char1, missed, char2
    
    (...)
}
(0 => (1=>'AAA', 2=>'BBB')), //initialization data
(1 => (0=>(1, 1, 2, 5), 1=>(2, 0, 1, 0))) //whole data for round 1
(2 => etc...) //whole data for round 2
它确实像这样持续了几十行,比如说多达1000行。这是一个简单的例子,但你已经明白了。很明显,它还附带了很多HTML代码——为了澄清输出,我将跳过它

现在,为了生成这个作战报告,我正在以这种方式生成它(同样简化,请将其视为一个伪代码,只是为了展示想法,而不是真实代码):

客户端浏览器将获得的作战报告如下所示:

ROUND 1:
AAA hit BBB for X amount of damage.
BBB hit AAA for Y amount of damage.
ROUND 2:
AAA missed BBB.
BBB hit AAA for Z amount of damage.
$char1 = 'AAA';
$char2 = 'BBB';
$char1_hp = $char2_hp = 1000;
$msg = '';
$fight_continue = true;
$round = 1;

$msg[0][1] = $char1;//input data to decode names
$msg[0][2] = $char2;//input data to decode names
while ($fight_continue)
{
    if (mt_rand(0, 100) <= 50)
    {
        $dmg = mt_rand(1, 10);
        $char2_hp -= $dmg;
        $msg[$round][1] = array(1, 1, 2, $dmg);//1, 1, 2 decodes for char1, hit, char2
    }
    else
        $msg[$round][1] = array(1, 0, 2, 0);//1, 0, 2 decodes for char1, missed, char2
    
    (...)
}
(0 => (1=>'AAA', 2=>'BBB')), //initialization data
(1 => (0=>(1, 1, 2, 5), 1=>(2, 0, 1, 0))) //whole data for round 1
(2 => etc...) //whole data for round 2
现在我可以打印数组并在JS中对“可视化”部分进行编码(我不会给出任何代码,因为这与问题无关),只需解码数字即可。主要的缺点是,编写“战斗”代码将是非常不直观的——很容易出错并将错误形象化。事实上,如果我想改变什么,我需要改变PHP和JS脚本中的battle

下面是真正问题的一部分:

  • 这个想法是好是错?可能是用
    $msg.='XXXXXXXX'粘贴巨大的字符串
    很好,甚至比为服务器端PHP创建一个巨大的数组更好

  • 如何才能做到不同

  • 也许有一种方法可以像第一个示例中那样创建“自然”文本,然后压缩文本,将其发送到客户端浏览器,然后在客户端用JS解压


  • 最佳实践表明,第二种方法应该是将服务器呈现的信息从前端发送到前端的更好方法。AJAX接口将是实现这一点的正确方法

    如果您仍然希望能够在后端使用“更高级别”的接口,我建议您将框架构建为面向对象的框架。为
    创建一个对象,该对象具有读取对象及其命中信息的功能。为了将其有效地扩展为一个项目,最好将其设计为
    伤害
    作为
    攻击
    的属性。然后你只需点击点击($personB,$attack)即可发送信息其中
    函数hits(Person$p,Attack$a){}
    包含Person和Attack的输入,并返回一个命中信息字符串

    在您的示例中,这看起来像:

    class Attack {
        public int $damage;
        public function getDamage(): int
        {
            return $this->damage;
        }
    }
    
    class Person {
        public string $name;
        function getName(): string
        {
            return $this->name;
        }
    
        function hits(Person $p, Attack $a){
           $p->hp -= $attack->getDamage();
           //...other battle logic here
           return $this->getName . ' hit ' . $p->getName() . ' for ' $a->getDamage();
       }
    }
    

    然后,您的攻击工作流将只会攻击处理后端并返回所需内容的AJAX端点。这样,当您需要将点击信息发送到前端时,您可以读回字符串或发送播放器状态的
    json\u编码的
    数组,并让前端渲染它,从而使关注点更加整齐地分开。希望这能让你走上正确的道路

    我不确定,也许我问得太多了,而我只是想问“如何打包文本”?无论如何,谢谢你的提示!1500次重复的“AAA命中BBB造成X点伤害”刚刚超过50kB,未压缩(如果客户端支持,您的Web服务器应该自动压缩)。没什么。不要过早地进行优化。这只是一个例子,通常文本本身的长度会增加2-3倍,而使用HTML,每个用户的文本长度很容易达到500kB,甚至更多,每天只有几百次。这确实与我有关,我希望尽早做出反应。@Run_Script代码审查需要项目中的实际代码,代码尚未编写,因此这肯定是离题的。@Run_Script代码审查即将结束。请,只把高质量的问题提交给你确定会被接受的网站。我还在研究这个话题。我刚刚了解了ob_start()-也许这是一种方法,而不是让脚本复杂化并通过手动js脚本在前端解码?它不一定会让前端的脚本复杂化。我在这里展示的函数将从纯服务器端返回所需的数据
    ob_start
    只是一种显示缓冲输入的方式,但不会提供您可能需要的
    i/o
    。在JS/PHP堆栈中分离关注点是正确的前进方向。