## Apple II 高分辨率图像压缩总结 该项目专注于在有限的RAM和磁盘空间内最大化存储Apple II高分辨率(HGR)图像。未压缩时,这些单色图像需要8KB,但Apple II的内存布局——每三行后有“空洞”,以及由于硬件限制导致的非连续行存储——使得高效打包变得困难。 作者发现,在压缩*之前*交错处理HGR数据,可以为每张图像节省大约100字节的存储空间。这是通过重新排序行并在不使用大型临时缓冲区的情况下填充内存间隙来实现的。 虽然有益,但此交错处理过程会向现有的ZX02压缩例程(142字节)添加355字节的代码(包括188字节的查找表),这意味着只有在压缩大约四张图像后,它才会变得有利。性能开销是可测量的——解压缩增加大约417毫秒,交错处理增加232毫秒——但对于空间受限的项目(如演示或游戏重制版)而言,这可能是值得的。代码可在GitHub上获取,作者也在探索其对低分辨率和双分辨率图形的适用性。
## Immersa:3D演示工具概要
Immersa是一个基于Web的动态3D演示文稿制作工具。它不同于传统的幻灯片软件,允许用户导入和排列3D模型(.glb)、图像和3D文本于场景中。其核心创新在于其自动动画系统:只需复制幻灯片,重新定位对象,Immersa就会生成平滑的过渡效果。
该编辑器具有3D视口、幻灯片缩略图和对象属性面板。它支持撤销/重做、键盘快捷键和现代深色UI。演示文稿使用IndexedDB本地存储在浏览器中,确保数据持久性。
Immersa使用ClojureScript、Reagent和Babylon.js构建,提供了一种独特的方式来吸引观众,并呈现视觉上引人入胜的动画演示文稿。项目可以导出为.edn文件以供后续使用。项目和演示可在[https://github.com/ertugrulcetin/immersa](https://github.com/ertugrulcetin/immersa)找到。
## Semistable::vector: 动态容器的稳定迭代器
`semistable::vector` 是一个C++头文件库,提供了一个 `std::vector` 的即插即用替代方案,但具有关键的区别:**迭代器稳定性**。标准的 `std::vector` 迭代器在插入或删除时可能会失效,甚至在失效元素之前。`semistable::vector` 保证迭代器在这些操作之后仍然有效,使用 `std::shared_ptr` 通过“纪元”系统跟踪元素。
这种稳定性是通过在修改向量时创建新的纪元描述符来实现的,迭代器内部指向它们被创建时的当前纪元。这确保了即使在向量修改的情况下也能进行一致的解引用。
基准测试表明,在使用通过 `raw()` 成员函数获得的原始指针进行遍历和排序等操作时,性能与 `std::vector` 相当。虽然 C++20 引入了连续迭代器以实现潜在的性能提升,但当前标准库实现很少利用它们。
该库对于常量操作是线程安全的,但需要谨慎处理并发迭代器使用。未来的开发可以解决长期迭代器的异常安全性和内存管理,并且使用 `boost::local_shared_ptr` 的单线程版本展示了性能改进。