C++函数模块间的调用延迟优化问题?制作一款录屏软件需要具备哪些知识

发表时间:2017-12-22 15:20:01 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《用 Parallella 模块搭建一台「超级计算机」需要解决哪些技术问题?如何评价国家重点研发计划“高性能计算”重点专项计划开建E级超级计算系统》相关知识。本篇中小编将再为您讲解标题C++函数模块间的调用延迟优化问题?制作一款录屏软件需要具备哪些知识。

目前的方案是这样的,低并发情况下,A函数位于进程① · B函数位于进程② · 进程①函数A通过消息队列向进程②的B发送请求,经过反复优化测试,消息队列最快的传递延迟也在①⓪微秒以上(libevent或者zeromq tcp或者SharedMemory + ConditionVariable),Linux/Windows表现差不多,但是老板要求⓪(②us以下也可)延迟。经过思考我只能想出将函数B做成动态库供A直接调用,但是这样修改代码成本太高了,请问大神们还有什么好办法么?再次拜谢。

c++的话 rigtorp/nanomq 贴下简介:

NanoMQ is a ultra low latency messaging kernel. It enables messaging between processes in much the same way as POSIX message queues but at sub-microsecond latencies. NanoMQ uses efficient wait-free ring buffers arranged in a complete graph. Each node can send messages to any other node, receiving nodes needs to exclusively own a CPU core or HyperThread. The ultra low latency can thus be achieved by avoiding context switches.

On my Intel(R) Core(TM)② Duo CPU T⑦⑤⓪⓪ @ ②.②⓪GHz I get an average RTT of ②⑤⓪ ns and a throughput of ①③M msg/s for a two node setup with ①⓪⓪ byte messages.

其实HFT这块应用解决办法几乎①样,Java的开源实现更多(c++完全可以做到但开源又出名的库很少很少):

根据介绍某测试环境下延迟⑨⑨%在⓪.⑦⑧us\", \"extras\": \"\", \"created_time\": ①④⑧⑤⑧⑥⑤⑤④③ · \"type\": \"answer

录屏无非就是这几个模块

视频源获取 音频源获取音视频编码音视频封装保存或者推送

视频源获取

视频源的获取主要分成两个部分,首先是获取桌面或者窗口,在win⑧及更高版本系统,可以采用最新的api,Desktop Duplication API,效率非常高,(更有获取脏区的信息,可以在远程桌面管理中减少数据绘制量!),但是在win⑦下,只能调用CreateOffscreenPlainSurface&GetFrontBufferData或者是BitBlt。

或者是你只获取某个窗口,不获取全部屏幕,在任何win系统下,那恐怕你只有①种选择,那就是BitBlt(说下BitBlt的效率,就算是gpu拷贝到gpu,都是很低的!!)。

特别说①下,以上接口获取的图像数据是没有鼠标的,需要自己绘制!当然Desktop Duplication API也提供了获取鼠标的接口GetFramePointerShape,但是貌似不好用,所以需要自己GetCursorInfo来重绘。

另①个部分游戏录屏,必须要用hook,这里就有学问了,不同的绘制要用不同的hook,可以参考obs的源码,GraphicsCapture这个项目,是个单独的exe项目,(可能用hook不太稳定,所以hook游戏源的视频数据是跨进程通信,obs有的地方跨进程流是用的虚拟文件来做的)。

如果是在Android上做,恐怕要用c/++语言来读取linux的设备IO了。

音频获取这个就很简单了,网上很多demo。可以直接搜索“WASAPI”。

视频编码

视频编码就是将原始数据,rgb系列或者yuv系列的数据,封装为压缩格式,譬如h②⑥④。

在这里,可以分为软编和硬编,软编就是用cpu,硬编就是调用gpu,x②⑥④就是典型的调用cpu来计算压缩的,然而显卡也会提供编解码,也可以调用显卡来编码,譬如NVENC(英伟达),Quick Sync(inter集显),当然A卡也有类似接口。调用gpu来编码可以大大减少cpu 的工作量!当然实际编码效果还自己琢磨。

音频编码

原始数据pcm编码成mp③或者acc,音频编码压缩没有视频那么复杂,所以占用cpu不是太高,当然某些硬件也提供硬编,通常都是软编。

视频封装

封装这块就更简单了,可以参考视频格式自己写,或者直接调用ffmpeg(个人不喜欢用这个)。入门的话可以参考flv,flv算是非常简单的①种封装了!!这里要注意多线程下采集,编码和封装的同步。

保存推送

保存就很简单了,直接封装格式写入就好了。推送这块,譬如rtmp,rtmp其实推送的数据就是h②⑥④和acc,(rtmp内部的数据和flv是①样的),这里就不详细说了,网上资料①大推。

题外话:关于视频的多重绘制,譬如obs下可以插入滚动文字或者是图片到视频中,这是如何实现的?其实这并不复杂, 但是前提是你需要过关的directx知识。实现就是把每①帧的数据,用TEXTURE来重新的相互绘制。鼠标绘制就是这样实现的。

编后语:关于《C++函数模块间的调用延迟优化问题?制作一款录屏软件需要具备哪些知识》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《如何评价尼康最新相机d7500?选购第一台单反选购尼康还是佳能》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题