Я подозреваю, что использование словаря будет медленнее, чем использование простого массива. Если ваш мир состоит из 512x512 плиток, то вы выделяете массив длиной 512x512 (262144). YВы можете получить любую плитку в этом массиве, используя «array [x + (y * 512)]».
Вы знаете, сколько плиток существует, поэтому храните массив, в котором каждая либо указывает на плитку в этой позиции, либо имеет индекс на плитку в списке (вы, вероятно, сэкономите память таким образом, так как вы, вероятно, сможете сохранить все свои плитки). в массиве размером менее 65536 или, может быть, даже 256, и, таким образом, индекс сохраняется как 16-битный.
Затем вы находите область вашего массива, которую хотите визуализировать. Чтобы сделать это оптимально, вы должны избегать максимально возможного переключения текстур. Итак, во-первых, я бы проверил, насколько велики ваши плитки, а затем попытался бы объединить как можно больше текстур в одну большую текстуру. Затем настройте ваши UV для выборки части этой большой текстуры. Таким образом, вы сможете ограничить количество используемых текстур несколькими большими текстурами. Конечно, вы, вероятно, обнаружите, что в данном наборе плиток (например, на скалистом грунте) будут использоваться те же группы текстур. Также может быть какое-то смешение с травой где-то, так что вполне может стоить удерживать текстуры травы в ОБОИХ больших текстурах, чтобы избежать такого большого количества свопов текстур. т.е. жертвовать видеопамяти на скорость.
Затем вы перебираете видимую часть массива и рисуете все плитки, используя текстуру 1, а затем все плитки, используя текстуру 2 и т. Д.