我是开发新手,我现在已经尝试制作一个简单的游戏了一段时间,而且我无法使其正常工作,因为它不断出现内存问题在大多数设备上。
我尽可能地缩小了图像尺寸,最大的图像是117kB。
我的图片存储在一个可绘制的文件夹中。我不认为我的图像需要单独使用xxhdpi或xhdpi。所以在清单中我已经提到了所有支持屏幕尺寸代码。
我在清单中尝试了以下内容,但它没有帮助。
android:largeheap = "true"
android:noHistory = "true" (for every activity so that it doesn't stack up over each other)
我有大约50个活动(所有活动都有不同的格式,所以不能只做一个活动),这些活动是从一个普通的应用程序类中随机生成的。
我的Q1.java
public class Q1 extends Activity {
TextView textview;
int score;
MediaPlayer player;
TextView scored;
LinearLayout imageview3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_q1);
scored = (TextView) findViewById(R.id.score);
imageview3 = (LinearLayout) findViewById(R.id.scoreview);
Intent mintent = getIntent();
score = mintent.getIntExtra("score", 0);
scored.setText(String.valueOf(score));
TextView scrolltext=(TextView) findViewById(R.id.scrolltext);
Typeface custom_font = Typeface.createFromAsset(getAssets(), "fonts/panicStricken.ttf");
scrolltext.setTypeface(custom_font);
}
public void button(View view) {
player = MediaPlayer.create(Q1.this, R.raw.correct);
player.setVolume(50,50);
player.start();
Class activityToShow = ActivityList.getInstance().getRandomActivity();
Intent intent = new Intent(this,activityToShow );
intent.putExtra("score", score);
startActivity(intent);
}
public void fedex(View view) {
player = MediaPlayer.create(Q1.this, R.raw.wrong);
player.setVolume(50,50);
player.start();
score = score - 1;
scored.setText(String.valueOf(score));
if (score == 0) {
Intent intent = new Intent(this, GameOver.class);
startActivity(intent);
}
}
@Override
public void onBackPressed() {
Intent intent = new Intent(this,MainMenu.class);
startActivity(intent);
super.onBackPressed();
finish();
}
我的layout_q1 xml
<ImageView
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/scoreview"
android:background="@drawable/pic"
android:onClick="pic"
android:layout_marginTop="50dp"
android:id="@+id/imageView11" />
我知道有一篇关于loading large bitmaps efficiently的文章 但是我在编程方面并不是那么出色,而且我将代码应用到我自己的应用程序中仍然有点棘手。
有人可以用我最好的方式帮助我吗?
我不认为我可以进一步减小图像的大小。我能做的最好的事情就是将所有图像尺寸保持在平均50kB,即50张50kB的图像。
当android加载所有这些图像时,我的尺寸减小是否足以阻止这种内存噩梦?
答案 0 :(得分:0)
避免内存不足错误使用BitmapFactory.Options类减少图像像素大小然后压缩图像如下所示
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 3;
Bitmap bmp = BitmapFactory.decodeFile(filePath, options);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 85, stream);
imageView.setImageBitmap(bmp);
答案 1 :(得分:0)
真正的问题发生在图像大小调整上。仅仅调整图像大小一次或仅调整一次图像并不是真的令人担忧,但是当您经常这样做时,您肯定会立刻遇到OOM错误。克服这个问题的策略是通过缓存。当您缓存图像时,它将保证您只需要以较少的时间/步骤调整大小。
上面的流程图显示了处理此案例的正确方法。我们有一个抽象的Cache
来存储上一个图像(注意:缓存是您的个人偏好,它可以是任何类似:内存缓存,数据库缓存或文件缓存。也可以阅读LRU cache - Least Recently used Algorithm )。