Libgdx: Batasan kapasitas IntMap

Dibuat pada 20 Jul 2020  ·  3Komentar  ·  Sumber: libgdx/libgdx

Detail masalah

Implementasi IntMap saat ini tampaknya memiliki kapasitas maksimum sekitar 11425 entri. Saya telah menguji pada 1.9.10 dan 1.9.11-SNAPSHOT. Saya juga mencoba membuat metode hashcode() dan equals() untuk TestObject.

Lihat unit test di bawah ini sebagai reproduksi.

Langkah/kode reproduksi

import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.RandomXS128;
import com.badlogic.gdx.utils.IntMap;
import org.junit.Assert;
import org.junit.Test;

public class IntMapTest {

    <strong i="9">@Test</strong>
    public void testLargeMap() {
        final int totalEntries = 11427;

        final float minX = -64000f;
        final float minY = -38400f;
        final float maxX = Math.abs(minX);
        final float maxY = Math.abs(minY);

        MathUtils.random = new RandomXS128(1024);

        final IntMap<TestObject> intMap = new IntMap<TestObject>(totalEntries);
        for(int i = 0; i < totalEntries; i++) {
            final TestObject testObject = new TestObject();
            testObject.x = MathUtils.random(minX, maxX);
            testObject.y = MathUtils.random(minY, maxY);

            intMap.put(testObject.getIndex(), testObject);
        }
        Assert.assertEquals(totalEntries, intMap.size);
    }

    private class TestObject {
        float x, y;

        public int getIndex() {
            final int row = MathUtils.floor(y / 8f);
            final int column = MathUtils.floor(x / 8f);
            return (row * ((64000 / 8))) + column;
        }
    }
}

Komentar yang paling membantu

Melihat ke dalamnya sekarang.

Semua 3 komentar

Melihat ke dalamnya sekarang.

Tidak ada masalah di sini; saat Anda memasukkan kunci yang sama ke dalam Peta, itu akan menggantikan nilai asli dengan nilai baru, dan mengembalikan nilai asli (lihat: IntMap.put() docs, atau Map.put() di JDK). Dan hanya itu yang terjadi; pengujian Anda selalu menyisipkan 3 kunci (hasil getIndex()) ketika kunci itu sudah ada di IntMap, dan 11424 dimasukkan tanpa ada duplikat. Saya menambahkan cetakan debug ketika indeks diulang:

21094870 was the same as 21094870
-13869065 was the same as -13869065
-17368612 was the same as -17368612

expected:<11427> but was:<11424>
Expected :11427
Actual   :11424

Itu 3 duplikat, dan 3 item lebih sedikit di IntMap sebagai hasilnya. Jika 11424 adalah maksimum yang sulit, maka yang berikut ini tidak mungkin:

21094870 was the same as 21094870
-13869065 was the same as -13869065
-17368612 was the same as -17368612

expected:<12427> but was:<12424>
Expected :12427
Actual   :12424

Tapi kami sebenarnya bisa mendapatkan lebih dari 11424 item dalam implementasi Peta yang teruji secara menyeluruh... Salah satu dari banyak tes yang dilakukan pada bulan Januari untuk PR yang saya buat melibatkan benchmark koleksi libGDX dengan 100.000 atau 1.000.000 entri dimasukkan ke dalamnya, jadi saya cukup yakin bahwa itu bisa menangani 11.427.

Tes ini memang mengekspos kekhasan koleksi berbasis hash 1.9.10, dan itu adalah alasan lain mengapa PR untuk 1.9.11 penting -- ObjectMap, ObjectSet, IntMap, IntIntMap, IntFloatMap, LongMap, IdentityMap, OrderedMap, dan OrderedSet (apakah saya melewatkan any?) akan jarang memanggil MathUtils.random(2) internal, yang mengacaukan serangkaian panggilan deterministik ke metode pembuatan nomor acak MathUtils dengan objek RandomXS128 atau Random yang diunggulkan. Itu berarti float yang diserahkan ke TestObject berbeda di 1.9.10, di 1.9.11, dan di 1.9.10 dengan semua panggilan IntMap dihapus (hanya mencatat float yang dihasilkan oleh MathUtils). Masih belum ada batasan kapasitas, dan perilaku yang diamati masih merupakan perilaku yang diharapkan dan terdokumentasi untuk Peta, tetapi ukuran sebenarnya dari IntMap akan berbeda karena aliran angka acak yang diberikan berbeda pada libGDX 1.9.10 (1.9.11 hanya sedikit berbeda, dengan dua nilai pengulangan alih-alih 3, tetapi semua angka setelah titik tertentu berbeda karena tidak bersaing dengan panggilan IntMap ke MathUtil 's static Random variabel

Terima kasih telah menyelidiki! Saya akan meninjau ulang cara saya menghitung indeks saya dalam game tetapi tidak boleh ada duplikat. Pasti hanya kebetulan bahwa selalu ada 11425 entri pada game dan unit test. Saya akan membuka kembali masalah ini jika saya menemukan sesuatu di IntMap.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat