Panda3D 实时打印帧率:完整代码及示例
以下是使用 Panda3D 实时打印帧率的完整代码,包括必要的库导入:
from direct.showbase.ShowBase import ShowBase
from direct.task import Task
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
# 设置帧率计时器
self.frame_rate_interval = 0.5
self.frame_rate_num_frames = 0
self.frame_rate_accumulated_time = 0.0
self.frame_rate_text = None
# 开始帧率计时器
self.setup_frame_rate_counter()
def setup_frame_rate_counter(self):
# 创建帧率计时器
self.frame_rate_text = self.create_text_node()
self.frame_rate_text.set_pos(-1.3, 0.95)
self.frame_rate_text.set_align(self.frame_rate_text.A_left)
self.frame_rate_text.set_text('FPS: 0')
# 注册帧率更新回调
self.taskMgr.add(self.update_frame_rate_counter, 'update_frame_rate_counter')
def create_text_node(self):
# 创建TextNode对象
text_node = TextNode('frame_rate_text')
text_node.set_text('')
text_node.set_align(TextNode.A_left)
text_node.set_font(self.loader.load_font('arial.ttf'))
text_node.set_text_color((1, 1, 1, 1))
text_node.set_shadow_color((0, 0, 0, 1))
text_node.set_shadow(0.05, 0.05)
text_node.set_shadow_offset((-0.05, -0.05))
text_node_path = aspect2d.attach_new_node(text_node)
return text_node
def update_frame_rate_counter(self, task):
# 更新帧率计数器
dt = globalClock.get_dt()
self.frame_rate_accumulated_time += dt
self.frame_rate_num_frames += 1
# 检查是否需要更新帧率显示
if self.frame_rate_accumulated_time > self.frame_rate_interval:
fps = self.frame_rate_num_frames / self.frame_rate_accumulated_time
self.frame_rate_text.set_text('FPS: %.2f' % fps)
self.frame_rate_accumulated_time = 0.0
self.frame_rate_num_frames = 0
return Task.cont
app = MyApp()
app.run()
这里导入了ShowBase和Task类,它们都是 Panda3D 中常用的类。MyApp继承自ShowBase,并在__init__方法中创建了帧率计时器和帧率显示。setup_frame_rate_counter()方法创建了帧率计时器并注册了一个更新回调函数,这个回调函数会在每帧被调用。create_text_node()方法创建了一个TextNode对象,并设置了显示样式。update_frame_rate_counter()方法在每帧被调用,更新了帧率计数器并检查是否需要更新帧率显示。
这个代码会在窗口左上角实时显示帧率,类似于这样:
FPS: 60.00
代码解释:
- 导入必要的库:
direct.showbase.ShowBase提供了 Panda3D 应用的基本框架。direct.task用于管理和调度各种任务,包括帧率更新。
- 创建
MyApp类:- 继承自
ShowBase,为我们提供一个创建 Panda3D 应用的起点。
- 继承自
- 初始化
MyApp类:- 调用
ShowBase.__init__(self)初始化父类。 - 初始化帧率计时器相关变量:
frame_rate_interval控制帧率更新的频率,frame_rate_num_frames记录帧数量,frame_rate_accumulated_time记录时间累积值,frame_rate_text用于显示帧率文本。 - 调用
setup_frame_rate_counter()方法创建帧率计时器。
- 调用
- 设置帧率计时器:
- 使用
create_text_node()创建一个TextNode,用于显示帧率文本。 - 设置文本节点的位置、对齐方式和初始文本。
- 使用
taskMgr.add()将update_frame_rate_counter函数注册为一个任务,每帧都会调用它。
- 使用
- 创建文本节点:
create_text_node()方法创建一个TextNode对象,并设置一些属性,如字体、颜色、阴影等。
- 更新帧率计数器:
update_frame_rate_counter()函数会在每帧被调用,更新帧率计数器并显示帧率。- 计算帧率 (FPS)。
- 更新帧率文本显示。
- 重置计时器变量。
- 运行应用:
- 创建一个
MyApp对象,并调用app.run()运行应用程序。
- 创建一个
注意:
globalClock对象提供了获取时间信息的接口,get_dt()函数返回当前帧的时长。aspect2d是一个特殊节点,用于放置在场景中与屏幕比例相关的元素,例如帧率显示。
通过使用这段代码,您可以在 Panda3D 项目中轻松实现实时帧率显示,方便您监测和分析项目性能。
更多 Panda3D 相关知识,您可以参考官方文档:https://www.panda3d.org/manual/
原文地址: https://www.cveoy.top/t/topic/oVA2 著作权归作者所有。请勿转载和采集!