【发布时间】:2013-12-10 00:23:34
【问题描述】:
在a game 中,我们使用一种称为“colour picking”的技术来选择单位。
这意味着每个可见单元都被赋予了独特的颜色。
这是一个为颜色选择绘制的场景示例:
由于某些用户可能使用 16 位显示器,因此这些颜色可以在 0..64K 范围内。
但是,如果我们给单位增加颜色,例如unit0 为 0,unitN 为 N,那么人类很难调试颜色。单位几乎无法区分。
我们希望赋予这些单元独特而独特的颜色。
我们目前正在使用二叉树 (C++ map) 以固定步长递增来存储使用过的颜色以检查冲突。这是低端硬件的性能问题。即使这是一个哈希表并且避免使用string,游戏帧中的临时内存分配也是不受欢迎的。因此,与其按原样优化代码,我更想发现是否有办法完全避免维护历史记录。
有没有办法以大步长或随机迭代数字 0..64K,以便使用大部分 64K 可能值,并避免使用已分配颜色的历史记录以避免冲突?
(屏幕上的可见单元不太可能超过 64K,我们不必处理这种情况!)
【问题讨论】:
-
值 0 到 64K 可以使用 16 位整数存储,因此如果您要使用数组和 Fisher-Yates shuffle,您只需要一个 128K 数组和一个 16 位索引下一个单位的颜色。
-
我不认为我理解这部分:“但是,如果我们给单位增加颜色,例如 unit0 是 0,unitN 是 N,那么这些颜色对于人类来说很难调试。单位实际上是无法区分。”你的意思是练习的重点是避免相似的颜色彼此靠近吗??
-
LFSR 怎么样?
-
存在一个使用线性同余生成器的 hack,但您需要一些特殊的常量,以便它会准确地选择每个元素一次。不幸的是,我不记得黑客的名称,也找不到参考...