android draw速度,android-为什么SystemClock.currentThreadTimeMillis()似乎以一半速度运行?...

开发者分享如何解决Android音乐应用中MIDI播放延迟问题,发现SystemClock.currentThreadTimeMillis()计算时间过长,建议切换至System.currentTimeMillis()以实现准确的500毫秒间隔。
摘要由CSDN通过智能技术生成

我正在尝试编写一个能够与用户输入同步播放MIDI文件的音乐应用.我已经创建了一个自定义视图,播放声音和读取MIDI数据.我在视图的onDraw()方法中运行MIDI数据的回放,因此可以将用户输入应用于它.音符数据存储为音符音高和演奏时间的数组,从开始算起以毫秒为单位.

我的测试数据每500毫秒(半秒)播放一次不同音调的音符.我在每个音符的时间间隔旁记录了currentThreadTimeMillis(),这与我期望的一样.每500个滴答声稍有变化,便会发出一个音符.但是,这种以毫秒为单位的计数大约是实际速度的一半,需要一秒钟才能计算出500毫秒!我在Galaxy Ace上运行,因此这不是慢模拟器的问题.

SystemClock.currentThreadTimeMillis()为什么花两秒钟来计算1000ms?

public void onDraw(Canvas canvas) {

// TODO : Draw notes

canvas.drawColor(Color.BLACK);

canvas.drawBitmap(aNote.img, aNote.x, aNote.y, null);

if (ready>0){

elapsed_time = SystemClock.currentThreadTimeMillis() - start_time;

midi_note_data = MIDI.track_data.get(current_note);

if (midi_note_data.start_time <= elapsed_time){

current_note++;

pitch = midi_note_data.pitch;

Log.d("MUSIC", "Note time " + midi_note_data.start_time + " ThreadTime "+ elapsed_time);

sounds.play(tone, 1.0f, 1.0f, 0, 0, notes[pitch]);

}

if (current_note > MIDI.track_data.size()-1){

ready = -2;

}

}else if (ready == 0){

start_time = SystemClock.currentThreadTimeMillis();

Log.d("MUSIC", "Start time "+start_time);

ready = 1;

}

}

解决方法:

您正在使用SystemClock.currentThreadTimeMillis(),这是当前线程已运行的时间.在Android上,我猜测UI线程实际上只在一半时间运行. (另一半用于其余的操作系统!)

切换到System.currentTimeMillis(),您的问题将得到解决.

标签:clock,android,time

来源: https://codeday.me/bug/20191127/2076735.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值