我正在尝试通过批量渲染相同类型的块的纹理来改进我的游戏渲染。
我游戏中的每个块都是以 BlockWood 格式的类定义的,所有扩展来自块。
我目前在不同的块类/类型之间有一个映射,并且在地图上有一个ArrayList,它包含该类型的所有块的位置。
HashMap<Block, ArrayList<Vector2f>> blockMap = new HashMap<Block, ArrayList<Vector2f>>();
使用这个,我可以循环遍历地图,批量渲染每种类型的块,加快渲染速度。
然而,这种方法不起作用。我希望能够使用虚拟类来访问ArrayList -
blockMap.get(BlockWood.class);
有没有什么方法可以将类类型映射到ArrayList?或者我只需要映射类字符串表示?
答案 0 :(得分:1)
您的地图不在班级和列表之间。它将Block
的实例映射到列表。因此,您始终必须使用Block实例来访问其列表。
blockMap.get(new BlockWood());
问题是你会得到什么?您将获得以前使用此键存储在此地图中的列表。
BTW改进您的代码将您的地图定义更改为:
Map<Block, List<Vector2f>> blockMap = new HashMap<Block, List<Vector2f>>();
现在您可以使用任何类型的列表。
答案 1 :(得分:1)
您想使用Class
作为密钥类型。您当前的实现使用Block
实例作为密钥。使用Class
的方式将使用Block
的类型作为键。
答案 2 :(得分:-1)
这里的问题是Map有两个值(一个键和一个值),而一个List只有一个值(一个元素)。
因此,您可以获取所有键的列表或所有值的列表。
获取所有键的列表,您可以
ArrayList<Block> keys = new ArrayList<Block>(blockMap.keySet());
获取所有值的列表,您可以
ArrayList<ArrayList<Vector2f>> values = new ArrayList<ArrayList<Vector2f>>(blockMap.values());