글 수 83
^_^; 전 3D 엔진 코어쪽이나 asm 은 잘 알지 못하기 때문에 자세하게 설명을 해 드릴 수 없군요.
간단하게 일단 예제에서 .asm 파일을 한번 수정해 보시고 실행해 보시길 바랍니다. .asm파일을 수정하면 실행결과도 달라집니다. 즉, 프로그램이 실행될 때 .asm이 컴파일되고 로드된다는 것입니다. 함수를 실행할때마다 컴파일한다는 것이 아니라, 게임이 실행되고 게임을 초기화 할때 최적화 함수를 생성시킨다는 것입니다. 즉, raster 함수가 생성되는 시기는 프로그램이 cpu와 그래픽 카드를 체크한 후입니다. 물론 게임 진행중에는 다시 컴파일할 필요가 없죠.
이것은 상당히 많은 유연성을 제공합니다.
1) 가장 큰 장점은 무엇보다도 개발단계에서 테스트가 편리하다는 것입니다. 프로그램을 컴파일하지 않고도 .asm 만을 수정하는 것만으로도 테스트가 가능기 때문에 최적화를 요하는 부분만을 .asm 으로 작성하고 이 .asm 을 바꿔가면서 테스트하면 됩니다. 만약에 최적화된 새로운 함수를 만들려고 햇을때, cpu만 하더라도 mmx, sse, non simd 에서의 코딩을 따로 해야 되고 테스트 작업이 번거로울 수 밖에 없습니다. 하지만 runtime asm 에서는 단지 .asm 파일만 수정하면서 테스트하면 되니까 편리하죠.
이 부분에 대해서는 의문이 없으시죠?
2) 물론 SIMD 명령어 처리에 있어서는 DLL이나 LIB와 그다지 차이가 없을 것입니다. 하지만 flipcode에서 말한것처럼 mispredicted 분기는 병목을 일으키며(루프내부에서의 jump), 이런 조건을 유연성으로 어느정도 커버할 수 있으리라고 생각합니다. 가령 DLL 에서는 변수로 처리할 수 밖에 없는 것이 상수로 처리하는 것이 가능하고 조건에 대해서도 더 명확해집니다. 실제로 실행시간에 모든 조건을 체크해서 실행코드를 생성하니 코드가 명확해집니다.
가장 무식한 예일이지 모르겠지만, 가령 사용자가 화면의 크기를 조정할 수 있는 2차원 미니 게임(per pixel 횟수가 작은-_-;) 이 있다고 할때 이 화면전체를 layer1에 layer2에 블랜딩한다면 화면 크기를 조정할 때 새로운 raster 함수를 생성시킬 수 있습니다. ( .asm 파일을 실행시간에 다시 만들어내고 컴파일해서 raster함수를 교체하는 것입니다. ). loop 를 풀수도 있고(^_^;), width를 알기 때문에 index 계산도 명확합니다. 그리고 귀찮아서 inline으로 하기 싫었던 것도 쉽게 실행시간에 구현이 가능해집니다.
고급 프로그래머에게 제가 이렇게 얘기드리는게 좀 우습네요. 저는 그냥 가장 참신했던 아이디어 같아서 얘기드린건데.. 의심과 의문의 눈초리로 보시니 몸들바를 ^_^; 정말로 전 이 분야에 있어서는 초보입니다. 잘못된 부분은 잘 여과해서 읽기 바랍니다.
그래도 어셈은 고등학교때부터 했었는데, 8088 때만 하고 나중엔 손도 안되었더니 정말 많은 요즘 instruction에 질립니다.
간단하게 일단 예제에서 .asm 파일을 한번 수정해 보시고 실행해 보시길 바랍니다. .asm파일을 수정하면 실행결과도 달라집니다. 즉, 프로그램이 실행될 때 .asm이 컴파일되고 로드된다는 것입니다. 함수를 실행할때마다 컴파일한다는 것이 아니라, 게임이 실행되고 게임을 초기화 할때 최적화 함수를 생성시킨다는 것입니다. 즉, raster 함수가 생성되는 시기는 프로그램이 cpu와 그래픽 카드를 체크한 후입니다. 물론 게임 진행중에는 다시 컴파일할 필요가 없죠.
이것은 상당히 많은 유연성을 제공합니다.
1) 가장 큰 장점은 무엇보다도 개발단계에서 테스트가 편리하다는 것입니다. 프로그램을 컴파일하지 않고도 .asm 만을 수정하는 것만으로도 테스트가 가능기 때문에 최적화를 요하는 부분만을 .asm 으로 작성하고 이 .asm 을 바꿔가면서 테스트하면 됩니다. 만약에 최적화된 새로운 함수를 만들려고 햇을때, cpu만 하더라도 mmx, sse, non simd 에서의 코딩을 따로 해야 되고 테스트 작업이 번거로울 수 밖에 없습니다. 하지만 runtime asm 에서는 단지 .asm 파일만 수정하면서 테스트하면 되니까 편리하죠.
이 부분에 대해서는 의문이 없으시죠?
2) 물론 SIMD 명령어 처리에 있어서는 DLL이나 LIB와 그다지 차이가 없을 것입니다. 하지만 flipcode에서 말한것처럼 mispredicted 분기는 병목을 일으키며(루프내부에서의 jump), 이런 조건을 유연성으로 어느정도 커버할 수 있으리라고 생각합니다. 가령 DLL 에서는 변수로 처리할 수 밖에 없는 것이 상수로 처리하는 것이 가능하고 조건에 대해서도 더 명확해집니다. 실제로 실행시간에 모든 조건을 체크해서 실행코드를 생성하니 코드가 명확해집니다.
가장 무식한 예일이지 모르겠지만, 가령 사용자가 화면의 크기를 조정할 수 있는 2차원 미니 게임(per pixel 횟수가 작은-_-;) 이 있다고 할때 이 화면전체를 layer1에 layer2에 블랜딩한다면 화면 크기를 조정할 때 새로운 raster 함수를 생성시킬 수 있습니다. ( .asm 파일을 실행시간에 다시 만들어내고 컴파일해서 raster함수를 교체하는 것입니다. ). loop 를 풀수도 있고(^_^;), width를 알기 때문에 index 계산도 명확합니다. 그리고 귀찮아서 inline으로 하기 싫었던 것도 쉽게 실행시간에 구현이 가능해집니다.
고급 프로그래머에게 제가 이렇게 얘기드리는게 좀 우습네요. 저는 그냥 가장 참신했던 아이디어 같아서 얘기드린건데.. 의심과 의문의 눈초리로 보시니 몸들바를 ^_^; 정말로 전 이 분야에 있어서는 초보입니다. 잘못된 부분은 잘 여과해서 읽기 바랍니다.
그래도 어셈은 고등학교때부터 했었는데, 8088 때만 하고 나중엔 손도 안되었더니 정말 많은 요즘 instruction에 질립니다.