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 万纳秒 来执行您的代码。
我希望 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 万纳秒 来执行您的代码。