You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGDX中如何用Preferences保存100+长度的BooleanArray?

解决LibGDX大容量BooleanArray保存到Preferences的问题

遇到这种大容量BooleanArray存Preferences的问题,我有几个实用的方案,你可以根据自己的需求选择:

1. 二进制打包成字节数组(最省空间)

这个方法把每个布尔值压缩成1位,100个布尔值只需要13字节,空间效率拉满,完全适配大容量数组。核心思路是将每8个boolean打包成一个byte,然后把字节数组存入Preferences(LibGDX的Preferences原生支持byte[]类型)。

转换代码示例:

// 将BooleanArray转成字节数组
public static byte[] booleanArrayToBytes(BooleanArray array) {
    int byteCount = (array.size + 7) / 8; // 计算所需字节数(向上取整)
    byte[] bytes = new byte[byteCount];
    for (int i = 0; i < array.size; i++) {
        if (array.get(i)) {
            // 将对应位设为1
            bytes[i / 8] |= (1 << (i % 8));
        }
    }
    return bytes;
}

// 将字节数组转回BooleanArray
public static BooleanArray bytesToBooleanArray(byte[] bytes, int originalSize) {
    BooleanArray array = new BooleanArray(originalSize);
    for (int i = 0; i < originalSize; i++) {
        // 检查对应位是否为1
        boolean value = (bytes[i / 8] & (1 << (i % 8))) != 0;
        array.add(value);
    }
    return array;
}

保存与读取:

// 保存
Preferences prefs = Gdx.app.getPreferences("MyGamePrefs");
byte[] boolBytes = booleanArrayToBytes(myLargeBooleanArray);
prefs.putByteArray("largeBoolArray", boolBytes);
prefs.putInteger("boolArraySize", myLargeBooleanArray.size); // 必须保存原数组长度!
prefs.flush();

// 读取
Preferences prefs = Gdx.app.getPreferences("MyGamePrefs");
byte[] boolBytes = prefs.getByteArray("largeBoolArray");
int arraySize = prefs.getInteger("boolArraySize");
BooleanArray restoredArray = bytesToBooleanArray(boolBytes, arraySize);

优点:空间占用极小,性能高;缺点:需要自己写转换逻辑,可读性差(字节数组无法直接查看内容)。

2. 转成0/1字符串(简单直观)

把每个boolean转成"1"(true)或"0"(false),拼接成一个长字符串保存。这个方法代码最简单,适合不需要极致压缩的场景,或者需要手动查看保存数据的测试场景。

保存与读取:

// 保存
Preferences prefs = Gdx.app.getPreferences("MyGamePrefs");
StringBuilder sb = new StringBuilder();
for (boolean b : myLargeBooleanArray) {
    sb.append(b ? '1' : '0');
}
prefs.putString("largeBoolArrayStr", sb.toString());
prefs.flush();

// 读取
String boolStr = prefs.getString("largeBoolArrayStr");
BooleanArray restoredArray = new BooleanArray(boolStr.length());
for (char c : boolStr.toCharArray()) {
    restoredArray.add(c == '1');
}

优点:代码极简,可读性强(直接看字符串就能知道布尔值序列);缺点:空间效率低(100个布尔值占100字节)。

3. 用LibGDX内置Json序列化(最省心)

LibGDX的Json类原生支持序列化BooleanArray,不需要自己写任何转换逻辑,代码量最少,适合快速开发。

保存与读取:

// 保存
Preferences prefs = Gdx.app.getPreferences("MyGamePrefs");
Json json = new Json();
String jsonStr = json.toJson(myLargeBooleanArray);
prefs.putString("boolArrayJson", jsonStr);
prefs.flush();

// 读取
Preferences prefs = Gdx.app.getPreferences("MyGamePrefs");
String jsonStr = prefs.getString("boolArrayJson");
Json json = new Json();
BooleanArray restoredArray = json.fromJson(BooleanArray.class, jsonStr);

优点:零转换逻辑,代码最简洁;缺点:序列化后的字符串包含额外结构(比如{"size":100,"items":[true,false,...]}),空间占用比二进制方法高,但比0/1字符串略优。

选择建议

  • 如果追求极致空间效率:选二进制字节数组方案;
  • 如果想快速实现、少写代码:选Json序列化方案;
  • 如果需要手动查看或编辑保存的数据:选0/1字符串方案。

内容的提问来源于stack exchange,提问作者Mounir Elfassi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:56:46