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来重新的相互绘制。鼠标绘制就是这样实现的。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
