Лаборатория Лиса
79 subscribers
171 photos
6 videos
8 files
29 links
Ставлю эксперименты с Юнити C#
Download Telegram
Код из последнего эксперимента:
public struct AdvancedMeshJob : IJob 
{
[NativeDisableUnsafePtrRestriction]
public IntPtr meshDataPtr;
public float deltaTime;

public void Execute()
{
var cache = (MeshDataCache)GCHandle.FromIntPtr(meshDataPtr).Target;

for (int i = 0; i < cache.vertices.Length; i++)
{
// Считаем расстояние от центра для каждой вершины
float distanceFromCenter = Mathf.Sqrt(
cache.vertices[i].x * cache.vertices[i].x +
cache.vertices[i].z * cache.vertices[i].z
);

// Создаём повторяющуюся волну на основе расстояния
float repeatingDistance = (distanceFromCenter + deltaTime) % 1.0f;

// Применяем кривую к Y-координате
cache.vertices[i].y = cache.curveY.Evaluate(repeatingDistance) * 4f;
}
}
}
public class MeshDataCache
{
public Vector3[] vertices;
public AnimationCurve curveY;
}
public class TestMeshInJobs : MonoBehaviour
{
[SerializeField] private AnimationCurve curveX;
[SerializeField] private AnimationCurve curveY;

private Mesh targetMesh;
private MeshDataCache meshCache;
private GCHandle meshHandle;
private IntPtr meshPtr;

private AdvancedMeshJob job;

private JobHandle jobHandle;

void Start()
{
targetMesh = GetComponent<MeshFilter>().mesh;

meshCache = new MeshDataCache
{
vertices = targetMesh.vertices,
};

meshHandle = GCHandle.Alloc(meshCache, GCHandleType.Pinned);
meshPtr = (IntPtr)meshHandle;

job = new AdvancedMeshJob
{
meshDataPtr = meshPtr,
deltaTime = Time.time // Используем time вместо deltaTime для волны
};

StartCoroutine(CorrutineTest());

}
public IEnumerator CorrutineTest()
{
while(true)
{
job.deltaTime = Time.time;
jobHandle = job.Schedule();
yield return new WaitForSeconds(0.05f);
jobHandle.Complete();
targetMesh.SetVertices(meshCache.vertices);
}
}
void OnDestroy()
{
if (!jobHandle.IsCompleted)
{
jobHandle.Complete();
}
if (meshHandle.IsAllocated)
meshHandle.Free();
}
}

#ЛисыПишутКод #CSharp #Unity #GameDev #Optimization
#UnsafeCode #UnityJobs #BurstCompiler #Programming
#MultiThreading
🦊 Результаты эксперимента с Job System в Unity

После серии тестов мы обнаружили интересные особенности работы с Job System:

✨ Главное открытие: можно спокойно использовать IntPtr для передачи ссылок на управляемые классы в джобы! Это позволяет работать с такими Unity-объектами как AnimationCurve прямо внутри джоба.

🔍 Производительность:

IntPtr показывает незначительное преимущество перед NativeArray
Разница настолько мала, что заметна только при профилировании
Выбор между IntPtr и NativeArray стоит делать исходя из удобства использования

💡 Преимущества подхода с IntPtr:

Возможность работать с некоторыми Unity-объектами в джобах.
Возможность работать с ссылочными типами.
Меньше boilerplate-кода.
Удобное кэширование нескольких массивов данных.
Прямой доступ к управляемым объектам.

⚠️ Важно помнить:

Всегда освобождать GCHandle
Дожидаться завершения джоба перед освобождением памяти
Использовать атрибут [NativeDisableUnsafePtrRestriction]

🎮 Практическое применение:

Отлично подходит для процедурной анимации, модификации мешей и других задач, где нужен доступ к Unity API внутри джобов.

#ЛисыПишутКод #CSharp #Unity #GameDev #Optimization
#UnsafeCode #UnityJobs #BurstCompiler #Programming
🦊 Результаты эксперимента с Job System в Unity

Последние наши исследования, которые взаимодействуют с GCHandle ломаются в IL2CPP. Лично я свои проекты билжу на Mono, для меня это не проблема. Любые указатели

Но для кого то, это может быть ОЧЕНЬ важно!

У IL2CPP в целом много ограничений, так что это было ожидаемо.

#ЛисыПишутКод #CSharp #Unity #GameDev #Optimization
#UnsafeCode #UnityJobs #BurstCompiler #Programming
❤‍🔥2
Геометрические ноды, это НЕЧТО!
❤‍🔥2
Запекание для текстур плохо подходит, надо рендерить через камеру. Пока не придумал как можно сделать нормально повторяющуюся текстуру
❤‍🔥2
Все, у меня получилась бесшевная текстура
❤‍🔥1👍1
Еще одна бесшовная текстура
❤‍🔥4
Так то лучше
👍3
Ну все, могу делать текстуры =D
Я рад.
Это было оказывается легко
❤‍🔥1
По моему красиво
❤‍🔥1
500 батчей