- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
嘿,我正处于我一直在开发的应用程序的十字路口。
这是一款游戏,而且是一款“街机/ Action ”游戏,但我使用 Surfaceview 而不是 Open GL 对其进行了编码(由于游戏与原始设计发生了巨大变化,结果就是这样)。
我发现自己被性能问题困扰,甚至在游戏中也没有,但只是在第一个 Activity 中,它是一个动画菜单(全屏背景,大约有 8 个 Sprite 在屏幕上 float )。
即使使用这么少量的 Sprite ,我也无法获得完美流畅的运动。它们平稳地移动了一会儿,然后瞬间变得“断断续续”或“不稳定”。
我注意到(据我所知)绘制背景(预缩放图像)大约需要 7 到 8 毫秒。这合理吗?我尝试了不同的绘图方式,例如:
canvas.drawBitmap(scaledBackground, 0, 0, null);
上面的代码产生的结果大致相同:
canvas.drawBitmap(scaledBackground, null, screen, null);
但是,如果我将我的支架更改为:
getHolder().setFormat(PixelFormat.RGBA_8888);
位图的绘制速度高达 13 毫秒(我假设是因为它必须转换为 RGB_8888 格式。
奇怪的是,渲染和逻辑以非常稳定的 30fps 移动,它不会丢失任何帧,并且在运行时不会发生垃圾收集。
我已经尝试了几乎所有我能想到的方法来让我的 Sprite 顺利移动
我最近在我的游戏循环中加入了插值:
float interpolation = (float)(System.nanoTime() + skipTicks - nextGameTick)
/ (float)(skipTicks);
然后我将其传递到我的 draw() 方法中:
onDraw(interpolate)
我在这方面取得了一些成功,它确实帮助解决了问题,但我对结果仍然不满意。
任何人都可以给我任何关于可能减少绘制位图所花费的时间的最终提示或关于可能导致此问题的任何其他提示,或者您认为这只是 Surfaceview 无法完成任务的情况,因此,我应该放弃应用程序并重新开始使用 Open GL 吗?
这是我的主要游戏循环:
int TICKS_PER_SECOND = 30;
int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
int MAX_FRAMESKIP = 10;
long next_game_tick = GetTickCount();
int loops;
bool game_is_running = true;
while( game_is_running ) {
loops = 0;
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) {
update_game();
next_game_tick += SKIP_TICKS;
loops++;
}
interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
/ float( SKIP_TICKS );
display_game( interpolation );
}
谢谢
最佳答案
您不应该使用 Canvas 绘制快速 Sprite ,尤其是在绘制全屏图像时。时间太长了,我的经验告诉你。我相信 Canvas 没有硬件加速,这是您永远无法从中获得良好性能的主要原因。当屏幕上大约有 15 个时,即使是简单的 Sprite 也开始变慢。切换到 OpenGL,进行正交投影,并为每个 Sprite 制作一个带纹理的四边形。相信我,我做到了,这是值得的。
编辑:实际上,OpenGL 方法是使用 GLSurfaceView 而不是 SurfaceView。您创建自己的类,从它派生,实现 surfaceCreated、surfaceDestroyed 和 surfaceChanged,然后您也从 Renderer 派生并连接两者。 Renderer 处理一个 onDraw() 函数,这是将要渲染的内容,GLSurfaceView 管理您将如何渲染(位深度、渲染模式等)
关于android - 背景图像绘制时间太长(Canvas)生涩的 Sprite ......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15057132/
任何人都可以评论是否对图像使用 Sprite 的决定?我看到以下好处/权衡(其中一些可以减轻): 单个图像上的 Sprite 优点: 需要管理的图像更少 更容易实现主题图像 图像交换 (JS/CSS)
所以,我一直在 Unity 工作,但我决定是时候换成我更了解的东西了:JavaScript。我一直在考虑切换到 Phaser.js,但我有一些关于我什至在 Unity 中遇到的问题的问题,而且我在互联
所以我有一个木偶要在 Sprite Kit 中显示。木偶是由一堆不同的 body 部位组成的,当然每个部位都是一个.png。 所以我的过程是:我有一个 Marionette 对象(SKNode 子类)
我有一个 Sprite ,我将其初始化为 SKSPriteNode,它不断地从另一个 Sprite 上弹起,也以相同的方式初始化。 我无法弄清楚两者之间的冲突,并且到目前为止堆栈上没有任何帮助。 我将
标题说明了一切。我想知道 Sprite.getcontentsize、Sprite.gettexture、Sprite.getscale 之间有什么区别。以及它们是如何使用的。在这个问题之后我找不到任
我有兴趣尝试创建一些游戏,即在新的 sprite 工具包中。但是,对于我心目中的游戏,我宁愿使用方向键而不是操纵杆。因为我将从 Cocos 搬过来,所以我的旧程序不再有效(所以那个 dpad 也不会)
我正在 LibGdx 中开发 2D 射击游戏。 我不得不提一下,我是 LibGdx 的新手,我正在努力理解它是如何工作的。我有几年的Java和Android编程经验,所以我了解游戏概念。 我感兴趣的是
我正在使用 Compass 生成 CSS Sprite 。 我找到了一种方法来定义一次 Sprite 并在不同的 .scss 文件中使用它,但我不确定这是正确的解决方案。 到目前为止,我能找到的最好方
我在游戏中遇到背景音乐问题。当我从主菜单场景切换到游戏场景时,它停止,但是当游戏场景切换到gameOver场景时,它不停止。当我选择重播时,音乐也会重叠(从gameOver场景切换回游戏场景)。 要播
我是一名使用 libgdx 引擎的新程序员,想知道 Sprite 批处理的行为。特别是如何在程序生命周期中将 Sprite 添加到批处理中以进行绘制。到目前为止, Sprite 的所有示例都使用了一些
这可能是个愚蠢的问题,但如果有人能帮助我,我将不胜感激。 我有一个由 3 个垂直堆叠的不同图像组成的 Sprite ,但我试图让中间的图像(高度为 1px 和宽度为 194)重复,只是那条 1px 的
我正在尝试为我正在构建的菜单加载 spritesheet,但它不是一次显示一个图像,而是在元素的不同位置显示整个 spritesheet。 这是我使用两张图片的 CSS 代码: #mymenu ul.
我有两个 Sprite 组,ship_list 有 20 个飞船 Sprite ,all_sprites 有这 20 个 Sprite ,加上玩家 Sprite 。在主循环中,当检测到玩家与 ship
我制作了这个我可以抓取并四处移动的 Sprite 。我的问题是我希望能够“抛出” Sprite 。意思是,当我释放 Sprite 时,我希望它继续沿着我移动它的方向前进。就像扔球一样。 我该怎么办?
我目前正在开发 HTML/CSS 模板,我将实现以下社交媒体图标: http://www.premiumpixels.com/freebies/41-social-media-icons-png/ 它
在我的游戏中,我希望能够收集硬币。我有一个该硬币 Sprite 的数组列表,这样我就可以单独绘制多个硬币。这些硬币也随着背景移动(模拟汽车驾驶),我想要它,所以当硬币撞到汽车时,它会消失并被收集。感谢
我是 cocos2D 的新手,谁能提出一个简单的解决方案? 我有一个风车,风车上有 8 个条,每个条以 45 度隔开,其中风车的一半在屏幕上,一半在屏幕外。我想旋转风车,让它永远旋转。我还想在风车杆的
我使用的是主播中心分支,刚刚发现我的游戏出现的问题大部分都是这个原因。有没有一种方法可以使用 Sprite 的左下角而不是使用 (0, 0) 作为其中心来设置 Sprite ? 谢谢! 最佳答案 发现
我是 magic-importing我的 Sprite : // Creating a concatenated sprite image out of all sprites in the "/im
这个问题在这里已经有了答案: How do I detect collision in pygame? (5 个答案) 关闭去年。 想要创建一个包含 10 张图像的组。稍后屏幕上的图像不应重叠。我尝
我是一名优秀的程序员,十分优秀!