以下是使用 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()

这里导入了ShowBaseTask类,它们都是 Panda3D 中常用的类。MyApp继承自ShowBase,并在__init__方法中创建了帧率计时器和帧率显示。setup_frame_rate_counter()方法创建了帧率计时器并注册了一个更新回调函数,这个回调函数会在每帧被调用。create_text_node()方法创建了一个TextNode对象,并设置了显示样式。update_frame_rate_counter()方法在每帧被调用,更新了帧率计数器并检查是否需要更新帧率显示。

这个代码会在窗口左上角实时显示帧率,类似于这样:

FPS: 60.00

代码解释:

  1. 导入必要的库:
    • direct.showbase.ShowBase 提供了 Panda3D 应用的基本框架。
    • direct.task 用于管理和调度各种任务,包括帧率更新。
  2. 创建 MyApp 类:
    • 继承自 ShowBase,为我们提供一个创建 Panda3D 应用的起点。
  3. 初始化 MyApp 类:
    • 调用 ShowBase.__init__(self) 初始化父类。
    • 初始化帧率计时器相关变量:frame_rate_interval 控制帧率更新的频率,frame_rate_num_frames 记录帧数量,frame_rate_accumulated_time 记录时间累积值,frame_rate_text 用于显示帧率文本。
    • 调用 setup_frame_rate_counter() 方法创建帧率计时器。
  4. 设置帧率计时器:
    • 使用 create_text_node() 创建一个 TextNode,用于显示帧率文本。
    • 设置文本节点的位置、对齐方式和初始文本。
    • 使用 taskMgr.add()update_frame_rate_counter 函数注册为一个任务,每帧都会调用它。
  5. 创建文本节点:
    • create_text_node() 方法创建一个 TextNode 对象,并设置一些属性,如字体、颜色、阴影等。
  6. 更新帧率计数器:
    • update_frame_rate_counter() 函数会在每帧被调用,更新帧率计数器并显示帧率。
    • 计算帧率 (FPS)。
    • 更新帧率文本显示。
    • 重置计时器变量。
  7. 运行应用:
    • 创建一个 MyApp 对象,并调用 app.run() 运行应用程序。

注意:

  • globalClock 对象提供了获取时间信息的接口,get_dt() 函数返回当前帧的时长。
  • aspect2d 是一个特殊节点,用于放置在场景中与屏幕比例相关的元素,例如帧率显示。

通过使用这段代码,您可以在 Panda3D 项目中轻松实现实时帧率显示,方便您监测和分析项目性能。

更多 Panda3D 相关知识,您可以参考官方文档:https://www.panda3d.org/manual/

Panda3D 实时打印帧率:完整代码及示例

原文地址: https://www.cveoy.top/t/topic/oVA2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录