1.【Busybox】Busybox源码分析-02 | init程序
2.MapBox源码解读 mapbox-gl-js
3.Rockbox Utility音频播放器软件介绍
4.在树莓派5安装运行Box64
5.Box2d源码阅读(2):从GJK到CCD
6.BusyboxBusybox源码分析-01 | 源码目录结构和程序入口
【Busybox】Busybox源码分析-02 | init程序
在Linux内核启动后期,码系init线程执行的码系第一个用户空间程序是init,这个程序在Busybox源码中的码系实现由/init目录下的init.c编译而成,其入口点为init_main()。码系在init_main()函数中添加了标识代码,码系验证了这一过程。码系源码编辑器抗疫制作实际上,码系当Busybox编译安装后,码系会通过链接指向../bin/busybox来执行init。码系 分析init程序,码系当CONFIG_FEATURE_USE_INITTAB配置启用时,码系会依据/etc/inittab文件中的码系配置进行操作;若文件不存在或未启用该配置,init将执行默认行为,码系如运行INIT_SCRIPT和启动"askfirst" shell。码系而BusyBox的码系init不支持运行级别,sysvinit是需要的选项来处理运行级别管理。 Linux支持7个运行级别:0:停机状态,等同于关机,不可作为默认运行级别。
1:单用户模式,用于系统维护,禁止远程登录。
2:多用户无网络模式。
3:多用户有网络模式,常见运行级别。
4:保留,未使用。
5:X图形界面,登录后进入。点点网源码
6:正常关闭并重启,同样不能作为默认运行级别。
可以通过runlevel命令查看当前运行级别,如在Ubuntu系统中,运行runlevel命令会显示当前的运行级别。MapBox源码解读 mapbox-gl-js
分享技术积累,GIS引擎开发,尤其是地图模块在web UI显示中的应用,其价值不容忽视。从加入四维图新起,我就有机会接触底层技术,从leaflet源代码的修改、mapbox源码的调整,到与团队共同开发心中的三维GIS引擎,经历丰富。
将撰写一系列文章,以mapbox源码的阅读和定制化开发为切入点,为前端开发者提供有价值的经验参考。今天将介绍mapbox源码的正确使用方式。
要测试代码,请在命令行执行以下操作。在 /dist/ 目录下找到 mapbox-gl-dev.js,这是可用于任意分发的地图引擎的web端js代码。还需要与之对应的css来显示地图。
打开debug目录下的页面 chinese.html,使用vscode打开并启动live server,可看到包含大量汉字的地图界面。接下来,互动源码安装进入html页面,我们想将mapbox定制为自定义版本,比如命名为mr。
修改全局名称以实现自定义。在根目录的 rollup.config.js 中找到相应的代码,将其改为mr。之后打开html,使用 new mr.Map(...) 实现魔改。所有类通过mr.前缀访问,如mr.Marker、mr.Popup。
了解更改背后的具体实现逻辑,需要探索src目录下的入口文件。mapbox使用rollup打包,将mapboxgl映射到src/index.js。大多数js包的入口文件都会暴露所有类,通常需要先运行 npm run build 在Source目录下生成Cesium.js。使用时通过window下的Cesium变量获取类,如 const viewer = new Cesium.Viewer("cesiumContainer");。
观察mapbox src/index.js代码,会发现accessToken在全局变量中被优先赋值。workerCount负责创建webworker的数量,通常应尽量少于或等于CPU线程数以发挥最佳性能。mapbox在早期就引入了web worker的使用。在早期ie版本中,web worker以blob形式加载时存在限制,因此一些项目将mapbox拆分为两个文件,一个是ccoa源码下载mapbox-gl.js,另一个是worker.js,通过URL形式访问。
worker的实现可以在代码调试中查看。在nodejs端和browser端生成的代码在测试时有所不同,参见package.json的配置。mapbox内部会生成一个worker池来处理不同图层的请求。
地图从url加载到屏幕上,这一过程可以用简单的流程图表示。分为三条主线:数据更新请求触发、worker请求和数据解析、序列化、最终触发重绘逻辑,每个图层会执行多次drawFn,如drawLine、drawFill。这里的“draw”并非一次draw call,而是根据瓦块数量执行多次。
提及一些额外信息,mapbox在三维架构上的支持并不尽如人意。如基本的图元封装、material材质封装等概念尚不成熟,没有模块化shader的概念,一个绘制通常包含一套顶点和片元着色器,相机概念、视锥体剔除等特性也在逐步添加。在处理大场景三维或实现良好三维效果时存在挑战。不过,最近两年mapbox在性能优化、easyui 源码解析统一管理uniform等方面取得了一定进展。
本文内容至此结束,后续将深入探讨style实现及不同样式点线面的绘制方法。
Rockbox Utility音频播放器软件介绍
Rockbox是一款基于GPL的开放源码操作系统,专为便携式数字音频播放器设计。它被称为开放源码的音乐播放器固件,能够完全替换支持设备的原有操作系统。经过长期发展,Rockbox已经成熟,成为一个具有可扩展性和灵活性的平台,通过插件机制提供了丰富多样的功能,如PDA功能、应用程序、工具和游戏等。甚至有计划为年中期的DAP添加视频播放功能,以满足更多用户需求。特别值得一提的是,它还配备了语音驱动界面,方便视力障碍人士使用。 对于中文用户,Rockbox支持简体中文界面,使其更加易用。以下是部分支持的播放器型号:Apple: 从第一代到第五代iPod、iPod Mini,以及第一代iPod Nano(不支持Shuffle、2、3代Nano,无论是经典型还是触摸型)
Archos: Jukebox , , Studio, Recorder, FM Recorder, Recorder V2, Ondio
Cowon: iAudio X5, X5V, X5L, M5, M5L
iriver: H, H, H系列
Olympus: M:Robe
SanDisk: Sansa c, e和eR系列(不包括v2型号)
Toshiba: Gigabeat X和F系列(不包括S系列)
在树莓派5安装运行Box
在树莓派5上运行Box,首先要确保操作系统为位,因为Box专为ARM架构设计,用于在Raspberry Pi上运行x软件。更新系统至最新版本至关重要,可通过运行更新软件包列表和升级过时包的命令实现。
接下来,安装编译Box所需的软件包。只需输入相应的命令,让这些包在你的Raspberry Pi上安装就绪。进入Box源代码目录并创建一个“build”目录,用于在设备上编译模拟器。
进行编译时,使用make工具,它会利用CMake生成的信息来完成任务。启动编译,尽管过程中可能看起来停滞,但请耐心等待几分钟,直到编译完成。一旦编译成功,执行安装命令将Box添加到系统中。
最后,为了使Raspberry Pi能够识别和使用新安装的Box,需要重启“system-binfmt”服务。这样,你的树莓派就准备好运行位软件了。
Box2d源码阅读(2):从GJK到CCD
GJK算法在Box2D中的应用
Box2D中的GJK算法整合了Voronoi区域算法与重心坐标原理,旨在计算两个形状之间的最短距离。为了使查询更加通用,Box2D使用了封装的通用输入输出对象,通过b2distanceproxy来传递顶点和形状半径。当需要查询两个形状间的距离时,通过m_buffer进行特殊处理,以适应链状形状。
在GJK算法中,单纯形作为关键数据结构,其定义包含了索引信息以标识顶点来源于两个形状。在封装一层单纯形后,我们开始探索单纯形中的一些辅助函数,如solve2和solve3,这些函数用于更新单纯形的顶点。它们分别负责查找在已形成的线段或三角形上,距离原点直线距离最短的点。通过重心坐标方法计算a1和a2系数,求解p点在w1和w2之间的位置。
在两个形状之间距离求解过程中,函数通过一系列步骤实现。首先,定义了所需的公式和变量,利用p点与线段垂直的性质求解a1和a2系数。通过行列式方法求解方程组,得到p点在w1和w2之间的坐标。类似地,solve3函数也利用公式进行求解。
对于TOI(Time of Impact)的实现,Box2D通过三重for循环驱动来计算两个形状在运动过程中的撞击时间,以及快速运动中在一次tick内互相穿越的情况。首先,使用sweep功能表示形状在指定时间后的location和rotation信息。接着,通过b2SeparationFunction查找两个形状之间的距离。在求解TOI时,函数通过三重循环结合二分法与割线法进行逼近,找到(t1, t2)范围内满足条件的时间。
尽管代码实现和示例存在细微差异,Box2D的GJK算法与TOI实现的核心逻辑保持一致,展示了通过优化查询和计算过程,高效地处理物理引擎中形状间的距离与碰撞检测问题。
BusyboxBusybox源码分析- | 源码目录结构和程序入口
Busybox是一个开源项目,遵循GPL v2协议。其本质是将多个UNIX命令集合成一个小型可执行程序,适用于构建轻量级根文件系统,特别是嵌入式系统设计中。版本1..0的Busybox体积小巧,仅为几百千字节至1M左右,动态链接方式下大小更小。其设计模块化,可灵活添加、去除命令或调整选项。
Busybox程序主体在Linux内核启动后加载运行,入口为main()函数,位于libbb/appletlib文件末尾。通过条件分支处理,决定以库方式构建。在函数体中,使用mallopt()调整内存分配参数以优化资源使用。接着通过条件宏定义,控制代码编译逻辑,如在Linux内核启动后期加载并运行Busybox构建的init程序。命令行输入时,Busybox会解析参数,执行对应操作。
在源码中,通过char * applet_name表示工具名称,调用lbb_prepare()函数设置其值为“busybox”。之后解析命令行参数,如在mkdir iriczhao命令中,解析到mkdir命令传递给applet_name。配置了FEATURE_SUID_CONFIG宏定义时,会从/etc/busybox.conf文件中解析配置参数。最后,执行run_applet_and_exit()函数,根据NUM_APPLETS值决定执行命令或报错。
在命令行下键入命令后,执行关键操作的函数是find_applet_by_name()和run_applet_no_and_exit()。编译构建并安装Busybox后,可执行程序和命令链接分布在安装目录下。从源码角度,命令有一一对应的执行函数,通过命令表管理命令入口函数。在代码执行逻辑中,首先调用find_applet_by_name()获取命令表数组下标,再传递给run_applet_no_and_exit()执行对应命令。
MapBox源码解读 - style 的加载逻辑
本文主要聚焦于MapBox实例化过程中style的加载和渲染流程。这个过程涉及多个步骤:首先,从数据源发起请求获取style数据,然后通过解析将数据转化为可操作的结构。数据进一步根据属性进行赋值,接着进行着色器的计算,最终在屏幕上呈现图层。为了更直观地理解,这里有一个定制化线侧渲染的demo示例。
style的加载和渲染过程可以分解为:数据获取-解析-属性赋值-着色器执行。如果你对这个过程还感到困惑,可参考相关附件获取详细信息。
通过上述步骤,创建mapbox对象时,源代码中添加source和layer的代码其实遵循这样的逻辑:数据驱动图层展现。现在,让我们通过一个简单的线单侧绘制的案例,实际演示这个过程。
今天的讲解就到这里,额外提一个小贴士:在WebGL的web端调试中,Spector.js是一个非常实用的工具,适用于Firefox和Chrome,你可以自行下载并进行探索使用。