using System.Collections.Generic; using UnityEngine; public class OneMillionMarkers : MonoBehaviour { private const int countMarkers = 1000000; private List[] markers; private OnlineMaps map; private int pitx; private int pity; private int pibx; private int piby; private void OnChangePosition() { double tlx, tly, brx, bry; map.GetTopLeftPosition(out tlx, out tly); map.GetBottomRightPosition(out brx, out bry); if (tlx > brx) brx += 360; int itx = (int)((tlx + 180) / 10); int ity = (int)((bry + 90) / 10); int ibx = (int)((brx + 180) / 10) + 1; int iby = (int)((tly + 90) / 10) + 1; if (itx != pitx || ity != pity || pibx != ibx || piby != iby) UpdateMarkers(); } private void GenerateMarkers() { markers = new List[648]; // 36 * 18 for (int i = 0; i < countMarkers; i++) { OnlineMapsMarker marker = new OnlineMapsMarker(); double longitude = Random.Range(-180f, 180f); double latitude = Random.Range(-90f, 90f); marker.SetPosition(longitude, latitude); marker.label = "Marker " + i; marker.Init(); int mx = (int) ((longitude + 180) / 10); int my = (int) ((latitude + 90) / 10); int index = mx * 18 + my; if (markers[index] == null) markers[index] = new List(32); else if (markers[index].Count == markers[index].Capacity) markers[index].Capacity += 32; markers[index].Add(marker); } } private void Start() { map = OnlineMaps.instance; GenerateMarkers(); UpdateMarkers(); map.OnChangePosition += OnChangePosition; map.OnChangeZoom += UpdateMarkers; } private void UpdateMarkers() { double tlx, tly, brx, bry; map.GetTopLeftPosition(out tlx, out tly); map.GetBottomRightPosition(out brx, out bry); if (tlx > brx) brx += 360; List ms = new List(); int itx = (int) ((tlx + 180) / 10); int ity = (int) ((bry + 90) / 10); int ibx = (int) ((brx + 180) / 10) + 1; int iby = (int) ((tly + 90) / 10) + 1; for (int x = itx; x < ibx; x++) { int cx = x; if (cx >= 36) cx -= 36; cx *= 18; for (int y = ity; y < iby; y++) { ms.AddRange(markers[cx + y]); } } OnlineMaps.instance.markers = ms.ToArray(); pitx = itx; pity = ity; pibx = ibx; piby = iby; } }