Libgdx: IntMap ์šฉ๋Ÿ‰ ์ œํ•œ

์— ๋งŒ๋“  2020๋…„ 07์›” 20์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: libgdx/libgdx

๋ฌธ์ œ ์„ธ๋ถ€์ •๋ณด

ํ˜„์žฌ IntMap ๊ตฌํ˜„์˜ ์ตœ๋Œ€ ์šฉ๋Ÿ‰์€ ์•ฝ 11425๊ฐœ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. 1.9.10๊ณผ 1.9.11-SNAPSHOT ๋ชจ๋‘์—์„œ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ TestObject์— ๋Œ€ํ•œ hashcode() ๋ฐ equals() ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์žฌ์ƒ์‚ฐ์œผ๋กœ ์•„๋ž˜์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋ณต์ œ ๋‹จ๊ณ„/์ฝ”๋“œ

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;
        }
    }
}

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ง€๊ธˆ ์กฐ์‚ฌ ์ค‘์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

์ง€๊ธˆ ์กฐ์‚ฌ ์ค‘์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ํ‚ค๋ฅผ Map์— ์‚ฝ์ž…ํ•˜๋ฉด ์›๋ž˜ ๊ฐ’์ด ์ƒˆ ๊ฐ’์œผ๋กœ ๋ฐ”๋€Œ๊ณ  ์›๋ž˜ ๊ฐ’์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค(JDK์˜ IntMap.put() ๋ฌธ์„œ ๋˜๋Š” Map.put() ์ฐธ์กฐ). ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š” ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํ‚ค๊ฐ€ ์ด๋ฏธ IntMap์— ์žˆ๊ณ  11424๊ฐ€ ์ค‘๋ณต ์—†์ด ์‚ฝ์ž…๋œ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ๋Š” ํ•ญ์ƒ 3๊ฐœ์˜ ํ‚ค(getIndex()์˜ ๊ฒฐ๊ณผ)๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ๋ฐ˜๋ณต๋  ๋•Œ ๋””๋ฒ„๊ทธ ์ธ์‡„๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๊ฒฐ๊ณผ์ ์œผ๋กœ IntMap์—์„œ 3๊ฐœ์˜ ์ค‘๋ณต ํ•ญ๋ชฉ๊ณผ 3๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์ ์Šต๋‹ˆ๋‹ค. 11424๊ฐ€ ์ตœ๋Œ€๊ฐ’์ด๋ฉด ๋‹ค์Œ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ์ฒ ์ €ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ๋œ Map ๊ตฌํ˜„์—์„œ 11424๊ฐœ ์ด์ƒ์˜ ํ•ญ๋ชฉ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... 1์›”์— PR์„ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•œ ๋งŽ์€ ํ…Œ์ŠคํŠธ ์ค‘ ํ•˜๋‚˜๋Š” 100,000 ๋˜๋Š” 1,000,000 ํ•ญ๋ชฉ์„ ๋„ฃ์€ libGDX ์ปฌ๋ ‰์…˜์„ ๋ฒค์น˜๋งˆํ‚นํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” 11,427์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฝค ํ™•์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ํ…Œ์ŠคํŠธ๋Š” 1.9.10์˜ ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ปฌ๋ ‰์…˜์˜ ๋‹จ์ ์„ ๋…ธ์ถœํ•˜๋ฉฐ 1.9.11์— ๋Œ€ํ•œ PR์ด ์ค‘์š”ํ•œ ๋˜ ๋‹ค๋ฅธ ์ด์œ ์ธ ObjectMap, ObjectSet, IntMap, IntIntMap, IntFloatMap, LongMap, IdentityMap, OrderedMap ๋ฐ OrderedSet(๋‚ด๊ฐ€ ๋†“์ณค๋‚˜์š”? any?)๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ MathUtils.random(2) ๋ฅผ ๊ฑฐ์˜ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๋Š” ์‹œ๋“œ๋œ RandomXS128 ๋˜๋Š” Random ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MathUtils์˜ ๋‚œ์ˆ˜ ์ƒ์„ฑ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๊ฒฐ์ •๋ก ์  ํ˜ธ์ถœ ์ง‘ํ•ฉ์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ฆ‰, TestObject์— ์ „๋‹ฌ๋œ ๋ถ€๋™ ์†Œ์ˆ˜์ ์€ 1.9.10, 1.9.11 ๋ฐ 1.9.10์—์„œ ๋‹ค๋ฅด๋ฉฐ ๋ชจ๋“  IntMap ํ˜ธ์ถœ์ด ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(MathUtils์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๋ถ€๋™ ์†Œ์ˆ˜์ ๋งŒ ๊ธฐ๋ก). ์—ฌ์ „ํžˆ ์šฉ๋Ÿ‰ ์ œํ•œ์ด ์—†์œผ๋ฉฐ ๊ด€์ฐฐ๋œ ๋™์ž‘์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์˜ˆ์ƒ๋˜๊ณ  ๋ฌธ์„œํ™”๋œ Map ๋™์ž‘์ด์ง€๋งŒ ์ œ๊ณต๋œ ๋‚œ์ˆ˜ ์ŠคํŠธ๋ฆผ์ด libGDX 1.9.10์—์„œ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— IntMap์˜ ์‹ค์ œ ํฌ๊ธฐ๋Š” ๋‹ค๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (1.9.11์€ 3 ๋Œ€์‹  ๋‘ ๊ฐœ์˜ ๋ฐ˜๋ณต ๊ฐ’์ด ์žˆ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅผ ๋ฟ์ด์ง€๋งŒ MathUtil ์˜ ์ •์  Random IntMap ํ˜ธ์ถœ๊ณผ ๊ฒฝ์Ÿํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ์ง€์  ์ดํ›„์˜ ๋ชจ๋“  ์ˆซ์ž๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์กฐ์‚ฌํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ฒŒ์ž„ ๋‚ด์—์„œ ๋‚ด ์ธ๋ฑ์Šค๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค์‹œ ๊ฒ€ํ† ํ•˜์ง€๋งŒ ์ค‘๋ณต์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„๊ณผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ชจ๋‘์—์„œ ํ•ญ์ƒ 11425๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ์—ˆ๋˜ ๊ฒƒ์€ ์šฐ์—ฐ์ด์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. IntMap์—์„œ ๋ฌด์—‡์ด๋“  ์ •ํ™•ํžˆ ์ง€์ ํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰