У меня есть некоторый 3d-интерполяционный код, который занимает 90% времени выполнения моих проектов и не может быть предварительно вычислен.
Какие методы я могу использовать для ускорения этого? Алгоритмическая или микро-оптимизация?
Вот код для заинтересованных.
В основном он берет данные, которые были помещены в 2 3D-массивы и интерполирует остальные данные.
EDIT: Также я уже разделяю это на потоки на более высоком уровне для повышения производительности, но это не помогает на телефоне Windows, поскольку все они одноядерные...
Я, вероятно, сделаю что-то вроде: (Single [] DensityMap = new Single [128 * 128 * 128];), чтобы удалить массив с множеством D-массивов. Я получаю доступ к массиву в 100 местах и надеялся не делать этого (обертка в функции не помогает, поскольку телефон Windows не будет встроить вызов функции, и это не помогает перфомансу...)
float[, ,] DensityMap = new float[128, 128, 128];
float[, ,] PressureMap = new float[128, 128, 128];
unchecked
{
for (int x = 0; x < g_CraftWorldConstants.RegionSizeX; x++)
{
int offsetX = (x / SAMPLE_RATE_3D_HOR) * SAMPLE_RATE_3D_HOR;
int plusOffsetX = SAMPLE_RATE_3D_HOR + offsetX;
int poxox = plusOffsetX - offsetX;
double poxxpoxox = ((plusOffsetX - x) / (double)poxox);
double xoxpoxox = ((x - offsetX) / (double)poxox);
for (int y = 0; y < g_CraftWorldSettings.GET.RegionSizeY; y++)
{
int offsetY = (y / SAMPLE_RATE_3D_VERT) * SAMPLE_RATE_3D_VERT;
int plusOffsetY = SAMPLE_RATE_3D_VERT + offsetY;
int poyoy = plusOffsetY - offsetY;
double poyypoyoy = ((plusOffsetY - y) / (double)poyoy);
double yoypoyoy = ((y - offsetY) / (double)poyoy);
for (int z = 0; z < g_CraftWorldConstants.RegionSizeZ; z++)
{
if (!(x % SAMPLE_RATE_3D_HOR == 0 && y % SAMPLE_RATE_3D_VERT == 0 && z % SAMPLE_RATE_3D_HOR == 0))
{
int offsetZ = (z / SAMPLE_RATE_3D_HOR) * SAMPLE_RATE_3D_HOR;
int plusOffsetZ = SAMPLE_RATE_3D_HOR + offsetZ;
int pozoz = plusOffsetZ - offsetZ;
double pozzpozoz = ((plusOffsetZ - z) / (double)pozoz);
double zozpozoz = ((z - offsetZ) / (double)pozoz);
double x00 = poxxpoxox * in_DensityMap[offsetX, offsetY, offsetZ] + xoxpoxox * in_DensityMap[plusOffsetX, offsetY, offsetZ];
double x10 = poxxpoxox * in_DensityMap[offsetX, offsetY, plusOffsetZ] + xoxpoxox * in_DensityMap[plusOffsetX, offsetY, plusOffsetZ];
double x01 = poxxpoxox * in_DensityMap[offsetX, plusOffsetY, offsetZ] + xoxpoxox * in_DensityMap[plusOffsetX, plusOffsetY, offsetZ];
double x11 = poxxpoxox * in_DensityMap[offsetX, plusOffsetY, plusOffsetZ] + xoxpoxox * in_DensityMap[plusOffsetX, plusOffsetY, plusOffsetZ];
double r0 = poyypoyoy * x00 + yoypoyoy * x01;
double r1 = poyypoyoy * x10 + yoypoyoy * x11;
in_DensityMap[x, y, z] = (float)(pozzpozoz * r0 + zozpozoz * r1);
double x02 = poxxpoxox * in_CaveDensity[offsetX, offsetY, offsetZ] + xoxpoxox * in_CaveDensity[plusOffsetX, offsetY, offsetZ];
double x12 = poxxpoxox * in_CaveDensity[offsetX, offsetY, plusOffsetZ] + xoxpoxox * in_CaveDensity[plusOffsetX, offsetY, plusOffsetZ];
double x03 = poxxpoxox * in_CaveDensity[offsetX, plusOffsetY, offsetZ] + xoxpoxox * in_CaveDensity[plusOffsetX, plusOffsetY, offsetZ];
double x13 = poxxpoxox * in_CaveDensity[offsetX, plusOffsetY, plusOffsetZ] + xoxpoxox * in_CaveDensity[plusOffsetX, plusOffsetY, plusOffsetZ];
double r2 = poyypoyoy * x02 + yoypoyoy * x03;
double r3 = poyypoyoy * x12 + yoypoyoy * x13;
in_CaveDensity[x, y, z] = (float)(pozzpozoz * r2 + zozpozoz * r3);
}
}
}
}
}