2014-01-21 5 views
1

SDL2를 사용하기 위해 Node.JS FFI를 SDL로 업데이트했습니다. (https://github.com/Freezerburn/node-sdl/tree/sdl2) 그리고 지금까지 잘 진행되어서 너무 많은 문제없이 1600+ 컬러 텍스처를 성공적으로 렌더링 할 수 있습니다. 그러나, 난 그냥 알아낼 수없는 문제에 빠지기 시작했다. FFI, GC, Javascript의 속도 등과 관련이없는 것처럼 보인다.SDL2 - 랜덤으로 20-30 + ms (Node.JS FFI 통화에서)

문제는 내가 SDL_RenderPresent 경우에 따라 VSYNC가 활성화되어 있고 수 초마다이 통화를 완료하는 데 20-30 밀리 초가 걸립니다. 그리고이 현상이 2-3 번 연속으로 발생하는 것처럼 보입니다. 이로 인해 화면에서 움직이는 부분이 매우 단순하지만 눈에 띄지 않게됩니다. 시간이 지나면이 호출은 올바른 시간에 화면에 그려진 내용을 화면에 표시하기 위해 정상적인 시간이 걸리며 모든 것이 매우 매끄럽게 보입니다.

위에서 언급 한 저장소를 복제하면이 동작을 볼 수 있습니다. node-gyp으로 빌드 한 다음 test.js 만 실행하면됩니다. (StackOverflow에 테스트 코드를 임베드 할 수 있지만 GitHub에 전체 예제가있는 것이 더 쉬울 것이라고 생각했습니다.) SDL2_ttf, SDL2_image가/Library/Frameworks에 있어야합니다. (아직 개발 중이므로 SDL2를 자동으로 찾거나 저장소에 코드를 가져 오거나 어딘가에서 가져온 것 같은 멋진 코드는 없습니다.)

EDIT : 이것은 아마도 gamedev StackExchange 사이트를 방문해야합니다 . 그것이 움직일 수 있는지/링크되는지 알지 못한다.

답변

2

온라인에서 좀 더 많은 조사를하고 있는데, 나는 "문제"가 무엇인지 발견했습니다. 이것은 이전에 실제로 만난 적이 없었던 것입니다 (어떻게 든) 그래서 SDL을 올바르게 사용하지 않는 것이 명백한 문제라고 생각했습니다.

"지저분한"그래픽은 모든 게임이/할 수있는 문제이며, 주위를 둘러 볼 수있는 일반적인 방법이 있습니다. 기본적으로 문제는 CPU가 OS의 모든 프로세스/스레드를 완전히 병렬로 실행할 수 없다는 것입니다. 때로는 다른 것을 실행하기 위해 프로세스가 일시 중지되어야합니다. 프레임 업데이트 중에 이런 일이 발생하면 해당 프레임이 정상적으로 화면의 두 배까지 걸릴 수 있습니다. 이것이 지터가 나오는 지점입니다. 이 문제가 Unity question about a similar jitter을 읽은 후 가장 명백한 것으로 나타났습니다. 의견 작성자는 OS X에서 활동 모니터와 같은 항목을 실행하면 지터가 몇 초마다 정기적으로 발생하게 될 것이라고 지적했습니다. 활동 모니터가 실행중인 모든 프로세스를 폴링하여 정보를 수집 할 때까지의 대략 동일한 시간. 활동 모니터를 종료하면 지터가 훨씬 적게 발생합니다.

따라서 코드가 점에서 16 밀리 초마다 실행되도록 보장하는 실제 방법은 없으며 코드를 다시 실행하기 전에 항상 16 밀리 초가 걸릴 것입니다. 완벽하게 부드러운 경험을 얻기 위해 이벤트, 움직임, AI 등을 처리하는 코드의 타이밍을 새 프레임이 렌더링 될 타이밍과 분리해야합니다. 이는 일반적으로 프레임을 그리는 것보다 초당 적은 시간에 모든 논리를 실행 한 다음 모든 객체가 실제 업데이트 사이에 위치 할 것으로 예측하고 해당 위치에 객체를 그립니다. 게임 루프에 대한 전반적인 환상적인 개요에 대한 자세한 내용은 deWiTTERS game loop article을 참조하십시오.

부드러운 게임 경험을 제공하는이 예측 방법은 문제없이 제공됩니다. 그 중 하나는 실제 충돌 탐지를 수행하지 않고 예측 된 위치에 객체를 표시하는 경우 해당 객체가 몇 개의 프레임에 대해 다른 객체에 매우 쉽게 클립핑 될 수 있다는 것입니다. 퐁 클론에서 예측 된 객체 드로잉을 사용하여 SDL 바인딩을 테스트하기 위해 글을 쓰고 있습니다. 벽에 붙들고있을 때 벽을 반복적으로 벽 안으로 집어 넣으면 위치가 더 이상 예측 될 때 다시 튀어 나오기 시작합니다 허용. 이것은 다른 방식으로 다루어 져야하는 별도의 문제입니다.나는이 문제에 대해 독자들에게 알려주고있다.