SurfaceView 渲染帧速的问题。 求助

luoya263547560 2011-10-10 11:25:35
问题描述:
1.我使用的是 SurfaceView 在单独的线程中进行 绘制。 绘制部分的代码为:
public void run() {
// TODO Auto-generated method stub
while (mIsLooping) {
try {
//Thread.sleep(5);
} catch (Exception e) {
// TODO: handle exception
//Log.d(TAG,"sleep 20 error ,the error message is:"+e.toString());
}
//synchronized(mSurfaceHolder)
{
frameMove();
render();

}
}
}
2.可以绘制成功,但是问题是: 绘制的帧速不稳定, 快的时候 在50帧左右, 但是有时候就会降到20帧。

3.我使用的最简单的绘制进行测试的,没有任何复杂的计算逻辑,也就排除了因为我自己的代码逻辑导致帧速降低的问题。

4.20帧左右虽然可以接受,但是会导致画面渲染的过程中出现不流畅的现象。体验不好。

问题:

a.请教高手们,有没有遇到过类似问题已经解决了的?

b.是不是SurfaceView绘制的效率上确实有缺陷,写游戏的话大部分是直接操作GL吗?

c.synchronized(mSurfaceHolder) 看书里面有这样的语句, 但是这句话是必须的吗? 为什么要做同步呢?


问题比较多,希望高手能帮忙解答一下。 100分奉上

...全文
532 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoya263547560 2011-10-12
  • 打赏
  • 举报
回复
frameMove中只有一个计算帧速的逻辑:
Long nowTime=SystemClock.elapsedRealtime();
float dt=0f;
if (mLastFrameTime==0) {
mLastFrameTime=nowTime;
dt=0f;
}else {
dt=nowTime-mLastFrameTime;
mLastFrameTime=nowTime;
}
mFPS=1000f/dt;

render中也简单到只是画了一个 黑色背景 和 FPS 数值。 这种计算量没法再简单了。

我说的帧速变化并不是 平均帧速,而是每一帧用的时间,就像你所说: 大多数的 帧消耗在 20毫秒左右, 但是 中间总是会出现 消耗50多毫秒的帧, 是否知道这种问题的原因?

[Quote=引用 6 楼 youngplayee 的回复:]

如果我猜的没错。
每秒50帧大概意味着frameMove和render总耗时在20毫秒。
每秒20帧大概意味着frameMove和render总耗时在50毫秒。

很有可能是frameMove 消耗时间比较多的时候,每秒的帧数就少了。因为从字面上看render不会耗时出现太多偏差。 最好还是有数据可以说明问题。
[/Quote]
luoya263547560 2011-10-12
  • 打赏
  • 举报
回复
请教,怎么个缓冲帧法?
[Quote=引用 4 楼 andemulator 的回复:]

可以使用缓冲祯,可以有效降低闪烁现象
[/Quote]
youngplayee 2011-10-11
  • 打赏
  • 举报
回复
如果我猜的没错。
每秒50帧大概意味着frameMove和render总耗时在20毫秒。
每秒20帧大概意味着frameMove和render总耗时在50毫秒。

很有可能是frameMove 消耗时间比较多的时候,每秒的帧数就少了。因为从字面上看render不会耗时出现太多偏差。 最好还是有数据可以说明问题。
youngplayee 2011-10-11
  • 打赏
  • 举报
回复
frameMove();
render();

楼主 就这2行代码 就能说明问题啦?

你至少应该提供每次frameMove 消耗了多少时间,render消耗了多少时间。

Andemulator 2011-10-11
  • 打赏
  • 举报
回复
可以使用缓冲祯,可以有效降低闪烁现象
luoya263547560 2011-10-10
  • 打赏
  • 举报
回复
有没有人可以帮忙? 自己顶上。
luoya263547560 2011-10-10
  • 打赏
  • 举报
回复
恩,是这样,不过假设只有一个线程负责绘图,这句话貌似就没有什么用处了吧? 难道是为了处理 绘图线程 和 SurfaceHolder消息响应线程之间的同步?
[Quote=引用 1 楼 yiyaaixuexi 的回复:]

在同一个时间点只能有一个线程执行synchronzied区域的代码,即只能由一个线程来执行画图操作
Draw();//画图
若别的线程使用synchronized,也会先获取SurfaceHolder锁之后才可以画
[/Quote]
念茜 2011-10-10
  • 打赏
  • 举报
回复
在同一个时间点只能有一个线程执行synchronzied区域的代码,即只能由一个线程来执行画图操作
Draw();//画图
若别的线程使用synchronized,也会先获取SurfaceHolder锁之后才可以画

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧