- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在速度较慢的设备(Orange San Francisco 又名 ZTE Blade)上测试我的游戏时,我得到了一个令人震惊的帧速率。
我将一些调试代码放入绘图循环中,发现以下行占用了超过 100 毫秒:
c = mSurfaceHolder.lockCanvas();
还有其他人看到过这种行为吗?我通过扩展 View 和实现 onDraw() 临时替换了 surfaceview,并且我得到了更好的帧速率。
尽管一般来说,surfaceView 在我的 HTC Desire 上要快得多。我怀疑这可能是 Android 2.1 的问题。我正在考虑对手机进行 root 并在可能的情况下将其升级到 2.2,但我确实想要一台运行 2.1 的设备,这样从长远来看可能会适得其反。
** 更新**
我一直在研究这个问题,并且发现了一些更令人费解的方面。
我root了手机,安装了2.2,问题依旧。当应用程序首次启动时,lockCanvas 按预期工作(0-1 毫秒)。然后在我初始化期间的某个时刻,lockCanvas 突然开始占用大约 100 毫秒。
可能值得指出的是,我正在异步任务中加载我的 Assets ,以便我可以显示加载屏幕。
尽管我尽了最大努力来确定程序在运行缓慢时实际在做什么,但我还是没能做到。事实上,当我在 Debug模式下单步运行它时,它运行得很快!
现在我发现,如果我在 SurfaceView 的构造函数中添加一个延迟(大约 10 秒),就不会出现缓慢现象,并且一切正常。
但是,如果您按 Home,然后切换回去,速度又会变慢。
我对这个愚蠢的不合逻辑的问题几乎束手无策!我有意将其归结为设备特定问题。
我觉得这可能与内存使用有关。也许某些东西被换掉了,它影响了视频 ram?
至少我会对理论感兴趣。
最佳答案
关于文档中的 lockCanvas():
If you call this repeatedly when the Surface is not ready (before Callback.surfaceCreated or after Callback.surfaceDestroyed), your calls will be throttled to a slow rate in order to avoid consuming CPU.
对于某些设备,您的绘制循环是否启动得太早?我认为这是问题所在,因为您写道:
Now I discovered that if I add a delay in the constructor of my SurfaceView (of about 10 seconds), the slowness doesn't occur and all works fine.
关于android - lockCanvas() 真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5098728/
标题说的很清楚,不过我会给出一个代码示例以防万一。这是来自 Android SDK 中的 LunarLander 示例: @Override public void run() {
我从 opencv4android(人脸检测)复制了示例代码。我通过了NDK部分。并在手机上运行该应用程序。但是 SurfaceView 仅显示相机预览。似乎在 OnCameraFrame 中所做的任
在速度较慢的设备(Orange San Francisco 又名 ZTE Blade)上测试我的游戏时,我得到了一个令人震惊的帧速率。 我将一些调试代码放入绘图循环中,发现以下行占用了超过 100 毫
我创建了一个扩展 SurfaceView 的类,以便循环一系列 ARGB 位图。这主要是有效的,除了(通常但不总是)为每个新帧保留底层位图的状态。 换句话说,如果我显示的第一帧是不透明的,而随后的帧是
我以给定的速度平滑滚动位图。我正在用游戏循环来做这件事。它滚动非常流畅,大约 60 fps,除了偶尔的卡顿/跳跃。这些跳跃从每秒一次到每秒几次不等。通常它们会在运行几秒钟后开始或变得更频繁,但我不确定
我正在尝试在 Android 中构建动态壁纸,但当方向改变时应用程序崩溃了。尝试将 Canvas 锁定在表面支架上时看起来它正在崩溃,但我不确定我能做些什么来防止它。 这是类: public clas
我正在开发一款安卓游戏,我正在使用 SurfaceView。我有一个每 16 毫秒调用一次的方法(我想要 60fps) public void myDraw(SurfaceHolder holder)
我一直在为这个异常而苦苦挣扎,我环顾四周,但没有任何帮助。 这是代码 package com.example.surfacetest; import android.app.Activity; imp
我正在实现一个 SurfaceView 子类,我在其中运行一个单独的线程来绘制到 SurfaceHolders Canvas 上。我正在测量调用 lockCanvas() 之前和之后的时间,我从大约
尝试在单个 Canvas 上每毫秒绘制一些东西。我的意思是只向 Canvas 添加细节,而不是每一帧都重新绘制。所以这段代码给了我三个不同的 Canvas 。第三,然后又是第一。为什么? public
每次我调用这些方法时,都需要 14-20 毫秒才能继续。 Canvas canvas = holder.lockCanvas(); holder.unlockCanvasAndPost(canvas)
我正在为 Android 开发一个小游戏(测试),但我不明白用 SurfaceView 创建一个好的 Timer 线程的逻辑。 [SurfaceView object].getHolder().loc
我有一个自定义的 SurfaceView,它带有绘制背景和位图的方法 doDraw()。问题是当我运行它时出现错误 Caused by: java.lang.IllegalArgumentExcept
我正在制作游戏,由于我是 Android 的新手,所以我的设计基于示例 LunarLander code .在其设计中,GameThread.doStart() 从 GameActivity 调用,然
我正在尝试创建一个 Canvas 并使用以下代码向其绘制位图: Paint paint = new Paint(); InputStream is = assets.open("card_art" +
在 onPreviewFrame 中使用 lockCanvas() 时,我遇到了 IllegalArgumentException。 基本上我想实现的是抓取frame,处理,直接绘制到SurfaceP
我在市场上有一款 Android 游戏,在尝试使用 Canvas 时收到 NullPointers 的崩溃报告。我可以假设这是因为 SurfaceHolder.lockCanvas() 正在返回 nu
我想问一个已经在这里解决过一两次的问题,但是我找到的信息都不能帮助我解决几天前遇到的问题。 我想使用 Canvas 为 Android 制作动态壁纸 - 它在图形上不够复杂,不需要 OpenGL。为简
我正在尝试在我的 Canvas 上使用适用于 Android 的硬件加速。我曾经有一个 SurfaceView ,我在上面做了 lockCanvas() 以获得后来绘制的 Canvas ,但我改为 T
使用 MediaCodec 生成视频的大部分代码到目前为止我已经看到要么使用纯OpenGL或从 MediaCodec 生成的 Surface 锁定 Canvas 并对其进行编辑。我可以同时使用两者吗?
我是一名优秀的程序员,十分优秀!