- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一款 Android 游戏,我似乎遇到了在 Canvas 上绘图的性能问题。我的游戏有多个关卡,每个关卡中(显然)有不同数量的对象。
奇怪的是,在一个包含 45 张图像的关卡中,运行完美(几乎 60 fps)。然而,另一个包含 81 张图像的关卡几乎没有运行(11 fps);它几乎无法播放。除了我之外,其他人觉得这很奇怪吗?
我使用的所有图像都是 .png 格式,上述级别之间的唯一区别是图像的数量。
这是怎么回事? Canvas 可以不在每个游戏循环中绘制这么多图像吗?你们会如何建议我改进此性能?
提前致谢。
最佳答案
我也觉得奇怪。我也在开发一个游戏,很多关卡,我可以很容易地在屏幕上显示 100 个游戏对象,还没有看到类似的问题。
如果使用得当,drawbitmap确实应该很快;它只不过是一个复制命令。我什至不会画圆圈;我有预渲染圆圈的位图。
但是,Android 中位图的性能对您的操作方式非常敏感。创建位图可能非常昂贵,因为默认情况下 Android 可以自动缩放 png,这是 CPU 密集型的。所有这些都需要在渲染循环之外只完成一次。
我怀疑你找错地方了。如果您以相同的方式创建和使用相同类型的图像,那么将屏幕图像的数量加倍不应将性能降低 4 倍以上。最多应该是线性的(2 倍)。
我的第一个怀疑是您的大部分 CPU 时间都花在了碰撞检测上。与绘制位图不同,这通常随着交互对象数量的平方而增加,因为每个对象都必须测试是否与其他对象发生碰撞。您将游戏对象的数量增加了一倍,但您的性能下降到四分之一,即根据对象数量的平方。如果是这种情况,请不要绝望;有一些碰撞检测方法不会随着对象数量的平方增长。
与此同时,我会进行基本测试。如果您实际上不绘制一半的对象会怎样?游戏运行速度更快吗?如果不是,则与绘图无关。
关于Android drawBitmap 对大量位图的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4981707/
我试图在 ImageView 中显示图像的一部分。我用 canvas.drawBitmap() 试过了,但似乎显示了图像的错误部分。我的代码: 主要 Activity : this.drawC
我使用这样的 onDraw 方法显示图像: public void onDraw(Canvas canvas) { super.onDraw(canvas); Bitmap bac
我有一个 200x200 像素的位图。我想在我的 Canvas 上绘制位图的左上角 50x50px,坐标为 100,100,宽度和高度为 50px,方法是: drawBitmap(Bitmap bit
我正在使用 SurfaceView 编写 Android 游戏。 SurfaceView 获取的 Canvas 绘制了一个大小为 80x80 的 32 位 PNG 图像,带有 alpha 层。 dra
我正在编写一款 Android 游戏,我似乎遇到了在 Canvas 上绘图的性能问题。我的游戏有多个关卡,每个关卡中(显然)有不同数量的对象。 奇怪的是,在一个包含 45 张图像的关卡中,运行完美(几
如果我使用 drawBitmap() 在 View Canvas 上绘制位图,图像将被重新采样,这样图像中的 1 个像素将在屏幕上倾斜 1 个。在我拥有高像素密度的设备上,这意味着每个图像像素分布在
简单的乐趣 fun getCircleBitmap(bitmap: Bitmap, recycle: Boolean): Bitmap { val paint = Paint()
我是 Android 编码方面的新手。作为第一个项目,我决定移植 ZX Spectrum 游戏。我已经准备好了汽车的位图框架和按钮,它们将根据屏幕尺寸进行缩放。我已将图像放在“drawable”和“d
我的应用程序以连续循环的方式绘制到 Canvas 上,并在每个循环中重新评估可绘制对象的位置并循环它们以进行动画处理。我的问题是以下两种方法哪种更优越,为什么?我是一个初学者,所以我不知道如何对方法进
我必须在 map 上画一条线。由于特殊线条效果的要求,我不得不创建一个单独的位图并使用临时 Canvas 在该位图上绘制线条。现在当它完成绘制线条时,我将它渲染到主 Canvas 上。不幸的是,下面的
我正在尝试将位图叠加到另一个位图上,将其放置在用户触摸的位置。这是代码: public static Bitmap mergeImage(Bitmap base, Bitmap overlay, f
我最近遇到了一个问题 Android: Rotation of image around the center这是在Unconn的帮助下解决的。 然而,事实证明,这个解决方案——以及它的工作原理——确
我已经像这样为 DragShadowBuilder 覆盖了 onDragShadow @Override public void onDrawShadow(Canvas canvas) {
我有一个游戏,在其中一个关卡中,绵羊可能会被地雷炸毁。爆炸动画是通过在 512x515 png 文件中包含 4x4 爆炸图像阵列的 png 来控制的……见下文。 然后我使用以下代码为爆炸设置动画:
我一直在尝试在 Android 中制作一些 Sprite 动画(这是一项大学练习),但我遇到了一个奇怪的问题。它没有绘制我定义为源的矩形,而是恰好绘制了该矩形的一半。 这是我的绘图方法的代码 publ
我的程序在动态壁纸 Canvas 上绘制位图。它有效,但一段时间后图像变得非常糟糕(http://img855.imageshack.us/img855/9756/deviceq.png) 有什么想法
我正在扩展 SurfaceView 以创建全屏水平滚动背景。 我的问题是位图的质量。在绘图调用中用作 canvas.drawBitmap(bitmap, 0, 0, paint); 它的质量比原来的差
我正计划在我的游戏中实现一组新图形:普通圆圈。绘制的 Sprite (在本例中为圆圈)的数量从 2-3 开始,并且可以无限增加(可能)。不过,最大值可能在 60 左右。总共必须有 5 种类型的圆圈,每
我想绘制位图的子部分,但大小不同。如果大小大于位图中的源矩形,那么我希望位图的该部分平铺以填充目标区域。然而,它们并没有平铺,而是被拉伸(stretch)了。 我将所有变量设置如下: Bitmap b
我是 Android 新手,我有两张图片,一张是空图片,另一张是代表进度条的完整图片。 如何使用 canvas.drawBitmap 只绘制整个图像的一部分? 我不想每次都调整位图图像的大小。 最佳答
我是一名优秀的程序员,十分优秀!