У меня есть набор данных из почти 120 000 звезд и тестовый набор данных из 215 звезд (взятых из основного набора данных), и я делаю программу, которая читает набор данных и строит графики звезд вокруг трехмерной модели Земли.
- Набор данных считывается, а информация хранится в нескольких списках (в одноэлементном скрипте)
- Затем скрипт симуляции читает списки (Singleton уничтожается, чтобы сделать программу более эффективной):
void listStars()
{
int i = 0;
while (i < (StarDataBank.Instance.NumOfStars))
{
int primaryID = int.Parse(StarDataBank.Instance.StarIDID[i]);
string properName = StarDataBank.Instance.StarName[i];
string HIPID = StarDataBank.Instance.StarIDHIP[i];
string HDID = StarDataBank.Instance.StarIDHD[i];
string HRID = StarDataBank.Instance.StarIDHR[i];
string GLID = StarDataBank.Instance.StarIDGL[i];
string BFID = StarDataBank.Instance.StarIDBF[i];
decimal rightAscension = Convert.ToDecimal(StarDataBank.Instance.StarRA[i]);
decimal declination = Convert.ToDecimal(StarDataBank.Instance.StarDec[i]);
decimal Mag;
decimal CI;
float scale = 0;
int r = 0;
int g = 0;
int b = 0;
Decimal.TryParse((StarDataBank.Instance.StarMag[i]), out Mag);
Decimal.TryParse((StarDataBank.Instance.StarCI[i]), out CI);
if (PlayerPrefs.GetInt("dynamicSize") == 1)
{
if (Mag < -1)
{
scale = 77.5f;
}
else
{
if (Mag > -1 && Mag <= 5)
{
scale = 52.5f;
}
else
{
if (Mag > 5 && Mag <= 10)
{
scale = 32.5f;
}
else
{
if (Mag > 10 && Mag <= 15)
{
scale = 17.5f;
}
else
{
if (Mag > 15 && Mag <= 20)
{
scale = 7.5f;
}
else
{
if (Mag > 20 && Mag <= 25)
{
scale = 2.5f;
}
}
}
}
}
}
}
else
{
scale = 20;
}
StartCoroutine(placeStars(primaryID, properName, HIPID, HDID, HRID, GLID, BFID, rightAscension, declination, Mag, CI, scale));
i++;
}
DestroyImmediate(StarDataBank.Instance.gameObject);
}
Каждая звезда строится следующим образом:
IEnumerator placeStars(int primaryID, string properName, string HIPID, string HDID, string HRID, string GLID, string BFID, decimal rightAscension, decimal declination, decimal magnitude, decimal colourIndex, float scale)
{
var thisStar = (GameObject)Instantiate(prefabStar, transform.position + getVectors(Convert.ToDecimal(rightAscension), Convert.ToDecimal(declination)), Quaternion.identity);
thisStar.name = (primaryID).ToString();
thisStar.transform.parent = StarObject.transform;
thisStar.transform.localScale = new Vector3(scale, scale, scale);
thisStar.AddComponent<Star>().newStar(primaryID, properName, HIPID, HDID, HRID, GLID, BFID, rightAscension, declination, magnitude, colourIndex);
yield return null;
}
Используя меньший набор тестовых данных с 215 звездами, я могу прикрепить класс Star к каждой Инстанцированной звезде.
Но с большим полным набором данных с ~ 120 тыс. Звезд Unity Editor просто зависает после нажатия кнопки воспроизведения. Когда я закомментирую эту строку: thisStar.AddComponent<Star>().newStar(...);
Программа работает так, как задумано, каждая звезда наносится на сцену, единственное, что класс Star не привязывается к каждой вновь созданной звезде.
Это означает, что функция AddComponent не очень хорошо работает с моим кодом, особенно когда используется большой набор данных.
Существует ли более эффективный способ присоединения класса Star к каждому экземпляру звезды GameObject?
Кроме того, имеет ли значение, когда я уничтожаю синглтон после того, как я закончу его использовать? И имеет ли значение, что я использовал IEnumerator для создания экземпляра?
EDIT: Вот класс Star:
public class Star : MonoBehaviour
{
Simulation simulationInstance;
public int primaryID; // primary key NEEDS TO BE SET
public string properName; // some stars have names NEEDS TO BE SET
public string HIPID; // ID of star from Hipparcos catalogue NEEDS TO BE SET
public string HDID; // ID of star from Henry Draper catalogue NEEDS TO BE SET
public string HRID; // ID of star from Harvard Revised catalogue NEEDS TO BE SET
public string GLID; // ID of star from Gliese catalogue NEEDS TO BE SET
public string BFID; // ID of star from BayerFlamsteed catalogue NEEDS TO BE SET
public decimal rightAscension; // right ascension of star NEEDS TO BE SET
public decimal declination; // declination of star NEEDS TO BE SET
public decimal magnitude; // magnitude of the star NEEDS TO BE SET
public decimal colourIndex; // colour index of the star NEEDS TO BE SET
public int scale; // size of the sphere that will represent the star AUTOMATICALLY SET
public int red; // red colour (0-255) AUTOMATICALLY SET
public int green; // green colour (0-255) AUTOMATICALLY SET
public int blue; // blue colour (0-255) AUTOMATICALLY SET
public double x; // AUTOMATICALLY SET
public double y; // AUTOMATICALLY SET
public double z; // AUTOMATICALLY SET
void Start()
{
simulationInstance = FindObjectOfType<Simulation>();
}
public void newStar(int primaryID, string properName, string HIPID, string HDID, string HRID, string GLID, string BFID, decimal rightAscension, decimal declination, decimal magnitude, decimal colourIndex)
{
this.primaryID = primaryID;
this.properName = properName;
this.HIPID = HIPID;
this.HDID = HDID;
this.HRID = HRID;
this.GLID = GLID;
this.BFID = BFID;
this.rightAscension = rightAscension;
this.declination = declination;
this.magnitude = magnitude;
this.colourIndex = colourIndex;
}
public void tellStarInfoPanel()
{
simulationInstance.starInfoPanelManager(primaryID, properName, HIPID, HDID, HRID, GLID, BFID, rightAscension, declination, magnitude, colourIndex);
}
}
EDIT: я сделал listStars () сопрограммой и placeStars ( ) нормальный метод
public void placeStars(int primaryID, string properName, string HIPID, string HDID, string HRID, string GLID, string BFID, decimal rightAscension, decimal declination, decimal magnitude, decimal colourIndex, float scale)
{
var thisStar = (GameObject)Instantiate(prefabStar, transform.position + getVectors(Convert.ToDecimal(rightAscension), Convert.ToDecimal(declination)), Quaternion.identity);
thisStar.name = (primaryID).ToString();
thisStar.transform.parent = StarObject.transform;
thisStar.transform.localScale = new Vector3(scale, scale, scale);
thisStar.GetComponent<Star>().newStar(primaryID, properName, HIPID, HDID, HRID, GLID, BFID, rightAscension, declination, magnitude, colourIndex);
starsRendered++;
}