Skip to content

nes_run 如何提升刷新速率 #4

@loogg

Description

@loogg

测试环境

代码仓库:nes测试

  1. nes:您的代码实现
  2. vnes:正点原子的实现
  • MCU: GD32F470 设置主频 168M

  • 屏幕 SPI LCD ,已修改底层使用双 buf 缓冲 DMA 异步刷新,修改 nes 结构体成员 nes->nes_draw_data 为指针形式,每次循环开始获取 lcd 的buf

    • 刷新屏幕确认不会消耗时间,测试过注释掉刷新操作周期消耗时间基本一致
    int nes_get_framebuffer(nes_t *nes) {
      struct rt_device_graphic_info info;
      rt_device_control(_lcd_device, RTGRAPHIC_CTRL_GET_INFO, &info);
      nes->nes_draw_data = info.framebuffer;
    
      return 0;
    }
    int nes_draw(int x1, int y1, int x2, int y2, nes_color_t* color_data){
      struct rt_device_rect_info rect_info;
      rect_info.x = x1;
      rect_info.y = y1;
      rect_info.width = x2 - x1 + 1;
      rect_info.height = y2 - y1 + 1;
    
      rt_device_control(_lcd_device, RTGRAPHIC_CTRL_RECT_UPDATE, &rect_info);
      return 0;
    }

测试结果

  • 使用您的 C 语言模拟器每个循环的逻辑时间需要50ms
  • 我又移植了正点原子的nes模拟器,他最大的周期也是50左右,但是他下面的两次循环是 2ms。
  • 您的和正点原子都有跳帧,我分析了您的源码,您代码中跳帧只是不刷新屏幕而已,正点原子的我看他那个宏定义也只是在屏幕刷新用到了,但是不知道他是如何后面两次循环只用很短时间的,大佬您方便的话能否研究下。

您的 nes 模拟器日志

Image

Image

正点原子 nes 模拟器日志

Image

Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions