我正在开发一个应用程序,我们在其中手动滚动了一些星图。所以我不必抽象地谈论,这里是有问题的应用程序:https: //play.google.com/store/apps/details?id=com.tw.fireballs
如果您查看商品详情,您会发现我们使用了地平线上方的图像……主要是因为它看起来超级漂亮。这在分辨率较低的设备上不是问题,由于涉及的像素数量较少,它们似乎在渲染它时不会遇到大问题。在我的 HTC One 或我妻子的 Nexus 5 等更高分辨率的设备上,当它出现在屏幕上时,会有很大的帧率下降。阻止我发布它还不够糟糕,但如果可能的话,我想改进它。
我目前只是使用 SurfaceView,并绘制到 mSurfaceHolder.lockCanvas(null) 获取的画布上,所以它不是硬件加速的。我尝试将它实现为常规视图,但总体而言它实际上变慢了,所以在我涉足 OpenGL 领域之前,我想探索是否有什么可以加快速度的方法。
本质上,我们从一个薄的(不透明的)图像“切片”地平线开始,将其放大到屏幕对角线的大小,然后将其旋转以匹配设备的方向。
绘图代码如下:
private void loadResources() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
mHorizonImage = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.star_map_background, options);
}
@Override
public void updateDimensions(int width, int height) {
super.updateDimensions(width, height);
int horizonHeight = mCanvasHeight / 3;
int horizonWidth = (int) Math.sqrt(Math.pow(mCanvasHeight, 2) + Math.pow(mCanvasWidth, 2));
mHorizonImage = Bitmap.createScaledBitmap(mHorizonImage, horizonWidth, horizonHeight, false);
}
@Override
public void drawOn(Canvas canvas) {
double upScreen = -mProjection.distanceFromScreen * Math.tan(Math.toRadians(mOrientation.elevation));
double rightWithTiltCheat = upScreen * Math.sin(Math.toRadians(mOrientation.tilt));
double upWithTiltCheat = upScreen * Math.cos(Math.toRadians(mOrientation.tilt));
float x = (float) (mCanvasWidth / 2 * (1 + rightWithTiltCheat / mProjection.screenWidthInCm));
float y = (float) (mCanvasHeight / 2 * (1 - upWithTiltCheat / mProjection.screenHeightInCm));
canvas.save();
canvas.translate(x, y);
canvas.rotate((float) mOrientation.tilt);
canvas.drawBitmap(mHorizonImage, -mHorizonImage.getWidth() / 2, -mHorizonImage.getHeight(), null);
canvas.restore();
}
有没有更有效的方法可以不受屏幕分辨率的影响?我们已经提出了一些想法,但我很想听听比我更了解这些东西的人的意见。如果您有任何问题,请提出,我将不胜感激。
干杯,内森