【问题标题】:How to add each element of a tuple or list by a fixed value?如何通过固定值添加元组或列表的每个元素?
【发布时间】:2013-09-29 23:13:36
【问题描述】:

我有一个表示 RGB 颜色的元组。我的目标是通过在每一帧中添加一个固定值,使其在一秒钟内从黑色 (0, 0, 0) 变为白色 (255, 255, 255)。我将如何在函数中对此进行编码?

这里是更新函数:

def update(self, dt):
        now = pygame.time.get_ticks() / 1000
        if now - self._spawn_time >= BALL_WAIT_TIME: 
            self.rect = self.calcnewpos(dt)
            self.handle_collision()
        else:
            # ANIMATION HERE

【问题讨论】:

  • 元组是不可变的。目前还不清楚您建议如何更改 one 的值。
  • +1。对我来说:错误的假设,有效的问题。您能否更清楚地说明“让它去”是什么意思?标题对我来说也有点不清楚:也许 'How to add a fixed value to each element of a list' 是你的问题? (就目前而言,这对我来说没有意义,我怀疑是错误的英语。虽然“元素”可以“添加”到某物上,但不能“由”任何东西 - 除了“由人类”或“由函数'等,但我认为这不是你的意思)。
  • @naxa 我的意思是我希望元组的价值增加,直到它达到白色(255、255、255)。

标签: python pygame tuples


【解决方案1】:

由于您的元组只是重复相同的数字,因此只需使用范围循环并从头开始创建元组:

for i in range(256):
    rgb = (i, i, i)

这里不需要加分。

或者,从帧计算i。一秒30帧?将 256 除以 30 得到步长,然后使用帧数:

step = 256 / 30.0
value = int(frame * step)
rgb = (value, value, value)

【讨论】:

  • 我理解 range 返回一个迭代器。每帧调用它不是很昂贵吗?
  • @Jovito:因为你没有指定如何你的动画是如何工作的,所以我给了你两个角度。范围的想法是当您使用循环本身驱动动画时。关键是您为每一帧从头开始生成 RGB 元组。
  • 另一个问题是值可能会大于 255。它不能按原样回答问题。
  • @Jovito:你之前没有发布代码。我在演示原则。你确实需要自己做一些工作!算出你需要多少帧并从中采取步骤的想法怎么样?
  • @Jovito:你有 pygame 滴答声;那些计数毫秒。如果您需要制作一秒钟的动画,则需要使用 1000 个刻度。 255.0/1000 为您提供每个刻度的步长。从中计算 RGB 值。
【解决方案2】:

如果您非常关心每帧的性能,您可以预先分配您需要的所有元组。

那么为什么不为你想要做的任何事情制作一个颜色字典呢?

# Pre-animation allocation
colors = {}

for i in xrange(256):
    colors[i] = (i,i,i)
# Divide 256 by frames per second
step = 256 / 60
# current RGB value
RGB_val = 0

# During animation, suppose loop iterates 60 times per second
while True:
    # During update
    RGB_val += step
    color = colors[min(RGB_val,255)]
    # Draw to display surface

如果您在尝试执行任何操作时预先分配元组,而不是在代码快速翻阅帧时尝试生成元组,您将获得最高性能。 Python 可以轻松地在内存中加载和存储 3 个元素的 256 个元组,并在动画循环过程中以最低的性能成本快速浏览它们。

【讨论】:

  • 从简单的算术中生成一个 3 元素的元组实际上会表现得同样好。
  • @MartijnPieters 我不这么认为。我的方法切换名称color 的绑定。您的方法每帧生成元组。在 Python 中创建元组(或任何对象)的成本很高。切换名称指向的内容不是,特别是如果名称在将存储在本地范围内的字典中(Python 将使用字典的寄存器,并且由于 Python 的散列函数,在字典中查找值非常快) .您可以使用timeit 来测试您是否不相信我创建元组/列表的速度有多慢。
  • 元组被缓存,实际上创建短元组相对便宜。在字典中查找对象确实需要计算哈希。调用min() 需要全局查找和堆栈推送和弹出。这一切都很重要
  • 我并不是说我的版本更快,您需要在那里运行实际的timeit 试验。但也不要通过“字典查找很快”,而不是在您进行计算以创建密钥 too 时。
  • @MartijnPieters 我很确定我在某处读到__hash__(x),其中 x 是 Python 中的整数类型,它只返回 x 本身。所以如果key都是int类型的话,真的不用太多计算。
猜你喜欢
  • 2019-05-24
  • 2023-03-21
  • 1970-01-01
  • 2023-04-06
  • 2021-09-15
  • 1970-01-01
  • 2021-10-04
  • 2017-09-27
  • 1970-01-01
相关资源
最近更新 更多