public struct DamageInfo
{
public float Damage;
public Vector3 Forward;
public DamageInfo(float damage, Vector3 forward)
{
Damage = damage;
Forward = forward;
}
}
변수 더 추가할까 말까 고민인뎀
걍 눈꼽만큼 최적화 되는 거임??
public enum DotDamageLevel : byte
{
None = 0,
Low = 1,
Medium = 2,
High = 3,
VeryHigh = 4
}
그리고 enum에다가 byte 붙이면 4바이트에서 1바이트로 줄여준다는데
이것도 개미똥구멍임?
enum같은거는 그냥 4바이트 타입 쓰는게 빠르긴 함. 메모리 최적화가 중요하면 1바이트 써도 되고 성능상으론 그냥 4바이트가 나을건데 둘다 쥐똥차이일듯
그렇군용..
구조체는 속도상 문제는 없다고 보고 바이트 정렬은 해주는게 좋은데 일반적으로 컴파일러가 해줌. 속도문제보단 메모리 낭비는 생길 수 있음 저런건 대부분 사소한 문제고 데이터가 필요하면 쓰는게 우선이라. 일단 찍어내고 나중에 최적화 할때 테스트하면서 보셈
밑에 갤럼도 이야기 했는데 이런건 메모리 할당 자체가 반복되지 않게 데이터 재사용을 많이 하거나, 자료구조적으로 연산 줄이는게 훨씬 효과적임. 이런건 지나치게 사소한 부분이라서 서버 패킷 직렬화같은거 할거 아니면 일단 만드는데 집중하는거 추천함
pc나 모바일 쪽이면 의미없지 않을까 싶음. 저런 작은 바이트 의미있는게 서버 패킷이나 콘솔에서 특정기기들 메모리 아낄라고 하는건데 그건 나중에 거의다 만들고 문제 생기면 바꿔도됨.
아 근데 댐지 관련 구조체라 1프레임 동안 수백번 복사가 일어날 수도 있는데 몬가몬가인
단순 계산해보면됨. 1바이트 1000개 만들어봐야 1kb뿐이 안됨. 10kb트면 1만개임. 아무리 많아도 1mb넘기긴힘듬. 콤퓨타 기본 메모리 요새 적어도 1gb는 넘으니깐 엄청난 차이이긴함. 걱정해야될부분은 메모리 생성과 해제가 반복하지 않게 만드는 구조가 조흔듯.
그럼 스택에 저장하니까 구조체인 걸로 OK인감
오래되서 기억이 잘안나지만적당히 기억나는데로 써보면저걸 배열로 1000개 선언하면 스택에 할당하는게 맞을꺼임근데 new로 할당하면 힙에 할당됨c#할당방법을 찾아봐야겠지만기본 변수선언은 스택이지만공간을 만들어야하는건 힙이 맞을꺼임컴파일러가 알아서 잘 정리해서 유니티한테 메모리 잘만들라고 해줄꺼야.
byte는 사소하지만 255까지로 제한되기까지 함
낭낭한데..?
구조체 관련해서는 애초에 구조체 크기 16바이트 넘길거 같으면 조금 더 넣어 32바이트까지 키워버리는 상남자 해결책 어떰 ㅋㅋ
엄 그래도 돼요..?
구조체 보통 문제 생기는게 패딩이라고, 단위 맞춰서 CPU가 읽기 편하려고 빈 공간을 억지로 만드는거 때매 그럴거임
성능 측면에서는 모르겠지만, 애초에 의미없이 빈 공간으로 둘거면 차라리 뭐라도 채우는게 나을테니
근데 궁금해져서 함 인터넷 뒤져보니까, 애초에 16바이트 넘을거같으면 사용 안하는게 정답인거같긴 하다 ㅋㅋㅋ
절약 가능할때 해둬야지 나중에 최적화 하려면 피똥싸
미래의 본인이 어떻게든 할거니까 신경ㄴㄴ
이게 맞다
이게 맞음
근데 나 프로그램 가르쳐준 아저씨는 컴파일러를 믿으랬어 ㅋㅋ
무의미함
큰 연산 돌릴 때면 모르겠는데 보통은 그렇게 신경 안 써도 됨
그리고 struct가 좀 커졌다 싶고 복사 성능 신경 좀 쓰인다 싶으면 걍 ref로 넘기면 되어서 일반적인 경우는 거의 무의미한 수준
Unmanaged 스트럭쳐를 데이터 모델용으로 쓸거면 크기 생각 안해도됨 Managed 여도 작은크기면 신경안써도됨. 이젠 유니티도 매 프레임마다 gc 돌리니까 만약 저 스트럭쳐를 몇십만개 하나의 배열에 넣고 쓰는데 생성과 삭제가 잦으면 그때는 다이어트 해야지만 그정도 아니면 맘대로하면됨
*배열의 생성과 삭제
이제 비트단위로 쪼개서 enum 작은것들 여러개 넣자 ㅋㅋ
지금 구현한게 enum(byte) 3개로 3바이트 float 2개 8바이트 byte 1개 1바이트 bool 2개 2바이트 short 1개 2바이트 이렇게 16바이트 맞췄슴
의미없다곤 하는데 뭐.. 이미 짠걸 우째
돌아만 가면 그거슨 프로그램인것
복사 비용이 참조보다 커지니까 그런 말들 하는데, 이미 C#은 in 키워드 있는걸 - dc App
참조 타입은 매개변수로 넘겨도 항상 64비트, 즉 8바이트 주소값만 넘기면 되는데, 값 타입은 복사해서 넘기느라 사이즈가 클 수록 복사 비용이 커짐. 근데 C# in, ref 키워드 붙이면 참조로 넘길 수 있음. - dc App
void Function(in FooStruct foo); ___ var bar = new FooStruct(); Function(in bar); - dc App
아하... 근데 지금 코드 몇몇 부분에서 저 구조체에다 ref 붙인 거 있는데 이러면 어케됨