针对低内存使用情况,康威生命游戏的有效实现是什么?

2024-03-23

我正在寻找一种快速且节省内存的方法来实现康威的生命游戏。

限制:96x128 板、大约 2kB 可用 RAM 和 52MHz 处理器(请参阅此处的技术规格:http://www.getinpulse.com/features http://www.getinpulse.com/features).

我当前的简单解决方案将每个单元表示为矩阵中的单个位(96*128/8=1,536 字节),但速度太慢。可以使用哪些技巧来提高性能?

存储活细胞的坐标(例如在此实现中http://dotat.at/prog/life/life.html http://dotat.at/prog/life/life.html)会使用太多内存。


看起来像是一个有趣的硬件。 96x128 像素显示器的每个像素存储 1 位即可得到 12,288 位。 这已经超过了您所说的“可用”16,384 位的一半以上。 如果每个单元甚至无法存储 2 位,那么就没有足够的空间可以做很多事情。

一些想法:

  • 您有一个 32 位处理器。有几种位操作技巧可以在这样的处理器上获取位图并并行计算多个单元的邻居数量。

  • 存储邻居计数(在出生时增加所有 8 个邻居并在死亡时减少所有 8 个邻居)通常更快,而不是每一代从头开始重新计算邻居数量 - 但看起来您没有足够的内存来执行这种方法。

  • 也许您可以使用每个单元 2x2 像素(因此只有 3,072 个单元可见)或每个单元 3x3 像素(因此只有 1,376 个单元可见),这样您的软件就会减少工作量,从而给人一种运行速度更快的错觉。 (这也释放了足够的 RAM,您可以进行上面提到的邻居计数)。

  • 由于许多生命模式都有大面积的死空间,因此可能有一个小的“活区域”位图 - 例如,一个 12x16 位数组,如果相应的 8x8 单元区域完全死,则每个位为“0”,并且“ 1”如果相应区域中的任何细胞还活着。下一代更新只需要查看存活区域和死亡区域的 1 个单元格宽度的边界;您可以跳过检查死区的 6x6 单元核心。此外,如果整个 8x8 单元区域的 4 个最近的相邻区域也已失效,则您可以完全跳过整个 8x8 单元区域。

  • 由于许多生活模式都有大面积的静态不变的“静物”模式,因此可能有一个小的“动态区域”位图——例如,一个 12x16 位数组,如果相应的 8x8 单元区域有,则每个位都是“0”上一代更新中没有变化,如果相应区域中的任何单元格在上一次更新中发生变化,则为“1”。下一代更新只需要查看动态区域和静态区域的1-cell宽边界;您可以跳过检查静态区域的 6x6 单元核心,因为它在下一代中是相同的。

  • 如果一个模式“足够大”,基于 Gosper 的 Hashlife 的表示可能能够将其存储在比直接存储位图更少的 RAM 中。唉,我怀疑你远远低于“足够大”的门槛。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

针对低内存使用情况,康威生命游戏的有效实现是什么? 的相关文章

  • 使用指针功能 - 1 个设备上的 2 个独立应用程序

    我前段时间问过这个问题如何使用主应用程序和引导加载程序中的一项功能 嵌入 https stackoverflow com questions 45459776 how can i use one function from main app
  • 中断的尾链

    什么是 ARM Cortex M3 中 NVIC 支持的中断尾链 尾链是异常的背对背处理 无需 中断之间的状态保存和恢复的开销 这 处理器跳过八个寄存器的弹出操作和八个寄存器的压入操作 当退出一个 ISR 并进入另一个 ISR 时 因为这没
  • 如何检查 uint8_t 是否作为类型存在,而不是 unsigned char?

    我有两个编译器 一种可以识别 uint8 t GCC ARM EABI 另一种则不能 Renesas M16 标准工具链 Renesas 工具链不兼容 ANSI C 因此您可以丢弃 因此 uint8 t uint16 t 未定义为现有类型
  • 如何静态识别动态堆分配?

    我即将在我的应用程序中删除 尽可能多的 动态堆分配 我想知道如何确保我没有错过任何内容 目前 我正在寻找一种方法来轻松甚至自动判断代码的任何 或哪些 部分可能会调用以下标准实现new delete or malloc free无需动态跟踪分
  • 写入数据到寄存器

    我有某个寄存器的内存地址 地址LCDCW1是C000 c codes define LCDCW1 0xC000 LCDCW1 0x31 我只想将数据写入该寄存器 代码有问题 如何修改 thx 正如其他人所建议的那样 您可以声明一个适当的指针
  • 什么是 Qt 裸机?

    QtCreator 有一个名为 Bare Metal 的插件 裸机是指没有操作系统的计算机 我还没有看到太多关于Qt Bare Metal开发的内容 这是为裸机系统开发 Qt 的一种方法吗 Qt 可以在没有操作系统的系统上运行吗 如果是 这
  • 如何在 Eclipse 中为托管 ARM C 项目添加单元测试?

    我有一个托管 Eclipse 项目 它使用 GNU ARM 嵌入式工具链为 ST 微控制器进行编译 我现在想做的是 对该项目中的代码进行单元测试 我想用于单元测试的框架是Google Test 我尝试为单元测试创 建第二个 Eclipse
  • C++ 异常处理增加了多少占用空间

    这个问题对于嵌入式开发尤其重要 异常处理为生成的二进制输出增加了一些占用空间 另一方面 毫无例外 错误都需要以其他方式处理 这需要额外的代码 最终也会增加二进制大小 我对你的经历很感兴趣 尤其是 您的编译器为异常处理添加的平均占用空间是多少
  • 如何避免 PyTorch 中的“CUDA 内存不足”

    我认为对于 GPU 内存较低的 PyTorch 用户来说 这是一个非常常见的消息 RuntimeError CUDA out of memory Tried to allocate X MiB GPU X X GiB total capac
  • 如何使用文件实现循环缓冲区?

    我的应用程序 C 程序 打开同一文件的两个文件句柄 一个处于写入模式 一个处于读取模式 应用程序中的两个单独的线程读取和写入文件 这很好用 由于我的应用程序在 RAM 磁盘大小有限的嵌入式设备上运行 我想写FileHandle在达到最大大小
  • 头文件中的内存分配

    我工作的公司有针对嵌入式目标的 C 开发的开发规则 一是 建议不要在头文件中分配任何存储空间 我不确定这意味着什么 写它的人不在身边 其他开发人员也不在乎 所以我在这里问 我的理解是 我不应该在头文件中声明变量 因此在 h 中不鼓励类似的操
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • Node.js |如何通过串口向设备发送和接收一个字节?

    我正在尝试编写使用以下方法的 Node js 脚本serialport https serialport io 用于读取和写入数据的 npm 包COM5串行端口 使用 RS 232 电缆连接到设备 该设备会自动传输其拥有的数据 要检索设备内
  • Java 中的生命游戏,人口过剩但不明白为什么

    这是家庭作业 我在底部添加了相关代码 Problem 在试图允许用户调整网格大小时 网格现在被绘制得严重过度填充 截图 人口过剩 https i stack imgur com 0Ilrq png https i stack imgur c
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 产生并处理软件中断

    有人可以告诉我如何在Linux下生成软件中断然后用request irq处理它吗 或者也许这是不可能的 您可以使用软中断来代替 您可以通过编辑 include linux interrupt h 来定义您的 sofirq 然后使用函数 ra
  • stm32中如何在同一个回调函数中从不同的uart获取数据

    我使用的是stm32f407控制器 我正在使用 2 个 uart 2 3 我第一次被中断 但第二次我在 uart 2 上被中断 我在 uart3 上没有被中断 下面是我的回调函数 void HAL UART RxCpltCallback U
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • 工作站和嵌入式程序员之间的心态差异[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m

随机推荐

  • document.cookie 未返回所有 cookie

    我正在尝试使用以下方式读取我的域设置的所有 cookiedocument cookie我注意到 它只返回 csrftoken 和另一个值 我的目标是阅读sessionid从饼干 please see the below screenshot
  • 如何交互式地挑选

    我已经在一个分支上黑了一段时间了 这个分支很快就不会被合并了 但无论如何 我还是想将一些提交合并到 master 中 有没有办法获得交互式的挑选 它将显示提交及其更改 然后让我选择我真正想要挑选的内容 您可以使用提交图来做到这一点 gitk
  • Ruby 和修改 Float 实例的 self

    我想更改浮点实例的自身值 我有以下方法 class Float def round by precision self 10 precision round to f 10 precision end end 我想添加 round by 方
  • c++0x_warning.h:31:2:错误:

    我正在尝试创建一个文件并收到此错误 我是新手 有人能帮我一下吗 usr include c 4 6 bits c 0x warning h 32 2 error error This file requires compiler and l
  • Cocos2d 3.0中如何获取winSize

    我在Cocos2d 1 0和Cocos2d 2 0中使用了以下代码 但在Cocos2d 3 0中似乎找不到 CGSize s CCDirector sharedDirector winSize 如何在Cocos2d 3 0中获取屏幕尺寸 您
  • 如何使用 Unity 将基于 2D 数组的图块实例化到平台游戏中?

    我正在构建一个非常简单的平台游戏 使用 2D 数组来构建基于它的地图 我想要两个简单的目标 但目前还没有找到答案 确保相机为 16 9 并且我的场景将 100 显示在其中 像在数组中一样构建 2D 平台图块集 我的环境 Unity 5 5
  • C# 编码指南 [重复]

    这个问题在这里已经有答案了 可能的重复 C 编码标准 最佳实践 https stackoverflow com questions 14967 c coding standard best practices 您推荐哪些最流行 最合理且最详
  • 增加 gradle 的超时时间以获得 Maven 依赖

    我正在尝试通过以下方式从 Maven 获取 jar 依赖项grails 3 1 5 gradle依赖解析 如何增加 gradle 获取 Maven 依赖项所需的超时时间 当然 我已经看到依赖项需要更长的时间才能下载 但是我如何配置 grad
  • 从 flutter 应用程序中的 fireStore 获取带有索引的列表

    我正在尝试从 firestore 获取列表 但我遇到了索引问题 这是列表上普通项目的结构 每个对象都包含一个项目列表 class RestaurantFoodList final String id final String title L
  • 如何创建带有背景图像的倾斜透明形状?

    I want to achieve something like this it has a background image https imgur com cSde7ff I only able to make a slanted di
  • 由于 Javadoc 错误而无法构建 Maven 项目?

    有没有人遇到过类似的 Maven 错误 如下所示 由于以下错误 我无法构建我的项目 在我开始编写代码之前 一切都工作正常 我什至没有处理下面定义的接口 它似乎与 Javadoc 有关 ERROR Failed to execute goal
  • Trinidad/ADF Faces、文件上传、EOFException

    我在 Tomcat 8 5 服务器上的 web xml version 3 1 中使用 JSF 2 3 Mojarra 2 3 3 Trinidad 2 2 1 及其文件上传组件 tr inputFile 我收到以下异常 并且没有有效的上传
  • Winforms 窗体间切换

    我现在用的是winform 我有主表单 form1 还有一个打开 form2 的按钮 当我打开 form2 时 我希望 form1 消失 当用户单击 form2 上的 x 按钮时 我希望它关闭并返回到 form1 我不想使用模态窗口 pri
  • 进程资源不受 setrlimit 限制

    我编写了一个简单的程序 将其数据大小限制为 65Kb 并验证相同的情况 我分配了超过 65Kb 的虚拟内存 从逻辑上讲 如果我执行了所有正确的操作 如下所示 那么 malloc 调用应该会失败 不是吗 include
  • gcc(windows + MinGW) 是否在 inttypes.h 中定义了 SCNd8、SCNu8?

    include
  • 顺风旋转木马

    我想使用 Tailwind CSS 制作一个轮播 但我无法将一些纯 CSS 转换为顺风 CSS 如果无法将纯 CSS 转换为 tailwind CSS 请告诉我如何在我的 React 项目中添加该 CSS 我在用REACT 请帮我解决这个问
  • 如何在 Laravel 4 中构建带有子应用程序的平台?

    我需要开发几个具有共同功能和流程的网站 唯一会发生巨大变化的是CSS 甚至HTML也会通用 我在 Laravel 4 中组装这个结构时遇到了麻烦 因为我仍然是该框架的初学者 我需要有一个所有 子项目 都将继承的 超级项目 我需要能够在特定的
  • 如何通过Java执行cmd命令

    我正在尝试通过 Java 执行命令行参数 例如 Execute command String command cmd c start cmd exe Process child Runtime getRuntime exec command
  • WooCommerce 显示自定义列

    我想在 WooCommerce 后端显示一个附加列 在订单概述中 该列应包含我定义的自定义字段 交货日期 这个怎么做 如果有人仍然需要它 有关如何在 Woocommerce 订单列表中添加新列的说明 无需取消设置默认列 只需将其添加到您的f
  • 针对低内存使用情况,康威生命游戏的有效实现是什么?

    我正在寻找一种快速且节省内存的方法来实现康威的生命游戏 限制 96x128 板 大约 2kB 可用 RAM 和 52MHz 处理器 请参阅此处的技术规格 http www getinpulse com features http www g