Merge pull request #66 from vahpy/master

Reduced OutOfMemory exceptions for importing large datasets
This commit is contained in:
Matias Lavik 2021-10-20 10:52:23 +01:00 коммит произвёл GitHub
Родитель 8e06ce715e 9734e9b9c3
Коммит 22c3e6a549
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
1 изменённых файлов: 40 добавлений и 13 удалений

Просмотреть файл

@ -117,19 +117,31 @@ namespace UnityVolumeRendering
int maxValue = GetMaxDataValue();
int maxRange = maxValue - minValue;
Color[] cols = new Color[data.Length];
bool isHalfFloat = texformat == TextureFormat.RHalf;
try
{
// Create a byte array for filling the texture. Store has half (16 bit) or single (32 bit) float values.
int sampleSize = isHalfFloat ? 2 : 4;
byte[] bytes = new byte[data.Length * sampleSize]; // This can cause OutOfMemoryException
for (int iData = 0; iData < data.Length; iData++)
{
float pixelValue = (float)(data[iData] - minValue) / maxRange;
byte[] pixelBytes = isHalfFloat ? BitConverter.GetBytes(Mathf.FloatToHalf(pixelValue)) : BitConverter.GetBytes(pixelValue);
Array.Copy(pixelBytes, 0, bytes, iData * sampleSize, sampleSize);
}
texture.SetPixelData(bytes, 0);
}
catch (OutOfMemoryException ex)
{
Debug.LogWarning("Out of memory when creating texture. Using fallback method.");
for (int x = 0; x < dimX; x++)
{
for (int y = 0; y < dimY; y++)
{
for (int z = 0; z < dimZ; z++)
{
int iData = x + y * dimX + z * (dimX * dimY);
cols[iData] = new Color((float)(data[iData] - minValue) / maxRange, 0.0f, 0.0f, 0.0f);
texture.SetPixel(x, y, z, new Color((float)(data[x + y * dimX + z * (dimX * dimY)] - minValue) / maxRange, 0.0f, 0.0f, 0.0f));
}
}
}
texture.SetPixels(cols);
texture.Apply();
return texture;
}
@ -144,7 +156,15 @@ namespace UnityVolumeRendering
int maxValue = GetMaxDataValue();
int maxRange = maxValue - minValue;
Color[] cols = new Color[data.Length];
Color[] cols;
try
{
cols = new Color[data.Length];
}
catch (OutOfMemoryException ex)
{
cols = null;
}
for (int x = 0; x < dimX; x++)
{
for (int y = 0; y < dimY; y++)
@ -162,11 +182,18 @@ namespace UnityVolumeRendering
Vector3 grad = new Vector3((x2 - x1) / (float)maxRange, (y2 - y1) / (float)maxRange, (z2 - z1) / (float)maxRange);
if (cols == null)
{
texture.SetPixel(x, y, z, new Color(grad.x, grad.y, grad.z, (float)(data[iData] - minValue) / maxRange));
}
else
{
cols[iData] = new Color(grad.x, grad.y, grad.z, (float)(data[iData] - minValue) / maxRange);
}
}
}
texture.SetPixels(cols);
}
if (cols != null) texture.SetPixels(cols);
texture.Apply();
return texture;
}