bbasic吧 关注:112贴子:302
  • 2回复贴,共1

修复酷舞,学到了很多

只看楼主收藏回复

昨天测试酷舞发现小机showpic-1是很快的,比如:
x=0
while(x<240)
showpic(-1,x,0,w,h,0,0,1)
x=x+1
wend
在w,h很小的情况下几乎是瞬间完成,即使图片大一点,最多一秒就完成了。
联想到自己在安卓上实现showpic-1的方法,发现错了一个观念。我每次flippage或者showpic-1,其实是拿到surfaceView的canvas,然后绘图然后提交,完成后返回,聪明的小伙伴马上就知道我这样做阻碍了showpic-1的速度,showpic-1必须等到surfaceView的绘图完成才能返回,如果是循环showpic-1或者flippage的话,在我的手机上一秒钟最多执行60次左右。这个60是怎么来的呢,测来的,下面这样:
try {
surfaceViewCanvas = surfaceHolder.lockCanvas();
if(surfaceViewCanvas != null) {
surfaceHolder.unlockCanvasAndPost(surfaceViewCanvas);
}
} catch (Exception ex) {
ex.printStackTrace();
}
只是拿到canvas然后unlock&post,其他什么也不做,循环60次要花费将近1秒:

这和常识是一致的,有个最大刷新率在这里,60fps的样子。
很明显,像上面那个x从0到240的循环,要是每张图都调用surfaceVIewCanvas显示的话,要4s以上。。。
好傻啊,明明当初实现的时候page-1和任何createpage出来的一样,是一张bitmap,showpic-1是先用canvas画到这张bitmap上,然后再画到屏幕上。就是最后这句“然后再画到屏幕上”我没想清楚,导致酷舞运行慢。
幸亏我测试了酷舞,不然还不知道自己错了。很明显的showpic-1等等函数和surfaceView绘图要放到两个线程里,surfaceView自顾自把page-1显示到屏幕上就好了。这经常玩游戏玩显卡的小伙伴联想一下垂直同步这个词语就明白了。
反正现在酷舞修复好了,和小机上一样快,没什么问题了,接下来还要继续测试修复,没准又有什么没想到的问题,唉


IP属地:广东1楼2015-01-25 21:03回复
    你可以这样试试。一个线程用来显示的,把-1页面图像流绘制出来。一个线程是虚拟机的执行,flippage其实就是把其他页面转到-1页面。


    IP属地:浙江来自Android客户端2楼2015-01-25 23:12
    收起回复