ION的来由和发展

ION的来由和发展

项目地址:https://github.com/pion/ion

star 数量:2.5K

一、行业发展

作为ION的发起人之一,同时也是PION的核心开发者。作者一直从事互联网直播和在线教育行业的研发,一直在关注流媒体开源项目的发展,也一直关注LVS等行业论坛。

行业内有个趋势:

传统RTMP+FLV+FLASH的技术栈在逐渐向RTMP+FLV+RTC,甚至纯RTC发展。

二、语言发展

开发语言是底子,底子好才能发展好;语言决定项目的整体发展和方方面面的成本和效率;

比如,CNCF里毕业/孵化中项目,GO的项目比例占到了80%+

这里有个趋势 :

服务端方面:

Golang发展的非常火 :不管是API服务,IM服务,甚至流媒体服务,都在向Golang转化;很多Coder在向Golang转化。

客户端方面:

Flutter发展的非常火 :很多新项目开始使用Flutter,很多Coder都在往Flutter转化。

三、ION的发展

背景:

想基于GO做RTC项目的想法一直都有。前几年的一天,我关注到pion/webrtc这个开源项目,当时加密部分还是使用的openssl,项目发起人是aws的大佬Sean等。后来过了一段时间,pion替换掉了openssl,项目发展为纯GO的项目。这个时候,我觉得项目很有潜力!决定使用pion来开发一个纯GO的RTC项目。

人员发展:

ION的初期,需要开发demo来测试,我是做后端出身,碰到了很多前端的问题。这时候我碰到了有同样想法的全栈大佬,同时也是flutter-webrtc的作者,资深WebRTC/SIP专家-鱼大神。作为ION的联合发起人,我们一拍即合,一起做,使用pion/webrtc做后端,flutter/js做前端和SDK。期间还加入了《Flutter技术入门与实战》等多本书的作者,资深视频会议专家-亢大神。到后期,又加入了国外的大神,比如:tarrencev、jason、leeward等,他们技术很牛,同时思想也很超前,时间也很多 ‍♂️。再后来,有些用到ION的组织和个人纷纷加入进来,希望一起完善,这就是优质开源的魅力 。

项目发展:

ION的初期,只是一个单机的带信令版SFU。后来成分布式的,期间也是多数RTC项目的必经阶段:

信令和媒体服务拆分(拆分为biz、sfu、islb、nats、redis等)
MQ来传输消息和解耦合(使用nats封装了rpc框架,状态存在redis)
Docker化开发和部署(每个服务都有容器)
前端多种SDK和app(ts、flutter)
媒体服务优化(JB等)
在疫情期间,❤️我们的项目做到了【2.4K+ 】 ,感谢sean的宣传和大神们的努力。

四、ION的特点

底子好,前景好:基于谷歌三剑客(WebRTC标准+GO+Flutter)
效率高:纯GO+Flutter/JS开发,高开发效率+运行效率+维护效率(初期的ION在1VN的场景下,已经做到0.5核=1000路;pion/webrtc在不带JB的rtsp-bench里已经压到了0.3核=10000路)
云原生亲和:支持容器,服务端组件也优先选GO系(CNCF)
分布式架构:信令和媒体解耦,易于扩展
覆盖全:多样的SDK+APP(Flutter、JS)
社区活跃:(最活跃的RTC社区,好像GO/Flutter的社区都很火)
五、展望未来
未来目标,主要有三个方面:

完善媒体服务;完善弹性分布式调度;完善客户端/SDK覆盖。

开源是一种热情,个中收获,个中辛苦,只有开源人能够体会,希望能继续一起把ION做好。在这里特别感谢ION的维护者们以及PION社区的开发者们。

欢迎有兴趣的人一起来完善ION~

相关资源连接
亢少军站点:http://www.kangshaojun.com
亢少军 github: https://github.com/kangshaojun/
文章转载自:https://zhuanlan.zhihu.com/p/206492402

### ION DMA-BUF 在 Linux 内核及图形驱动中的作用与使用方法 #### 一、ION 的概述及其在图形驱动中的角色 ION 是一种内存管理子系统,专为 Android 平台设计并广泛应用于嵌入式设备中。它通过集中化的方式分配共享硬件组件所需的内存资源,从而优化了性能效率[^3]。 - **主要功能** ION 提供了一种机制来分配特定类型的内存缓冲区(如用于 GPU 或显示控制器的专用内存)。这些缓冲区可以被多个硬件模块共享,减少了不必要的数据复制操作。 - **具体实现细节** - `select_heap_mask()` 函数根据指定用途选择适合的 ION 堆掩码,决定从哪个堆分配内存。 - 如果存在 DMABUF 堆,则优先调用 `alloc_from_dmabuf_heap`;否则采用传统的 `exynos_ion_alloc` 方法完成内存分配[^3]。 ```cpp int ion_device::alloc_from_ion_heap(uint64_t usage, size_t size, unsigned int flags, int *min_pgsz) { ... } ``` #### 二、DMA-BUF 的概念及其工作原理 DMA-BUF 是一个通用框架,允许不同设备之间高效传递缓冲区对象而不需实际拷贝数据。这极大地提升了跨进程间资源共享的能力[^5]。 - 当某个设备不再需要访问某块缓冲区时,会先执行 `dma_buf_detach()` 解除关联关系,随后再通过调用 `dma_buf_put()` 来减少对该缓冲区实例的引用计数直至最终释放资源[^5]。 #### 三、两者结合使用的场景分析 在现代 SoC 架构下,尤其是涉及多媒体处理的任务里,ION 负责创建初始的内存区域并将它们封装成 DMA-BUF 对象以便于其他子系统利用。例如,在 Mali GPU 驱动程序内部: 1. 利用 ION 接口申请一块满足条件的大块连续物理内存; 2. 将其转换为支持 DMA 映射特性的文件描述符形式传送给客户端应用层或者另一个独立 IP block 如 ISP/DSP 等部件消费; 3. 客户端可以通过 mmap() API 把接收到的数据映射至自己的虚拟地址空间进而直接读写内容而无需额外搬移动作发生。 这种协作模式不仅简化了开发流程还增强了系统的灵活性与可扩展性特性表现优异之处显而易见。 --- ### 示例代码展示如何基于 ION 创建 DMA-BUF 缓冲区 以下是简化的伪代码片段演示整个过程的关键部分: ```c #include <linux/dma-buf.h> #include <linux/ion.h> static struct dma_buf *create_dma_buf(struct device *dev, size_t size) { struct ion_client *client; struct ion_handle *handle; struct dma_buf *dmabuf; client = ion_client_create(dev->ion_data->heap_count); handle = ion_alloc(client, size, PAGE_SIZE, ION_HEAP_SYSTEM_MASK); /* Export the allocated buffer as a dma-buf */ dmabuf = ion_share_dma_buf(handle); ion_free(client, handle); ion_client_destroy(client); return dmabuf; } /* Later when done using the buffer... */ void release_dma_buf(struct dma_buf *buf) { dma_buf_unmap_attachment(buf->attachment, buf->sgt, DMA_BIDIRECTIONAL); dma_buf_detach(buf, buf->attachment); dma_buf_put(buf); } ``` 以上展示了怎样借助 ION 子系统构建可供外部消费者使用的 DMA-BUF 实例以及后续清理工作的标准做法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值