yuchi's Development Home
글 수 401
1. ATI GPU에 최적화되어있다 또는 nVidia GPU에 최적화되어있다.
3D프로그래밍을 10년넘게 했지만 어떻게 하면 GPU에 특화된 코드를 짤 수 있는지 잘 모르겠습니다.
D3D나 openGL과 같은 공통 API를 사용하기 때문에 딱히 어느 하드웨어에 맞춰서 작업하지도, 할 수 도 없습니다.
물론 하드웨어와 드라이버의 특성상 경우에 따른 퍼포먼스 차이가 있습니다.
퍼포먼스 차이는 있지만 인위적으로 특정 GPU에서 더 빠르게 작동하도록 만들기가 어렵다는 것입니다.
8년전에 제가 만든 엔진의 경우 nVidia쪽이 훨씬 빨랐습니다. 적어도 2배이상.
당시엔 GPU스키닝이 일반화되지 않았고 쉐이더 1.0도 사용할 수 없는 그래픽카드들이 대부분이었기 때문에 CPU로 스키닝을 처리했고 완료된 결과는 비디오메모리에 락을 걸어서 전송했습니다. 텍스쳐 uv애니메이션, 버텍스 애니메이션도 마찬가지였죠.
확실히...8년이 지난 지금도 마찬가지입니다면 락을 걸게 되면 ATI장비에서 심각하게 퍼포먼스가 떨어집니다. 제가 보기엔 하드웨어적인 특성보다 드라이버의 캐쉬 전략이 더 큰 영향을 미치지 않나 추측해봅니다만 왜 그런진 확실히 모르죠.
개인적으로 nVidia를 선호하고 몇 번의 경험 때문에 ATI를 싫어하게 되어서 현재 개발중인 게임도 nVidia에 최적화하고 싶었습니다만, 위에서 언급했다시피 딱히 어느 GPU에 맞춰 최적화할 방법이 없습니다.
nv칩에서만 지원하는 하드웨어 쉐도우맵 기능을 사용합니다만 그마저도 ATI4850부터는 동일하게 지원합니다. 같은 API를 사용하는 이상 특정 GPU에 맞춰서 뭘 할 수가 없습니다. (쉐이더 1.4라든가 2_a는 논외로 칩니다)
지금 만들어쓰고 있는 엔진은 렌더링중 락을 전혀 걸지 않습니다. 대부분의 자원도 최대한 비디오메모리에 올려버립니다.
그래서인지 ATI장비에서 아주 약간 더 빠릅니다만, 이거야 nVidia, ATI, MS 모두 권장하는 퍼포먼스 향상의 기본 지침이지 어느 장비에 최적화하는 비법은 아닙니다.
굳이 ATI장비에서 느리게 작동하게 하고 싶다면 락을 많이 걸면 됩니다.
최적화 논란에 대해서 결론을 내리자면 게임개발사에서 특정 gpu에 맞춰 게임을 최적화하는게 아니고 GPU업체에서 게임에 맞춰 최적화한다고 보는게 맞습니다.
드라이버가 업데이트될때마다 릴리즈 노트를 보면 '어느 게임에서 몇 %만큼 성능 향상이 있다.'는 내용이 대부분이죠.
제가 알고 있는 선에선 nVidia또는 ATI와의 관계 때문에 일부러 테스트를 해가며 특정 업체의 GPU에서 일부러 빠르게 동작하도록 노력하는 개발사는 없습니다.
2. 이 게임은 하드웨어를 손상시킨다.
예전에 c9이 nv8800계열 그래픽칩을 손상시킨다는 기사가 돌았었는데요. 최근에 스타크래프트2가 하드웨어를 손상시킨다는 기사가 떴더군요.
위에서 언급했다시피 게임을 개발할때 하드웨어를 직접 제어할 수 없습니다.
게임 소프트 -> D3D또는 OpenGL -> Driver ->GPU
이와같은 단계로 GPU를 제어하는 것이죠.
어플리케이션단에서 할 수 있는거라곤 드라이버에서 실패를 리턴할때까지 비디오메모리에 있는대로 텍스쳐를 올리거나, 최대한 GPU가 바쁘도록 자주, 많은 양의 버텍스 스트림을 때려넣어서 Draw함수를 호출하는는 정도입니다.
하지만 GPU를 설계할땐 어차피 최대부하를 가정하기 때문에 일을 많이 시킨다고 하드웨어가 손상되는 것은 말이 안됩니다. 그렇다면 하드웨어 버그죠.
특정 GPU에 버그가 있고 그 버그를 발동시키는 트리거를 게임 어플리케이션에서 제공할 가능성도 없지 않습니다만, 이 경우도 하드웨어 버그입니다.
혹자는 다른 게임은 안그런데 왜 이 게임만 이러냐? 라고 반문하실지도 모르겠습니다.
렌더링함수를 호출해서 GPU에 일 시키고나면 CPU는 GPU가 작업을 완료할때까지 대기합니다. 반대로 CPU가 렌더링 함수를 호출하기 전까지 GPU는 대기합니다. GPU가 대기하는 시간이 길면 발열이 낮아지고 GPU대기시간이 짧을수록 발열이 높아집니다.
즉 CPU에서의 작업시간이 길어지면 GPU 부담이 적어집니다. GPU활용률이 낮아지죠. 발열도 적습니다.
GPU를 태워먹는다는 구설수에 휘말리는 게임들은 CPU에서의 작업시간이 길지 않아서 GPU활용률이 높다고 볼 수 있습니다. 어찌 보면 좋은 것이죠. GPU가 노는 일 없이 화면에 아름다운 그래픽을 뿌려주기 위해 적극적으로 작동하고 있으니까요. 프레임 레이트가 올라가든지 화면이 아름다워지든지 둘중 하나는 해줍니다.
'GPU에 무리를 주지 않는 게임은 느리거나 그래픽이 나쁘고 GPU에 무리를 주는 게임은 프레임이 잘 나오거나 그래픽이 좋다'라는 말도 안되는 소릴 하려는게 아닙니다.
GPU대기시간을 줄일수록 GPU발열이 높아진다는것입니다. 잠재적으로 모든 3D어플리케이션들은 고발열에 의한 GPU손상을 야기시킬 가능성을 가지고있는 것입니다.
게임이 GPU를 혹사시켜서 GPU가 고장난다면 사실 해결책은 간단합니다. GPU클럭을 낮추거나 대용량의 쿨러를 설치하면 됩니다.
업체에서 GPU에 보호회로를 내장해서 일정 온도 이상 올라가면 시스템이 멈추게 해주면 좋겠는데 요새 그렇게 나오는지는 잘 모르겠습니다.
기본적으로 오버클럭이 전혀 되어있지 않은 레퍼런스대로의 그래픽 카드라면 거의 문제가 될 일이 없다고 생각합니다만, 요새는 많은 그래픽카드 벤더들이 조금씩 오버클럭킹을 해서 제품을 내놓기 때문에 게임에서의 적극적 GPU활용으로 인한 손상이 있을 수는 있습니다.
물론 이 경우도 소프트웨어의 버그는 아닙니다.
블리자드에서 어떤 공식입장을 밝힐지 모르겠습니다만, 제 예상으로 개발팀안에선 '별..미친..."이러고 있을거고 마케팅,홍보 부서에선 '내부에서 대안을 찾고있다'라고 하겠죠.
뭐 진짜 기술적으로 뾰족한 수가 없습니다. 소프트 버그가 아니거든요. 30프레임 나오던 게임을 15프레임으로 낮추고 중간에 한프레임씩 gpu를 쉬게 해주면 아마 절대 GPU가 고장날 일은 없겠지요. 하지만 어느 유져가 이런 류의 패치를 원하겠습니까?
좌우간 디바이스의 임계치를 넘기면 홀라당 맛이 갈 수 있는거고 그 선이 어느 정도인지 게임소프트웨어 개발사에선 알 수 없습니다.
그러니까요. 그런 기사에 휘말려서 게임업체를 까지 말자는 얘기였습니다.
제가 개발중인 게임 GPU활용률이 95%이상인데 나중에 GPU태워먹는 게임이란 소리 들을까봐 미리 적어봅니다.
--------------------------------------------------------------------
한달쯤 전에 네이버 블로그에 썼던 글인데 홈피에는 올리지 않아서 늦게나마 홈피에도 업데이트합니다.
3D프로그래밍을 10년넘게 했지만 어떻게 하면 GPU에 특화된 코드를 짤 수 있는지 잘 모르겠습니다.
D3D나 openGL과 같은 공통 API를 사용하기 때문에 딱히 어느 하드웨어에 맞춰서 작업하지도, 할 수 도 없습니다.
물론 하드웨어와 드라이버의 특성상 경우에 따른 퍼포먼스 차이가 있습니다.
퍼포먼스 차이는 있지만 인위적으로 특정 GPU에서 더 빠르게 작동하도록 만들기가 어렵다는 것입니다.
8년전에 제가 만든 엔진의 경우 nVidia쪽이 훨씬 빨랐습니다. 적어도 2배이상.
당시엔 GPU스키닝이 일반화되지 않았고 쉐이더 1.0도 사용할 수 없는 그래픽카드들이 대부분이었기 때문에 CPU로 스키닝을 처리했고 완료된 결과는 비디오메모리에 락을 걸어서 전송했습니다. 텍스쳐 uv애니메이션, 버텍스 애니메이션도 마찬가지였죠.
확실히...8년이 지난 지금도 마찬가지입니다면 락을 걸게 되면 ATI장비에서 심각하게 퍼포먼스가 떨어집니다. 제가 보기엔 하드웨어적인 특성보다 드라이버의 캐쉬 전략이 더 큰 영향을 미치지 않나 추측해봅니다만 왜 그런진 확실히 모르죠.
개인적으로 nVidia를 선호하고 몇 번의 경험 때문에 ATI를 싫어하게 되어서 현재 개발중인 게임도 nVidia에 최적화하고 싶었습니다만, 위에서 언급했다시피 딱히 어느 GPU에 맞춰 최적화할 방법이 없습니다.
nv칩에서만 지원하는 하드웨어 쉐도우맵 기능을 사용합니다만 그마저도 ATI4850부터는 동일하게 지원합니다. 같은 API를 사용하는 이상 특정 GPU에 맞춰서 뭘 할 수가 없습니다. (쉐이더 1.4라든가 2_a는 논외로 칩니다)
지금 만들어쓰고 있는 엔진은 렌더링중 락을 전혀 걸지 않습니다. 대부분의 자원도 최대한 비디오메모리에 올려버립니다.
그래서인지 ATI장비에서 아주 약간 더 빠릅니다만, 이거야 nVidia, ATI, MS 모두 권장하는 퍼포먼스 향상의 기본 지침이지 어느 장비에 최적화하는 비법은 아닙니다.
굳이 ATI장비에서 느리게 작동하게 하고 싶다면 락을 많이 걸면 됩니다.
최적화 논란에 대해서 결론을 내리자면 게임개발사에서 특정 gpu에 맞춰 게임을 최적화하는게 아니고 GPU업체에서 게임에 맞춰 최적화한다고 보는게 맞습니다.
드라이버가 업데이트될때마다 릴리즈 노트를 보면 '어느 게임에서 몇 %만큼 성능 향상이 있다.'는 내용이 대부분이죠.
제가 알고 있는 선에선 nVidia또는 ATI와의 관계 때문에 일부러 테스트를 해가며 특정 업체의 GPU에서 일부러 빠르게 동작하도록 노력하는 개발사는 없습니다.
2. 이 게임은 하드웨어를 손상시킨다.
예전에 c9이 nv8800계열 그래픽칩을 손상시킨다는 기사가 돌았었는데요. 최근에 스타크래프트2가 하드웨어를 손상시킨다는 기사가 떴더군요.
위에서 언급했다시피 게임을 개발할때 하드웨어를 직접 제어할 수 없습니다.
게임 소프트 -> D3D또는 OpenGL -> Driver ->GPU
이와같은 단계로 GPU를 제어하는 것이죠.
어플리케이션단에서 할 수 있는거라곤 드라이버에서 실패를 리턴할때까지 비디오메모리에 있는대로 텍스쳐를 올리거나, 최대한 GPU가 바쁘도록 자주, 많은 양의 버텍스 스트림을 때려넣어서 Draw함수를 호출하는는 정도입니다.
하지만 GPU를 설계할땐 어차피 최대부하를 가정하기 때문에 일을 많이 시킨다고 하드웨어가 손상되는 것은 말이 안됩니다. 그렇다면 하드웨어 버그죠.
특정 GPU에 버그가 있고 그 버그를 발동시키는 트리거를 게임 어플리케이션에서 제공할 가능성도 없지 않습니다만, 이 경우도 하드웨어 버그입니다.
혹자는 다른 게임은 안그런데 왜 이 게임만 이러냐? 라고 반문하실지도 모르겠습니다.
렌더링함수를 호출해서 GPU에 일 시키고나면 CPU는 GPU가 작업을 완료할때까지 대기합니다. 반대로 CPU가 렌더링 함수를 호출하기 전까지 GPU는 대기합니다. GPU가 대기하는 시간이 길면 발열이 낮아지고 GPU대기시간이 짧을수록 발열이 높아집니다.
즉 CPU에서의 작업시간이 길어지면 GPU 부담이 적어집니다. GPU활용률이 낮아지죠. 발열도 적습니다.
GPU를 태워먹는다는 구설수에 휘말리는 게임들은 CPU에서의 작업시간이 길지 않아서 GPU활용률이 높다고 볼 수 있습니다. 어찌 보면 좋은 것이죠. GPU가 노는 일 없이 화면에 아름다운 그래픽을 뿌려주기 위해 적극적으로 작동하고 있으니까요. 프레임 레이트가 올라가든지 화면이 아름다워지든지 둘중 하나는 해줍니다.
'GPU에 무리를 주지 않는 게임은 느리거나 그래픽이 나쁘고 GPU에 무리를 주는 게임은 프레임이 잘 나오거나 그래픽이 좋다'라는 말도 안되는 소릴 하려는게 아닙니다.
GPU대기시간을 줄일수록 GPU발열이 높아진다는것입니다. 잠재적으로 모든 3D어플리케이션들은 고발열에 의한 GPU손상을 야기시킬 가능성을 가지고있는 것입니다.
게임이 GPU를 혹사시켜서 GPU가 고장난다면 사실 해결책은 간단합니다. GPU클럭을 낮추거나 대용량의 쿨러를 설치하면 됩니다.
업체에서 GPU에 보호회로를 내장해서 일정 온도 이상 올라가면 시스템이 멈추게 해주면 좋겠는데 요새 그렇게 나오는지는 잘 모르겠습니다.
기본적으로 오버클럭이 전혀 되어있지 않은 레퍼런스대로의 그래픽 카드라면 거의 문제가 될 일이 없다고 생각합니다만, 요새는 많은 그래픽카드 벤더들이 조금씩 오버클럭킹을 해서 제품을 내놓기 때문에 게임에서의 적극적 GPU활용으로 인한 손상이 있을 수는 있습니다.
물론 이 경우도 소프트웨어의 버그는 아닙니다.
블리자드에서 어떤 공식입장을 밝힐지 모르겠습니다만, 제 예상으로 개발팀안에선 '별..미친..."이러고 있을거고 마케팅,홍보 부서에선 '내부에서 대안을 찾고있다'라고 하겠죠.
뭐 진짜 기술적으로 뾰족한 수가 없습니다. 소프트 버그가 아니거든요. 30프레임 나오던 게임을 15프레임으로 낮추고 중간에 한프레임씩 gpu를 쉬게 해주면 아마 절대 GPU가 고장날 일은 없겠지요. 하지만 어느 유져가 이런 류의 패치를 원하겠습니까?
좌우간 디바이스의 임계치를 넘기면 홀라당 맛이 갈 수 있는거고 그 선이 어느 정도인지 게임소프트웨어 개발사에선 알 수 없습니다.
그러니까요. 그런 기사에 휘말려서 게임업체를 까지 말자는 얘기였습니다.
제가 개발중인 게임 GPU활용률이 95%이상인데 나중에 GPU태워먹는 게임이란 소리 들을까봐 미리 적어봅니다.
--------------------------------------------------------------------
한달쯤 전에 네이버 블로그에 썼던 글인데 홈피에는 올리지 않아서 늦게나마 홈피에도 업데이트합니다.
그럼 나름 최적화? ㅎㅎㅎ