OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 28|回复: 1

模拟器声音数据生成速度快过播放速度问题

[复制链接]

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2025-9-25
在线时间
0 小时
发表于 前天 21:53 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 宅宅宅男 于 2025-9-27 22:12 编辑

我使用STM32F429移植了GNUBoy模拟器,现在遇上这个APU的问题:
1、不跑APU,画面跳一帧,单纯用使用系统节拍时间控制可以保证游戏帧率在59帧;

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2025-9-25
在线时间
0 小时
 楼主| 发表于 前天 21:54 | 显示全部楼层
本帖最后由 宅宅宅男 于 2025-9-27 22:13 编辑

接楼上2、加上了APU,还沿用原来的时间控制框架,音频数据的生成明显比播放快,数据buffer还没发出去就溢出,然后被新数据覆盖了,导致声音效果很差
3、尝试去掉了时间控制,在音频数据满的时候死等播放完成,这样子声音没问题,但帧率又掉下来了,画面没有之前流畅,
想问一下这要怎么处理呢,主循环框架看下面
        gb_init();
        gb_card_open(file);
        boot_rom_load();
        gb_cpu_init();
        gb_timer_init();
        gb_joypad_init();
        gb_mbc_init();
        gb_ppu_init();
        gb_apu_init();
        gb.delay = 0;
        gb.running = 1;
        gb.next_tick = micros() + GB_FRAME;
        gb_ppu.skip = GB_SKIP_FRAME;


        for (;;)
        {
            gb_cpu_step(2280);
            while ((GB_REG_LY > 0) && (GB_REG_LY < 144))
            {
                gb_cpu_step(gb_ppu.tick);
            }   
            // if (time(0) > gb_rtc.sys_time)
            // {
            //     gb_rtc.sys_time = time(0);
            //     gb_rtc_tick();
            // }
            gb_apu_mixer();
            if (!(GB_REG_LCDC & 0x80))
            {
                gb_cpu_step(32832);
            }
            while (GB_REG_LY > 0)
            {
                gb_cpu_step(gb_ppu.tick);
            }
        #if GB_SKIP_FRAME
            if (++gb_ppu.skip >= GB_SKIP_FRAME)
            {
                gb_ppu.skip = 0;
            }
        #endif
            while(micros() < gb.next_tick);
            gb.next_tick = micros() + GB_FRAME;
        }



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-9-29 14:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表