예전에 게임 개발을 하던 시절, FPU 계산 오류로 특정 PC에서만 어설션 실패가 발생했던 기억이 있음
원인은 필기 입력 소프트웨어가 모든 프로세스에 DLL을 주입하면서 FPU 모드를 기본값으로 리셋하는 것이었음
결국 FPU 설정 코드를 초기화 단계에서 이벤트 루프로 옮겨, 서드파티 DLL이 끼치는 영향을 회피했음
멋진 추적이었음. 전역 FPU 상태는 정말 많은 두통거리를 만들어왔음
내 목표 중 하나는 Valve가 Nix를 사용하게 만드는 것임
Windows 지원이 진행 중이라 더 매력적으로 보일 거라 생각함
이렇게 되면 원본 소스뿐 아니라 당시의 툴체인과 의존성까지 완전히 재현할 수 있게 되어, 이런 버그의 근본 원인도 훨씬 쉽게 찾을 수 있을 것 같음
“Half-Life 2 VR 베타”가 실제로 플레이 가능한 것인지 궁금함
만약 가능하다면 왜 몰랐는지, 아니라면 왜 아직 안 되는지 의문임 Portal VR도 꼭 해보고 싶음. 멀미가 심하다고들 하지만 나는 VR 멀미에 면역이라 시도해볼 만함
베타는 모르겠지만, 지금 바로 즐길 수 있는 훌륭한 HL2 VR 컨버전 모드가 있음
오랜만에 HL2를 다시 하게 만들 정도로 완성도가 높음
Portal 2 VR 모드도 있음. 끝까지 플레이했는데 의외로 편안하게 즐길 수 있었음
x87에서 SSE로 전환할 때 일부 계산이 깨지는 건 흔한 일임 TF2에서도 같은 일이 있었는데, Linux 빌드에서는 SSE를 사용해 탄약 계산이 약간 달랐음
탄약 계산에 float을 썼다는 게 놀라움
실제로 눈에 띄는 차이는 엔지니어의 metal 수치 정도였음
작은 상자에서 +40 또는 +41을 주는데, 서버 OS에 따라 달랐음
새 서버에 접속할 때마다 어떤 OS인지 확인하는 재미가 있었음
x87에서 SSE로만 바꿔도 게임이 깨지는데, x86→ARM 변환이 어떻게 그렇게 잘 되는지 신기함
x87 FPU만이 유일하게 특이한 부동소수점 유닛임
80비트 레지스터를 써서 정밀도가 높지만, 메모리에 spill될 때 정밀도를 잃는 등 이상한 동작을 보임
정밀도 차이로 인해 수치가 아주 미세하게 달라지고, 그게 문 충돌 같은 문제로 이어지는 경우가 있음
예전에 소프트웨어 신시사이저를 디버깅할 때도 비슷한 정밀도 버그를 겪었음
RC 회로 시뮬레이션이 0에 근접해야 상태가 바뀌는데, 특정 CPU에서는 denormal 값이 플러시되지 않아 조건을 만족하지 못했음
결국 0.7과 0.01 정도로 대충 임계값을 조정하니 모든 플랫폼에서 잘 동작했음
메타 이야기로, 트위터 클론을 만들 건데 여러 단락으로 블로깅하면 바로 밴시키는 기능을 넣을 생각임
Hacker News 의견
예전에 게임 개발을 하던 시절, FPU 계산 오류로 특정 PC에서만 어설션 실패가 발생했던 기억이 있음
원인은 필기 입력 소프트웨어가 모든 프로세스에 DLL을 주입하면서 FPU 모드를 기본값으로 리셋하는 것이었음
결국 FPU 설정 코드를 초기화 단계에서 이벤트 루프로 옮겨, 서드파티 DLL이 끼치는 영향을 회피했음
내 목표 중 하나는 Valve가 Nix를 사용하게 만드는 것임
Windows 지원이 진행 중이라 더 매력적으로 보일 거라 생각함
이렇게 되면 원본 소스뿐 아니라 당시의 툴체인과 의존성까지 완전히 재현할 수 있게 되어, 이런 버그의 근본 원인도 훨씬 쉽게 찾을 수 있을 것 같음
“DOOR STUCK” 밈이 떠오름
관련 영상
“Half-Life 2 VR 베타”가 실제로 플레이 가능한 것인지 궁금함
만약 가능하다면 왜 몰랐는지, 아니라면 왜 아직 안 되는지 의문임
Portal VR도 꼭 해보고 싶음. 멀미가 심하다고들 하지만 나는 VR 멀미에 면역이라 시도해볼 만함
오랜만에 HL2를 다시 하게 만들 정도로 완성도가 높음
x87에서 SSE로 전환할 때 일부 계산이 깨지는 건 흔한 일임
TF2에서도 같은 일이 있었는데, Linux 빌드에서는 SSE를 사용해 탄약 계산이 약간 달랐음
작은 상자에서 +40 또는 +41을 주는데, 서버 OS에 따라 달랐음
새 서버에 접속할 때마다 어떤 OS인지 확인하는 재미가 있었음
x87에서 SSE로만 바꿔도 게임이 깨지는데, x86→ARM 변환이 어떻게 그렇게 잘 되는지 신기함
80비트 레지스터를 써서 정밀도가 높지만, 메모리에 spill될 때 정밀도를 잃는 등 이상한 동작을 보임
예전에 소프트웨어 신시사이저를 디버깅할 때도 비슷한 정밀도 버그를 겪었음
RC 회로 시뮬레이션이 0에 근접해야 상태가 바뀌는데, 특정 CPU에서는 denormal 값이 플러시되지 않아 조건을 만족하지 못했음
결국 0.7과 0.01 정도로 대충 임계값을 조정하니 모든 플랫폼에서 잘 동작했음
메타 이야기로, 트위터 클론을 만들 건데 여러 단락으로 블로깅하면 바로 밴시키는 기능을 넣을 생각임