gpt4 book ai didi

java - Android Canvas 性能与其他设备非常不一致

转载 作者:太空狗 更新时间:2023-10-29 15:08:55 24 4
gpt4 key购买 nike

我一直在开发一款简单的 2D 无尽跑酷安卓游戏。我选择了 Canvas 路线,因为 Open GL 的学习曲线似乎相对较高。到目前为止,我一直在关注本教程: http://www.javacodegeeks.com/tutorials/android-tutorials/android-game-tutorials/

和游戏循环完全一样: http://www.javacodegeeks.com/2011/07/android-game-development-game-loop.html

我的问题是我的游戏在我的 Galaxy Nexus 上以 60 FPS 的速度运行,但是当我将游戏放到我女朋友的 Nexus 4 上时,FPS 下降到 40 并且游戏性能非常不稳定。与我堂兄的 Galaxy S2 相同。

我目前正在使用:

主游戏面板.java

getHolder().setFormat(PixelFormat.RGBA_8888);

我听说 RGB_565 提供更好的性能,但这实际上将我设备​​上的 FPS 降至 40,而 FPS 与其他设备相同

启用硬件加速,但似乎没有做太多:

安卓 list

android:hardwareAccelerated="true"

在我的 MainGamePanel 中,我实例化了所有将在线程启动之前绘制到 Canvas 上的对象:

public MainGamePanel(Context context) {
super(context);
getHolder().addCallback(this);
getHolder().setFormat(PixelFormat.RGBA_8888);
initScreenMetrics(context);
initGameMetrics();

BitmapOptions options = new BitmapOptions();
drillBit = new Drill(getResources(), 0);
drillBit.setX((screenWidth - drillBit.getBitmap().getWidth()) / 2);
drillBackground = new DrillBackground(getResources(), drillBit.getX(), drillBit.getY());
diamond = new Interactable(BitmapFactory.decodeResource(getResources(),R.drawable.diamond, options.getOptions()), screenWidth/2, screenHeight+30);
potion = new Interactable(BitmapFactory.decodeResource(getResources(), R.drawable.potion, options.getOptions()), screenWidth/4, screenHeight+230);
oil = new Interactable(BitmapFactory.decodeResource(getResources(), R.drawable.oil_1, options.getOptions()), 3*screenWidth/4, screenHeight+450);
powerUp = new Interactable(BitmapFactory.decodeResource(getResources(), R.drawable.power_up, options.getOptions()),
3*screenWidth/4, screenHeight+130);

background = new Background(getResources());

thread = new MainThread(getHolder(), this);
setFocusable(true);
}

为了制作 drillBit 对象的动画,我在构造函数中有 4 个位图,每次游戏循环时,我都会关闭位图(想不出其他方法来实现此目的):

钻头.java

public Drill(Resources resource, int x) {
BitmapOptions options = new BitmapOptions();
bitmap1 = BitmapFactory.decodeResource(resource, R.drawable.drill_1, options.getOptions());
bitmap2 = BitmapFactory.decodeResource(resource, R.drawable.drill_2, options.getOptions());
bitmap3 = BitmapFactory.decodeResource(resource, R.drawable.drill_3, options.getOptions());
bitmap4 = BitmapFactory.decodeResource(resource, R.drawable.drill_4, options.getOptions());
currentBitmap = bitmap1;
//other stuff
}

drill 中的绘制函数:

        if (currentBitmap == bitmap1) {
currentBitmap = bitmap2;
}
else if (currentBitmap == bitmap2) {
currentBitmap = bitmap3;
}
else if (currentBitmap == bitmap3) {
currentBitmap = bitmap4;
}
else {
currentBitmap = bitmap1;
}
canvas.draw(currentbitmap, x, y, null);

感谢任何帮助,谢谢!

最佳答案

发生这种情况是因为 Canvas 绘制的所有内容都是基于像素的。像素在不同分辨率的设备上是不同的。所以当你执行 (screenHeight+30) 时会在不同的设备上绘制不同的。所以不能直接写+30,需要在device dependent pixel中转换30。

我用这个方法来转换静态值

public int convertSizeToDeviceDependent(int value,Context mContext) {
DisplayMetrics dm = new DisplayMetrics();
((Activity) mContext).getWindowManager().getDefaultDisplay().getMetrics(dm);
return ((dm.densityDpi * value) / 160);
}

在哪里使用

diamond = new Interactable(BitmapFactory.decodeResource(getResources(),R.drawable.diamond, options.getOptions()), screenWidth/2, screenHeight+convertSizeToDeviceDependent(30,context));

将此方法应用于您在此行中使用硬编码值的所有地方

diamond = new Interactable(BitmapFactory.decodeResource(getResources(),R.drawable.diamond, options.getOptions()), screenWidth/2, screenHeight+30);
potion = new Interactable(BitmapFactory.decodeResource(getResources(), R.drawable.potion, options.getOptions()), screenWidth/4, screenHeight+230);
oil = new Interactable(BitmapFactory.decodeResource(getResources(), R.drawable.oil_1, options.getOptions()), 3*screenWidth/4, screenHeight+450);
powerUp = new Interactable(BitmapFactory.decodeResource(getResources(), R.drawable.power_up, options.getOptions()),
3*screenWidth/4, screenHeight+130);

关于java - Android Canvas 性能与其他设备非常不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18841913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com