- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近发现了面向数据设计的好处。它看起来非常令人印象深刻。要点之一是按类型和访问对数据进行分组,不是全部放在对象中,而是放在数组中,以防止缓存未命中并进行更好的处理。
所以在游戏中我们仍然有实例,用户可以销毁它们中的任何一个(不仅仅是数组中的最后一个)。我不知道如何有效地处理数组中间的对象删除。
我有一个想法:拥有 isAlive
值,但这将对条件数量造成相当大的影响,因为每个对象在处理、绘制、...
另一个想法是移动整个数组以填充必须删除的空间,但这会在删除时消耗大量资源。
人如何在国防部处理这个问题?
所以提出要求:
最佳答案
其实很简单,不要使用直接引用。使用一个间接层,例如 ID。例如:
假设您有一个 FooManager 来管理您所有的 Foo“对象”(不是 OOP 意义上的对象,每个 Foo 属性的数组集合)。据我了解,您现在所做的只是返回一个索引。假设 Foo #42 是数据位于所有数组索引 42 处的 Foo。现在您要删除 Foo #42,这会在您的阵列中造成一个洞。您可以移动所有其他数组条目,但 Foo #43 不再指向实际索引 43。
所以我们添加一个 ID 表,而不是返回索引,而是返回一个 ID。当您创建一个新的 Foo 时,您将其数据添加到数组中的第一个空闲索引(假设为 42)。然后生成一个新的未使用的 ID(比如说 1337)。现在你可以更新 ID 表(一个(散列)映射非常适合这个)说 ID 1337 指向索引 42。现在你可以将 ID 1337 返回给调用函数。 (注意调用函数永远不会发现数据实际存储在哪里,这是不相关的信息)
下次需要从另一段代码更新 Foo 时,将使用 ID。因此 FooManager 的 setBar 函数将使用 ID 1337 和新的 Bar 值作为参数调用。 FooManager 在其 ID 表中查找 1337,发现它仍位于索引 42 处,并使用新的 Bar 值更新 Bar 数组索引 42。
现在这是系统获取它的值的地方,让我们删除 Foo 1337。调用 FooManager 的 removeFoo 时,ID 为 1337 作为参数。它查找 1337,它位于索引 42。但是,与此同时,添加了 10 个新的 Foo。所以我们现在可以做的只是将索引42的值替换为52的值,有效地将52移动到42。这在旧系统中会导致一个大问题,但现在我们只需要更新索引表。所以我们查找哪个 ID 指向 52(假设它是 1401)并将其更新为 42。下次有人尝试更新 ID 为 1401 的 Foo 时,它在索引表中查找它并发现它位于索引 42。
所以我们将数据保存在连续内存中,删除只需要非常少的数据复制操作(Foo 的每个属性一个副本),而 FooManager 的“外部”代码甚至从未意识到发生了什么。它甚至解决了无效引用问题。假设某些代码仍然具有已删除的 1337 ID(悬空引用,这很糟糕!),当它尝试访问/更改它时,FooManager 查找它,发现 1337 不存在(不再存在)并且可以生成一个很好的干净警告/error 和 callstack,它可以让你直接识别哪些代码仍然有悬空引用!
只有一个缺点,就是在 ID 表中进行了额外的查找。现在哈希表可以非常快,但是每次修改 Foo 对象时它仍然是一个额外的操作。但是,在大多数情况下,从经理外部访问的发生率远低于从经理内部访问的发生率。当您拥有 BulletManager 时,它会在每一帧更新每个项目符号,但访问项目符号以更改/请求某些内容以及调用创建/删除项目符号的可能性较小。
如果情况正好相反,您可能应该更新数据结构以针对这种情况进行优化。再说一次,在这种情况下,数据在内存中的位置不再重要,因此您可以忍受数组中的“漏洞”,甚至使用完全不同的数据布局。
关于data-oriented-design - 如何处理连续分配中的对象删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12762949/
只是想知道这些结构之间有什么区别(text、data、rodata、bss 等)在链接描述文件中: .data : { *(.data) } .data : { *(.data*) }
Data 定义为其核心功能之一 gfoldl : gfoldl :: (Data a) => (forall d b. Data d => c (d -> b) -> d -> c b)
以下之间有什么区别:data-sly-use、data-sly-resource、data-sly-include 和 数据-sly-模板?我正在阅读 Sightly AEM 上的文档,我非常困惑。
我有一个 Spring Boot、Spring Data JPA (hibernate) Web 应用程序,并且想引入文本搜索功能。 我理解以下内容 hibernate search 或 spring
我不知道我的代码有什么问题。我读了其他有同样问题的人的一些问题,但没有找到答案。当我尝试编译时出现以下错误: ||In function 'main':| |35|error: expected ex
我不太确定为什么会收到此错误或其含义。我的数据框称为“数据”。 library(dplyr) data %>% filter(Info==1, Male==1) %>% lm(CFL_
我一直在 GitHub 等更现代的网站上看到这些属性,它们似乎总是与自定义的弹出窗口一致,如 title 属性。 Option 1 Option 2 Option 3 Option 4 我在 HTML
如何用 iCloud Core Data 替换我现有的 Core Data?这是我的持久商店协调员: lazy var persistentStoreCoordinator: NSPersistent
我一直在 GitHub 等更现代的网站上看到这些属性,它们似乎总是与自定义的弹出窗口一致,如 title 属性。 Option 1 Option 2 Option 3 Option 4 我在 HTML
我正在通过 this project 在 Android 上摆弄 node.js ,我需要一种方法将 js 文件部署到私有(private)目录(以隐藏源代码,防止用户篡改),该目录也物理存在于文件系
大家好我有点沮丧,所以我希望得到一些帮助。我的项目在 SwiftUI 中。我想使用图像选择器将图像保存到 Core Data。我实现了让 ImagePicker 工作,但我正在努力转换 Image -
我有以下数据和代码: mydf grp categ condition value 1 A X P 2 2 B X P 5
我一直在努力解决这个问题,但我根本找不到任何解决问题的方法。希望这里有人可以提供帮助。 我正在尝试为具有以下结构的某些数据创建个人选择矩阵: # A tibble: 2,152 x 32 a
我了解 Data.Map.Lazy 和 Data.Map.Strict 是不同的。但是,当您导入 Data.Map 时,您究竟导入了什么:严格的、惰性的还是两者的组合? 最佳答案 懒人。看着docs
我正在开发一个 C 程序,用于从 BerkeleyDB DBTree 数据库中提取数据值与特定模式匹配的记录。我创建数据库,打开它,将键的 DBT 和数据的另一个 DBT 清零,将 DBT 标志设置为
所以我有以下成员(member)历史表 User_ID | Start date | End Date | Type(0-7) | ---------------------------
随着最近推出的包dataframe ,我认为是时候正确地对各种数据结构进行基准测试,并突出每种数据结构的优势。我不是每个人的不同优势的专家,所以我的问题是,我们应该如何对它们进行基准测试。 我尝试过的
我有来自 API 的数据,但无法将数组中的数据设置为 vue.js 中的 this.data这是来自 API 的数据(JSON) 你能告诉我这个语法吗 {"id":1613, "name_org":"
在 Vue.js到目前为止,我已经找到了两种定义数据的方法:data: {} 和 data() { return; }. data: { defaultLayout: 'default' }
我正在研究Spring Data Rest Services,并在自定义拦截器中遇到一些问题。之前我使用spring-data-rest-webmvc 2.2.0并以以下方式添加了拦截器。 publi
我是一名优秀的程序员,十分优秀!