[python] owyl 프로젝트를 python 3 에서 실행하자

owyl : A python behavior tree for implementing fast and flexible AI

owyl은 파이썬용 행동트리 구현체다. 행동트리를 이해하는 데 시각화된 예제가 필요하여 실행해보았다. (치즈샵에서 behavior tree 로 유일하게 검색된 이유이기도 하고..) 한동안 업데이트가 없는 것을 보니 앞으로도 없을 듯 하다. 약간의 감상평을 하자면 코루틴 없이 generator 로만 코딩을 해서 그런지 복잡하더라.

python 3 에서 실행해보기 위해 진행한 것을 기록한다. python 3 전용으로 실행하기 위해 살짝 변경 해놓은 소스를 이곳1에 올려놨음. for_python_3 브랜치를 이용하면 된다.

  1. examples/boids.py 를 python 3.4.3 에서 실행하면 pyglet2을 임포트할 수 없다는 에러가 발생
    (https://bitbucket.org/pyglet/pyglet/wiki/Home)
  2. pyglet 설치하자

    pip install pyglet

  3. 다시 boids.py 를 실행하면 cocos 를 임포트할 수 없다는 에러가 발생
  4. cocos3 를 설치하자

    pip install cocos2d

  5. 다시 boids.py 를 실행하면 rabbyt 를 임포트할 수 없다는 에러가 발생
  6. rabbyt4 를 설치하자

    pip install Rabbyt

  7. 다음의 에러를 출력하고 설치 실패

    File “<string>”, line 20, in <module>
    File “C:\Users\ADMINI~1\AppData\Local\Temp\pip-build-ukorogxl\Rabbyt\setup.py”, line 17
    print “*”*80
    ^
    SyntaxError: Missing parentheses in call to ‘print’

  8. Rabbyt 가 python 3.x 를 지원안해서 설치가 안되는 것. 홈페이지5를 가보니 더 이상 개발을 종료하였고, lib2d 를 대신 만들고 있는데 Rabbyt 와 호환이 안된다고 한다. 다행하게도 Ryex 라는 사람이 Rabbyt 의 python 3 포팅을 했다.
  9. https://github.com/Ryex/Rabbyt 로 다시 설치. github 에 있는 download zip 버튼의 링크를 install 뒤에 쓰면 된다.
    pip install https://github.com/Ryex/Rabbyt/archive/master.zip
  10. 다음의 에러를 출력하고 설치 실패

    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
    File “<string>”, line 20, in <module>
    File “C:\Users\ADMINI~1\AppData\Local\Temp\pip-u1mmdmpo-build\setup.py”, line 6, in <module>
    from Cython.Distutils import build_ext
    ImportError: No module named ‘Cython’

  11. python 3 이상 버전은 cython이 필요하다. (from https://github.com/Ryex/Rabbyt )
  12. cython 설치하자

    pip install cython

  13. Ryex/Rabbyt 다시 설치

    pip install https://github.com/Ryex/Rabbyt/archive/master.zip

  14. 다음의 에러를 출력하고 설치 실패

    …위에 한참 있음 …
    File “C:\venv\for_owyl\lib\site-packages\setuptools\msvc9_support.py”, line 52, in query_vcvarsall
    return unpatched[‘query_vcvarsall’](version, *args, **kwargs)
    File “D:\Python343\Lib\distutils\msvc9compiler.py”, line 287, in query_vcvarsall
    raise ValueError(str(list(result.keys())))
    ValueError: [‘lib’, ‘path’, ‘include’]

  15. 각을 보니 windows sdk command shell 에서 진행을 해야 할 듯. 일단 나는 windows sdk 7.1 을 설치했으니 “Windows SDK 7.1 Command Prompt” 를 실행하여 다시 13을 실행 -> 설치됨
  16. examples/boids.py 를 실행하면 끝.
  1. https://github.com/kernel0/owyl.git
  2. pyglet: a cross-platform windowing and multimedia library for Python
  3. cocos : a 2D framework for games and multimedia
  4. rabbyt : A fast 2D sprite engine using OpenGL
  5. rabbyt website : http://arcticpaint.com/projects/rabbyt/

Address Space Sandbox and /LARGEADDRESSAWARE

64bit 윈도우즈, 64bit cpu, 비주얼 스튜디오 x64 빌드 환경에서 링커에 “/LARGEADDRESSAWARE” 옵션 없이 그냥 빌드를 하면 2gb 이상의 주소에 접근할 수 없다.

x64 빌드에서 귀찮게 왜 저 옵션을 설정해야 2gb 이상 주소에 접근하는 걸까 궁금했는데, windows via c/c++ 5th 보다가 찾았다. 이유는
/LARGEADDRESSAWARE 가 없는 디폴트 x64 빌드 환경에서, 32bit에서 만들었던 코드가 다른 수정 없이 (그런게 없겠냐만은 조금은 수고를 덜어주겠지.) 작동하는 것을 보장하기 위해서다.

저 옵션을 활성화하지 않으면 시스템 (예를 들어 malloc) 에서 생성하는 포인터 주소 값들이 0x 7fff ffff 이하 값만 갖는다. (이런 이유로 윈도우즈 운영체제에서 2GB로 제한 된 가용 주소 공간을 address space sandbox라고 한다.) 32bit 에서 pointer 크기를 4byte 로 단정해서 쓴 경우도 많고, 2gb만 쓰니까 4byte pointer의 MSB 1 를 자기맘대로 이용한 경우가 있어서, 32bit 이상 주소를 시스템에서 반환하면 짤라먹을 까봐 저렇게 해준 것이다.

32bit 에서 /3GB 옵션 쓸 때 /LARGEADDRESSAWARE 도 같이 해줘야 한다고 해서 그때만 쓰는 걸로 헷갈렸는데 이제 정리됨.

결론. win32, x64 상관없이 2GB 이상의 주소 접근을 원한다면 무조건 /LARGEADDRESSAWARE 을 설정할 것. (‘무조건’에 대한 내용은 아래 업데이트 내용으로 대신합니다.)

UPDATE: leafbird 님 답글을 통해 2010 이상에서는 프로젝트 프로퍼티에 아무값도 안 넣어놓더라도 x64에서 /LARGEADRESSAWARE 가 적용됨을 알게 되었습니다.
아래는 제가 아무것도 없는 빈 솔루션을 vs2010 sp1 x64 debug 에서 빌드한 실행파일을 dumpbin 에서 확인한 내용입니다.

FILE HEADER VALUES
8664 machine (x64)
7 number of sections
543E854F time date stamp Wed Oct 15 23:31:43 2014
0 file pointer to symbol table
0 number of symbols
F0 size of optional header
22 characteristics
Executable
Application can handle large (>2GB) addresses

보시는 바와 같이 /LARGEADDRESSAWARE 가 적용될 경우 마지막 문장이

  1. most significant bit

AMD Radeon 개발 비화

2010년에 이미 다른 분들 블로그를 통해서 소개가 되었지만 나는 이제 읽었다. parkoz 에서 번역된

에서 얻은 내용 정리. 참고로 RV870 은 Radeon HD 58XX, 5970 을 말한다.(Evergreen (GPU family) 의 codename cypress)
ParkPD블로그(ATI 의 Radeon HD 5870 인 RV870의 개발 비화 )에도 일부 내용이 소개되어 있음.

1. 그래픽 카드의 성수기는? : 4분기 연말 휴일 시즌이 보통이고 특별하게 최신 DirectX 버젼업이나 윈도우즈 새 버젼 발매일

2. AMD(정확하게는 그래픽부서)의 제품 개발 철학

최근 인텔에서는 제품 개발 정책을 전력 소비율 1% 증가할 때마다 성능 2% 향상시키는 것으로 바꾼 바 있다. ATI의 철학은 칩에 들어갈 기능들은 제품 출시일을 늦춰서는 안된다는 것이다.

AMD나 NVIDIA 모두 전통적으로 당시 개발조건의 한계에 가까운 단일 GPU의 플래그십 제품을 만들고 스펙다운을 시켜 주류시장의 제품들을 출시해왔다. amd는 주변 여건이나 한계에 끝까지 돌진하지 않고, 적당한 성능의 gpu를 만들고 2개의 gpu를 하나의 그래픽카드에 실는 방식을 사용했다. 빠른 시장 대응을 얻어냈다고. 조금 더 자세한 내용은 공정으로 압도하는 RV770. ATI Radeon HD 4800 시리즈를 읽어보면 된다.

3. 공정개선을 하면 수율이 올라가서 돈을 쉽게 벌 수 있겠네 했는데 그것도 아니더라. 공정이 바뀌면 웨이퍼당 단가도 같이 올라간다고.

4. ‘도약’이라는 메타포

도약(jump)라고 봐야 한다. 도약을 위해서 미리 준비를 열심히 하고, 원하는 지점에 착지하려고 안간힘을 쓰지만, 한번 발이 땅에서 떨어지게 되면 어디에 착지할지 마음대로 정할 수 없다.

5. 2015년에는 어떤 제품이 우리를 기다릴까

바로 6년 내로 최초의 홀로덱을 만드는 것이다. 최초의 홀로덱은 180도의 반원통형 디스플레이로 양방향으로 구성되어 정확한 입체 사운드를 구축하게 된다. 그리고 이 모든 것이 현실적으로 돌아가려면 강력한 그래픽 성능이 필요할 것이다. 이는 최소한 100M 픽셀의 해상도이며, 이건 30인치 모니터의 해상도의 25배나 되는 수치이다.

줄거리를 요약하지 않았다. 실제 내용은 매우 흥미진진함. 🙂