Python:实现一个 "software-wide" 设置,在每个循环中没有 运行 if 语句的情况下不会经常更改

Python: implement a "software-wide" setting that does not change often without running an if statement in every loop

我希望 Python 忽略在经常调用的函数中不太可能调用的语句。

我没有接受过正规的编程教育,所以请原谅我描述事物的能力不足。我将尝试通过示例来解释这个概念。

假设我正在编写一个视频游戏,第一人称射击游戏,每秒绘制 60 帧。 在设置菜单中,用户可以select是否在头顶显示其他玩家的名字。如果他们禁用它,我将此值存储为 showplayernames = False.

然后在我输出图形的绘图函数中:

def draw():
    #code that draws the graphics on screen
    if showplayernames:
        #code that draws the name of players on screen

我每秒调用此函数 60 次,但每秒 60 次检查 showplayernames 是否为 True 完全没有意义。它不会经常改变,事实上我可以通过阻止它改变来使它在游戏过程中成为一种“常量”。如果 showplayernames 为 False,则代码的第三行和第四行完全多余,但仍会执行。计算机不够聪明,不知道它可以忽略它,并且存在性能差异:读取一个值然后检查它是否为 false 需要时间。

我可以编写两个游戏副本(或者至少是 draw() 函数),当用户 selects 不在设置中显示名称时,一个只有前两行,另一个没有 if 语句,然后 运行 适当的语句。

def draw_with_names():
    #code that draws the graphics on screen
    #code that draws the name of players on screen

def draw_without_names():
    #code that draws the graphics on screen

虽然每秒循环 60 次比 运行ning draw() 更有效,但这显然不是要走的路。这样的设置有几十种。

那么软件和游戏设计师如何有效地实现这些“软件范围”设置?

不是游戏设计师,但这是我的声音。 您可以将设置存储在您 python 旁边的 json 文件中,但是您需要涵盖阅读、获取正确的值等

您可以使用环境变量来存储值,但最终会在代码中使用“if”。

游戏设计师使用触发器和事件来完成任务,并且在最低级别上我假设这些东西也使用 if。

system-wide-settings 最终将与 if's

一起使用

您可以使用基于 event/trigger 的覆盖并在两次中使用“相同”的绘制函数,但这只会使代码复杂化,我们都知道“保持简单”。

抱歉,如果这不是您要找的答案。

我不是游戏开发者,但这是一种选择。创建函数指针列表,并根据设置在列表中添加或删除。示例:

def draw_player_names():
    # Code to overlay names

def draw_fps():
    # Code to overlay fps

def draw():
    # Main code to draw a frame of the game

# Hold all the functions to call
optional_funcs = []
if showplayernames: optional_funcs.append(draw_player_names)
if show_fps: optional_funcs.append(draw_fps)

# Main game loop
while True:
    draw()
    for f in optional_funcs: f()

这可以扩展为任意数量的 functions/options。

正如 Matthias 所说,您真的不应该为这种优化操心。看看这两个很傻的函数:

def lot_of_ifs(settings):
    #do something
    a=2**10
    b=2**10
    c=2**10
    for setting in settings:
        if setting:
            #do something more
            a=2**10
            b=2**10
            c=2**10

def no_ifs():
    #do something
    a=2**10
    b=2**10
    c=2**10

timeit("lot_of_ifs([0,0,0,0,0])", globals=globals())
0.2630380000000514

timeit("no_ifs()", globals=globals())
0.10232830000040849

创建一个列表、遍历它并执行 5 if 秒的成本约为 0.16 秒 100 万 次迭代,或 每次迭代 160 纳秒,而在 60 fps 时,您有 1660 万纳秒 来执行您的代码。