이것이 뭐냐하면 퀘이크 3 소스코드에 있는 함수다
정확히는
를 계산하는 함수인데, 광원 효과에 쓰이는 함수라서 굉장히 빨라야 한다
중요한 건 느리면 60 프레임을 못맞추고, 빨라도 값의 정확하지 않으면 빛이 이상하게 표현된다
나눗셈이랑 제곱근을 쓰는 방법은 정확한 대신 리소스도 많이 필요하고 줜나 느려서 60프레임을 못맞춘다
그래서 퀘이크 3 개발진은 저런 함수를 만들어
를 빠르고 정확하게 계산했다
일단 보면 주석에 왓더뻑이라고 적힌 것처럼 씨1발 이게 뭐야 어캐 하는건데 싶어진다
그래도 하나 하나 뜯어보면 이해가 되긴 된다
우선 맨 앞에 변수의 자료형 두 개가 나온다
long은 숫자를 이진법으로 00000000 00000000 00000000 00000000으로 표시한다
long형에서 특별히 봐야할 건 없으니 넘어가자
float은 소숫점을 포함한 실수를 0 00000000 00000000000000000000000으로 표현한다
첫 자리는 부호를 나타낸다
0이면 양수 또는 0, 1이면 음수를 뜻한다
뒤의 8자리는 지수(2E)를 나타낸다
E = -127를 00000000으로 하고 E = +128을 11111111로 사용한다
마지막 23자리는 가수부(M)를 나타낸다
이진법으로 1.00000000000000000000000부터 1.11111111111111111111111까지 소숫점을 나타내는 데 사용한다
float형을 수식으로 표현하면 이런 꼴이 된다
뜬금없이 나온 뮤(μ)는 log2의 근사값을 구하는 데 쓰인 숫자다
1보다 작은 x에 대해
인데 적당한 수를 더하면(
) 전반적인 정확도를 높일 수 있다
실험적으로 찾아낸 적절한 값은 μ≒0.0430357이다
참고: https://en.wikipedia.org/wiki/Fast_inverse_square_root#Aliasing_to_an_integer_as_an_approximate_logarithm
그런데 float형의 비트값은 E*223 + M 꼴의 형태가 되는 것을 알고 있다
(여기서 음수는 생각하지 않는다)
앞에서 구한 로그값이랑 비교하여 생각해보면 float형의 비트값을 그대로 하나의 정수로 생각하면 이 정수는 원래 값에 log2를 취한 것과 같다고 생각할 수 있다
변수 정의 뒤에 나오는 i = * ( long * ) &y; 가 바로 float형으로 받은 비트값을 그대로 숫자로 받는 줄인 것이다
어찌저찌하여 중간까지는 왔는데 그 다음 줄이 문제다
앞서
였고
를 구해야 하는데, 로그의 특성에 따라
가 된다!
그리고 이진수에서 오른쪽으로 비트를 이동(bit shift)하면 2로 나눈 것과 같은 효과를 얻는다
예를 들어 110(10진법으로 6)을 오른쪽으로 비트 이동시키면 11(10진법으로 3)이 된다
111(10진법으로 7)도 11(10진법으로 3)이 되는 문제가 있지만 어쩔 수 없이 받아들여야 한다
오른쪽으로 비트 이동이 >>니까 -0.5i는 -(i >> 1)이 된다
그러면 저 0x5f3759df(=1597463040)는 대체 뭔 수일까?
실제로 구해야 하는 해
를 감마(Γ)라고 하면 i와 Γ의 관계는 다음과 같다
정리하면,
값을 계산하면, 3/2 * 223 * (127-μ) = 1597488309.57 ≒1597463040 = 0x5f3759df
그렇다, 오차를 보정하는 값이 바로 저 0x5f3759df였던 거다!
값을 다 구했으니 구한 값을 float형으로 되돌리고 → y = * (float *) &i;
f(x) = 0을 정확하게 구할 때 쓰는 뉴턴-랩슨법을 이용해 정확도를 높여주면 → y = y * (threehalfs - (x2 * y * y));
그리하여 나눗셈도, 제곱근 계산도 없이 포인트 참조, 비트 이동, 뺄셈, 그리고 곱하기만 가지고 빠르고 비교적 정확하게
를 구할 수 있었다!
수정1: 오타랑 수식 잘못 집어넣은 부분 정정














(IP보기클릭)121.128.***.***
하 이게 프로그래밍이지 ㅋㅋㅋ 최적화하려면 저 정도 수준까지 알아야하는구나
(IP보기클릭)1.240.***.***
그러니까 저거 복사해서 쓰면되는거지?
(IP보기클릭)112.173.***.***
저래서 수학 고인물이 필요하댔나
(IP보기클릭)49.142.***.***
압도적인 성능을 기반으로 처리능력이 딸리면 구린 컴퓨터 쓰는 유저탓을 함
(IP보기클릭)1.240.***.***
완벽하게 이해했어
(IP보기클릭)119.202.***.***
ㅁㅊ 이게됨?
(IP보기클릭)61.45.***.***
요샌 그냥 컴파일러가 알아서 저런 코드로 바꿔줌. 저런 거 하느라 생산성 낭비하느니 그냥 다른 코드 한줄을 추상적으로 더 짜고 최적화는 대부분 컴파일러한테 떠넘기면 됨. 오히려 어줍잖게 최적화한다고 깝치면 컴파일러 최적화가 제대로 안 돌아서 더 느릴수도 있음
(IP보기클릭)223.38.***.***
허용범위 내의 오차가 있지만 그대신 무지막지하게 연산이 줄어드는 기법들 보다보면 전 그냥 ㅂㅅ이구나 라는것만 느끼게 됬죠. 대학 과목중에 이게 있어서 3개월은 ㅂㅅ된 기분이었는데
(IP보기클릭)220.71.***.***
https://ko.wikipedia.org/wiki/%EA%B3%A0%EC%86%8D_%EC%97%AD_%EC%A0%9C%EA%B3%B1%EA%B7%BC "이 알고리즘은 1990년대 초에 실리콘 그래픽스에서 개발한 것으로 추정되며, 1999년에 퀘이크 3 아레나의 소스 코드에 쓰인 것이 가장 유명하다." 카맥이 만든게 아님. "이 알고리즘은 뉴턴의 방법을 사용하여 비교적 정확한 결과를 만들어 내지만, 소수점의 손실 때문에 부정확하고 1999년부터 도입된 x86 SSE의 rsqrtss에 비해 훨씬 느리다." 요새는 FPU가 더 빠르고 정확해서 안 씀
(IP보기클릭)114.202.***.***
https://youtu.be/DEqXNfs_HhY 이런거 보면 수학하시는 분들 존경스러움
(IP보기클릭)119.202.***.***
ㅁㅊ 이게됨?
(IP보기클릭)1.240.***.***
완벽하게 이해했어
(IP보기클릭)1.240.***.***
야황 육손
그러니까 저거 복사해서 쓰면되는거지? | 21.02.25 17:31 | | |
(IP보기클릭)121.128.***.***
ㅔ | 21.02.25 17:32 | | |
(IP보기클릭)112.173.***.***
저래서 수학 고인물이 필요하댔나
(IP보기클릭)121.128.***.***
하 이게 프로그래밍이지 ㅋㅋㅋ 최적화하려면 저 정도 수준까지 알아야하는구나
(IP보기클릭)49.142.***.***
(IP보기클릭)223.63.***.***
간케
맞음. Q3 코드도 카멕형이함 | 21.02.25 17:39 | | |
(IP보기클릭)223.63.***.***
참고로 저거 99년 게임이고 C로 짜진 엔진이다. | 21.02.25 17:39 | | |
(IP보기클릭)106.247.***.***
역시 과메기형 | 21.02.25 17:47 | | |
(IP보기클릭)211.248.***.***
ㄷㄷ 역시 128류 개발자 | 21.02.25 17:56 | | |
(IP보기클릭)106.102.***.***
간케
개발은 혼자 다 하면 되니 사람 숫자 늘려서 의사소통에 시간 낭비하면 안된다고 하던 양반이니 직접 다 했겠지 | 21.02.25 17:42 | | |
(IP보기클릭)223.38.***.***
그래서 주석에 시X 저기 머꼬? 라는게 적혀있잖음ㅋㅋㅋㅋㅋ | 21.02.25 17:48 | | |
(IP보기클릭)106.102.***.***
주석 단 사람 심정 ㅋㅋㅋㅋ | 21.02.25 17:50 | | |
(IP보기클릭)223.38.***.***
ㅋㅋㅋㅋㅋㅋ | 21.02.25 17:52 | | |
(IP보기클릭)39.7.***.***
간케
존 카멕이 둠 3에 들어간 광원효과도 직접 다 코딩했음 | 21.02.25 17:47 | | |
(IP보기클릭)106.102.***.***
(IP보기클릭)223.38.***.***
수학자보다는 개발자가 수학적 사고와 친숙하고 컴퓨터의 구조를 잘알아야 한다는 거에 가까움 | 21.02.25 18:16 | | |
(IP보기클릭)223.38.***.***
허용범위 내의 오차가 있지만 그대신 무지막지하게 연산이 줄어드는 기법들 보다보면 전 그냥 ㅂㅅ이구나 라는것만 느끼게 됬죠. 대학 과목중에 이게 있어서 3개월은 ㅂㅅ된 기분이었는데
(IP보기클릭)39.7.***.***
(IP보기클릭)223.63.***.***
(IP보기클릭)106.102.***.***
이드 개발진 = 존카멕 공식은 레이지때까지 거의 유효했음.. 개발은 나 혼자 다 하면 된다던 사람이라.. | 21.02.25 17:43 | | |
(IP보기클릭)223.63.***.***
그럿타. 둠3 엔진 만들때 C++로 처음 넘어간 양반일 정도로 효율을 되게 따진모양 | 21.02.25 17:44 | | |
(IP보기클릭)220.78.***.***
(IP보기클릭)218.154.***.***
(IP보기클릭)221.156.***.***
(IP보기클릭)106.101.***.***
(IP보기클릭)49.142.***.***
V_solves_everything
압도적인 성능을 기반으로 처리능력이 딸리면 구린 컴퓨터 쓰는 유저탓을 함 | 21.02.25 17:41 | | |
(IP보기클릭)118.32.***.***
요즘은 하드웨어가 좋아서 대부분 최적화 필요없음 | 21.02.25 17:41 | | |
(IP보기클릭)61.45.***.***
V_solves_everything
요샌 그냥 컴파일러가 알아서 저런 코드로 바꿔줌. 저런 거 하느라 생산성 낭비하느니 그냥 다른 코드 한줄을 추상적으로 더 짜고 최적화는 대부분 컴파일러한테 떠넘기면 됨. 오히려 어줍잖게 최적화한다고 깝치면 컴파일러 최적화가 제대로 안 돌아서 더 느릴수도 있음 | 21.02.25 17:43 | | |
(IP보기클릭)58.238.***.***
이게 맞말이지 이젠 그냥 루트쓰면됨 퀘이크3는 1999년대 게임이니까 그런거지 | 21.02.25 17:46 | | |
(IP보기클릭)221.145.***.***
지금은 극한환경에서 동작할 임베디드 머신 만들게 아니라면 저런 방법을 쓸 이유가 없어졌어 | 21.02.25 18:06 | | |
삭제된 댓글입니다.
(IP보기클릭)118.32.***.***
Na?!
게임 개발 안할거면 수학 필요없는게 맞음 | 21.02.25 17:42 | | |
(IP보기클릭)124.49.***.***
??? | 21.02.25 17:42 | | |
(IP보기클릭)14.6.***.***
아주 틀린 말은 아니지 | 21.02.25 17:46 | | |
(IP보기클릭)58.238.***.***
이제 하드웨어 좋아져서 게임이나 임베디드 아니면 굳이 수학잘할 필요없는게 맞긴함 | 21.02.25 17:49 | | |
(IP보기클릭)121.169.***.***
다른 프로그래밍은 수학 안쓸것 같지? 요새 유행하는 인공 지능만 해도 수식 덩어리이고, DB도 수학 기반이고.. 하나못해 반복문 돌리는것도 기초적인 산수 필요함 | 21.02.25 17:54 | | |
(IP보기클릭)124.56.***.***
생각보다 게임 말고도 수학이 많이 들어가는 분야는 많아요. | 21.02.25 18:15 | | |
(IP보기클릭)59.6.***.***
게임 개발을 안 할 거면 수학이 필요없다라기보단, 게임 개발이 그만큼 프로그래밍 중에서도 가장 어려운 축에 속한다고 보면 정확함. '나도 게임 만들어보고 싶어' 라는 건 '나도 초정밀 뇌수술 한 번 해 보고 싶어' 같은 말과 비슷하다고 보면 될 듯? | 22.09.05 18:24 | | |
(IP보기클릭)121.134.***.***
Na?!
나도 개발로 밥벌어 먹고 산지 10년정도 됐는데 수학쪽이 약해서 어디가서 개발자라고 얘기 안함. 그냥 개잡부 입니다. 이렇게 얘기하지 | 21.02.25 17:43 | | |
(IP보기클릭)119.66.***.***
Na?!
프로그래밍은 그런이야기 잘 안나오지. 처음 발 담글때부터 닥치고 수학이라 것보다 기획에서 많이나옴. 그림못그리고 프로그래밍 못하는데 게임개발 하고싶은애들이 많다 | 21.02.25 17:52 | | |
(IP보기클릭)106.101.***.***
(IP보기클릭)121.169.***.***
(IP보기클릭)121.132.***.***
(IP보기클릭)182.225.***.***
(IP보기클릭)223.62.***.***
(IP보기클릭)124.49.***.***
(IP보기클릭)39.7.***.***
(IP보기클릭)39.118.***.***
(IP보기클릭)222.114.***.***
(IP보기클릭)175.126.***.***
(IP보기클릭)121.149.***.***
(IP보기클릭)112.109.***.***
(IP보기클릭)118.46.***.***
(IP보기클릭)211.225.***.***
(IP보기클릭)112.109.***.***
(IP보기클릭)118.235.***.***
(IP보기클릭)61.84.***.***
당연히 실생활에서는 그다지 필요 없음. 프로그래머나 공학 직업 가진 사람에게 필요하지....ㅋㅎㅎㅎ | 22.04.05 17:14 | | |
(IP보기클릭)118.235.***.***
직업이 공학쪽이라서..... | 22.04.05 17:16 | | |
(IP보기클릭)61.84.***.***
ㅠㅠ 왜 공부 안했어 | 22.04.05 17:19 | | |
(IP보기클릭)219.254.***.***
(IP보기클릭)58.140.***.***
(IP보기클릭)211.177.***.***
(IP보기클릭)219.248.***.***
(IP보기클릭)14.32.***.***
(IP보기클릭)1.238.***.***
(IP보기클릭)121.164.***.***
(IP보기클릭)211.244.***.***
(IP보기클릭)119.66.***.***
(IP보기클릭)114.202.***.***
https://youtu.be/DEqXNfs_HhY 이런거 보면 수학하시는 분들 존경스러움
(IP보기클릭)175.126.***.***
(IP보기클릭)223.38.***.***
(IP보기클릭)220.126.***.***
(IP보기클릭)59.28.***.***
(IP보기클릭)124.58.***.***
(IP보기클릭)220.71.***.***
https://ko.wikipedia.org/wiki/%EA%B3%A0%EC%86%8D_%EC%97%AD_%EC%A0%9C%EA%B3%B1%EA%B7%BC "이 알고리즘은 1990년대 초에 실리콘 그래픽스에서 개발한 것으로 추정되며, 1999년에 퀘이크 3 아레나의 소스 코드에 쓰인 것이 가장 유명하다." 카맥이 만든게 아님. "이 알고리즘은 뉴턴의 방법을 사용하여 비교적 정확한 결과를 만들어 내지만, 소수점의 손실 때문에 부정확하고 1999년부터 도입된 x86 SSE의 rsqrtss에 비해 훨씬 느리다." 요새는 FPU가 더 빠르고 정확해서 안 씀
(IP보기클릭)223.62.***.***
카맥이 쓴건 저 왓더 뻑 이라는 주석이라는 소리 카멕도 다져다 복 붙했.... | 21.02.25 18:30 | | |
(IP보기클릭)112.169.***.***
(IP보기클릭)126.194.***.***
ㄴㄴ 라이브러리화 되어있으니 불러오기 하면 됨 | 21.02.25 17:54 | | |
(IP보기클릭)112.169.***.***
매생이굴국밥
컴파일러가 최적화 까지 다해준다니 개쩐다 | 21.02.25 17:58 | | |
(IP보기클릭)61.39.***.***
(IP보기클릭)1.245.***.***
| 21.02.25 17:53 | | |
(IP보기클릭)211.36.***.***
(IP보기클릭)112.169.***.***
컴퓨터에게 수학을 노가다 시켜서 풀게 하냐 아니면 수식을 간단화해서 풀게 하냐의 차이같네 | 21.02.25 17:56 | | |
(IP보기클릭)119.205.***.***
(IP보기클릭)182.172.***.***
(IP보기클릭)182.209.***.***
(IP보기클릭)121.176.***.***
(IP보기클릭)220.121.***.***
(IP보기클릭)112.169.***.***
(IP보기클릭)115.93.***.***
(IP보기클릭)182.219.***.***
(IP보기클릭)223.38.***.***
(IP보기클릭)39.113.***.***
(IP보기클릭)117.111.***.***
(IP보기클릭)182.209.***.***
(IP보기클릭)203.81.***.***
(IP보기클릭)39.113.***.***
저란건 api 개발 같은 로우레벨 언어 쓰는 개발자들이 신경써야 할 부분이지 일반적인 클라이언트 개발하는 하이레벨 언어 쓰는 사람이 신경 쓸 부분이 아님. 하이레벨 개발자들은 저런식으로 만들면 오히려 욕처먹음. 유지보수 거지같이 만든다고. | 21.02.25 18:12 | | |
(IP보기클릭)39.113.***.***
무엇보다도 어줍잖게 저런거 따라해봐야 전문적으로 api 개발하는 사람들이 만들어 놓은 성능 절대 못따라감. | 21.02.25 18:13 | | |
(IP보기클릭)122.43.***.***