【问题标题】:Haxe - best way for storing large amount of objects at runtimeHaxe - 在运行时存储大量对象的最佳方式
【发布时间】:2014-09-16 18:23:58
【问题描述】:

我正在使用 Haxe/OpenFL 开发一款大型多人在线 2D 游戏,其中世界被划分为二维扇区网格,因此每个扇区都充当一个对象。在服务器上,这些扇区对象可能存在也可能不存在于内存中(取决于玩家当前是否在其中),我需要通过它们的 x 访问这些扇区对象和 y 坐标。理论上,在任何给定时间都可以有数千个这样的对象。

我的问题是,存储和访问这些对象的最佳(最快、最有效)方式是什么。我尝试使用以 xy 作为索引的二维数组,但我的实现速度非常慢。

【问题讨论】:

  • x 和 y 的上限是多少?如果不会使数组太长,您可以将二维数组展开为以 (x*(max-y)+y) 为坐标的一维数组。
  • 我目前对扇区数量的限制是 2^36,据我所知数组大小的限制是 2^32-1。所以我可能会限制世界的大小(无论如何它的大小有点过分)并尝试你的解决方案。非常感谢。
  • 不好。我的最大数组长度为 2^27(未初始化的数组),应用程序占用了大约 1.51 GB 的 RAM,这显然对性能产生了相当大的影响。我正在为 OS X 64 C++ 目标编译 Haxe/OpenFL 代码。
  • 只有指向对象的指针需要大约 256 Gb 来存储,我假设你没有那么多内存。根据访问模式,您可能完全无法在 RAM 中处理它,因此需要一个数据库。但是,我会尝试四叉树作为初学者。
  • 我实际上是在使用数据库来存储静态扇区数据,但我还需要在内存中拥有扇区对象以进行一些“实时”或动态操作。扇区的 HashMap 目前似乎可以工作,因为大多数扇区在游戏过程中未初始化并存储在数据库中,只有当前有玩家在其中的扇区对象才会将一些实时数据存储在内存中。玩家的数量将远远少于扇区的数量,因此在扇区数量合理的情况下,至少我希望这种或类似的解决方案应该有效。

标签: actionscript-3 haxe openfl


【解决方案1】:

在服务器端你可以使用hashmap数据结构来保存扇区,键是x_y。服务器启动时初始化所有扇区后检查内存,如果花费两个,你可以初始化一些主要扇区首先,只有在实际访问时才初始化另一个扇区。

【讨论】:

  • 似乎与 HashMap 一起工作,当只有当前使用的扇区对象被初始化时。 StringMap 也可以,但我认为在这种情况下使用带有自定义键的 HashMap 可能会更好。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-11-30
  • 2018-07-27
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2012-10-18
  • 1970-01-01
相关资源
最近更新 更多