笔记:Nodejs 实时向 C++ 编译的可执行文件给予输入和获取输出

背景

我和几个同学当时想要去做一个多人联机的平面小游戏,但需要渲染视野。然而我们不会,只好请教大佬,而大佬不会 Javascript,所以他给我们的是 C++ 编译后的可执行文件,这就产生了延时。


原始方案

我当时写的是每一次游戏循环都运行一次程序,开启进程后向 stdin 加入数据,再从 stdout 获取。
就像这样:

const exec=require('child_process').exec;function runCommand(command,stdin)
{return new Promise((res,rej)=>{let child=exec(command,(err,stdout,stderr)=>{err||stderr? rej([err,stderr]):res(stdout));});child.stdin.write(stdin);child.stdin.end();});
}

运行起来的时候确实是可以用了,但是一多人就会有卡顿。

测试的时候发现,这种写法每一次都需要开启一个进程,再把这个进程关掉,这样就造成了时间上非常大的浪费,直接占掉至少 20ms 。这对于 30帧 的游戏来说都是不可理喻的。


改进写法

后来,我就想能不能在服务器一开始的时候就开启一个进程,而后就一直开着,服务器关了它才关。于是我先联系大佬把他的程序加上 while(true),而后查阅了大量资料。

后来我们通过 ChatGPT 发现,在 C++ 程序输出的时候 手动把缓冲区清空,就可以在 stdout 中得到输出。于是我们写出了下面的代码:

const spawn=require('child_process').spawn;const childProcess=spawn('./modules/vision.exe',[],{stdio:['pipe','pipe','inherit']});
childProcess.stdout.setEncoding('utf8');var nowOutput=``;childProcess.stdout.on('data',(data)=>{nowOutput=data.toString();
});process.stdin.on('end',()=>{childProcess.kill();
});function runCommand(stdin)
{return new Promise((res,rej)=>{childProcess.stdin.write(stdin);res(nowOutput);});
}

最后延时问题得到解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02 QPushButton的基本使用

Tips: 在使用控件的时候如果没有智能提示,可能是没有包含头文件 在运行时,报【invalid use of xxx】可能是没有包含相关头文件 如果出现中文乱码:设置编译器的编码格式为UTF-8 本节主要包含创建一个按钮控件、显示按钮、设置按钮的父窗口、设…

Centos7安装Docker

Centos7安装Docker 目录 环境准备 安装Docker 启动Docker 切换源 启动第一个容器 环境准备 切换root权限 su root 升级所有包同时也升级软件和系统内核 yum -y update 卸载旧版本 yum remove docker docker-common docker-selinux docker-engine 卸载旧版本 yum rem…

UG\NX二次开发 捕获NX OPEN C++异常,乱码问题

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 捕获NX OPEN C++异常,乱码问题。 效果: 使用uc1601(ex.what(),1)显示乱码 使用 NXMessageBox()->Show("Block Styler", NXMessageBox::DialogTypeError, ex…

rce题目

<?php include "flag.php"; highlight_file(__FILE__); if(isset($_GET[HECTF])) { if (; preg_replace(/[^\W]\((?R)?\)/, NULL, $_GET[HECTF])) { if (!preg_match(/pos|high|op|na|info|dec|hex|oct|pi/i, $_GET[HECTF])) { eval(…

Kubernetes Volume及其类型(NFS、SAN) - PV - PVC - PV与PVC与Pod的关系

目录 volume 卷 官方文档&#xff1a;卷 | Kubernetes 一、emptyDir&#xff08;临时卷&#xff09; 二、hostPath卷 type字段参数 hostPath 实验&#xff1a; 三、第3方提供的存储卷&#xff08;百度云、阿里云、亚马逊云、谷歌云等&#xff09; 四、local卷 五、NF…

揭秘企业到底为什么要设立帮助中心

帮助中心是企业一个非常关键的客户服务工具&#xff0c;它可以帮助企业给客户提供高质量的售后支持和解决方案。在现在这个客户至上的年代&#xff0c;不仅要向客户提供优质的产品&#xff0c;卓越的售后服务也是不可缺少的。接下来我们就从企业和客户的角度展开讲讲为什么要设…

Nautlius Chain主网正式上线,模块Layer3时代正式开启

Nautilus Chain 是在 Vitalik Buterin 提出 Layer3 理念后&#xff0c; 对 Layer3 领域的全新探索。作为行业内首个模块化 Layer3 链&#xff0c;我们正在对 Layer3 架构进行早期的定义&#xff0c;并有望进一步打破公链赛道未来长期的发展格局。 在今年年初&#xff0c;经过我…

在有序数组中查找元素第一个和最后一个位置

某个大厂面试手撕代码遇到的题&#xff0c;血泪的教训&#xff1a; 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计…

WPF 复制粘贴到系统粘贴板

复制或剪切文件到剪切板 /// <summary>/// 复制或剪切文件到剪切板/// </summary>/// <param name"files">文件路径数组</param>/// <param name"cut">true:剪切&#xff1b;false:复制</param>public static void C…

Java读取Excel 单元格包含换行问题

Java读取Excel 单元格包含换行问题 需求解决方案 需求 针对用户上传的Excel数据&#xff0c;或者本地读取的Excel数据。单元格中包含了换行&#xff0c;导致读取的数据被进行了切片。 正常读取如下图所示。 解决方案 目前是把数据读取出来的cell转成字符串后&#xff0c;…

Flask新手教程

Flask简介 Flask是一个轻量级的可定制框架&#xff0c;使用Python语言编写&#xff0c;较其他同类型框架更为灵活、轻便、安全且容易上手。 Flask 可以很好地结合MVC模式进行开发&#xff0c;开发人员分工合作&#xff0c;小型团队在短时间内就可以完成功能丰富的中小型网站或…

迭代器模式:相比直接遍历集合数据,使用迭代器有哪些优势?

今天&#xff0c;我们学习另外一种行为型设计模式&#xff0c;迭代器模式。它用来遍历集合对象。不过&#xff0c;很多编程语言都将迭代器作为一个基础的类库&#xff0c;直接提供出来了。在平时开发中&#xff0c;特别是业务开发&#xff0c;我们直接使用即可&#xff0c;很少…

Vue电商项目--登录与注册

登录注册静态组件 刚刚报了一个错误&#xff0c;找不到图片的资源 assets文件夹--放置全部组件共用静态资源 在样式当中也可以使用符号【src别名】。切记在前面加上 注册业务上 先修改原先的接口成这个按钮 然后把input框里面的数据保存到data中 注册业务下 就是点击获…

Spring后置处理器BeanFactoryPostProcessor与BeanPostProcessor源码解析

文章目录 一、简介1、BeanFactoryPostProcessor2、BeanPostProcessor 二、BeanFactoryPostProcessor 源码解析1、BeanDefinitionRegistryPostProcessor 接口实现类的处理流程2、BeanFactoryPostProcessor 接口实现类的处理流程3、总结 三、BeanPostProcessor 源码解析 一、简介…

Redis之缓存穿透?怎么解决?

面试官&#xff1a;什么是缓存穿透&#xff1f;怎么解决&#xff1f; 候选人&#xff1a;嗯~ &#xff0c;缓存穿透是指查询一个一定不存在的数据。如果从DB查不到数据则不写入缓存&#xff0c;这将导致每次访问这个不存在的数据都要到DB去查询&#xff0c;高并发情况下DB可能…

安泰电子:ATA-ML100水声功率放大器模块技术参数

随着人类对海洋的深度探索和利用的不断加深&#xff0c;水下通信技术日益成为研究的热点。水下通信技术是指在海洋、湖泊等水体中实现信息传递和交流的技术手段。它不仅在海洋资源勘探、海洋环境监测等领域具有广泛应用&#xff0c;还在水下考古、水下工程等领域发挥着重要作用…

【UniApp开发小程序】项目创建+整合UI组件(FirstUI和uView)

创建项目 下图为初始化的项目的文件结构 引入组件 俗话说&#xff1a;“工欲善其事&#xff0c;必先利其器”&#xff0c;为了更加方便地开发出页面较为美观的小程序&#xff0c;我们先引入成熟的UI组件&#xff0c;再开始开发之旅。&#xff08;如果你是前端高手&#xff0…

cancel框架同步mysql数据到kafka

1、下载cancel https://github.com/alibaba/canal/releases/tag/canal-1.1.52、修改conf文件夹下的canal.properties配置文件 canal.zkServerslocalhost:2181 canal.serverMode kafka ################################################## ######### Kafka ##…

移动端深度学习部署:TFlite

1.TFlite介绍 &#xff08;1&#xff09;TFlite概念 tflite是谷歌自己的一个轻量级推理库。主要用于移动端。 tflite使用的思路主要是从预训练的模型转换为tflite模型文件&#xff0c;拿到移动端部署。 tflite的源模型可以来自tensorflow的saved model或者frozen model,也可…

MotionBert论文解读及详细复现教程

MotionBert&#xff1a;统一视角学习人体运动表示 通过学习人体运动表征&#xff0c;论文原作者提出了处理以人为中心的视频任务的统一方法。使用双流时空transformer&#xff08;DSTformer&#xff09;网络实现运动编码器&#xff0c;能够全面、自适应地捕获骨骼关节之间的远…