사용자 삽입 이미지


GCGC 정리 & 후기

1. ConquerX2는 어떻게 개발되었는가(코딩부터 창업까지)
발표자 : 송지종 나노인터렉티브 공동대표

09년 8월 : 서버프로그래머, 클라이언트 프로그래머 두명이 의기투합

창업에 필요한 5가지 요소

            
     /                \
아이템         신뢰(=사람)
    \                /
   **의지 -- 실력

의지 > 신뢰 > 아이템 > 실력 > 돈

돈 : 1~2년 정도 아무것도 안해도 버틸수 있을 정도. 극단적으로 없어도 됨(투자 받으면 되니까. 단, 아이템이 확실해야함)

의지 : 뛰어난 실력을 지닌 사람이라도 의지가 없으면 안됨.
물론 의지만 있는것도 곤란하지만 But! 실력 < 의지.

아이템 : 게임 디자인에 새로운 것은 없다.
환경의 변화에 따른 이해 및 접목
송지종님의 경우 => 웹게임.

09년 8월 ~ 10년 봄 : 기획 10여개, 프로토타입 5개 개발 => 전부 실패! (재미 없음..)
10년 여름 : 부족전쟁에서 모티브 -> CX2 아이디어 발견

점점 방대해지는 기획
. 신의 입장
. 아무거나 할 수 있다 = 독
. 해야되는것 / 해서는 안되는것 구분 X
. 초기 기획이 방대해져서 우주 부족전쟁 타이쿤 심시티 시뮬레이션 게임이 되어버림.

기획의 축소
. 무엇을 버릴지 판단이 중요!
=> 기획중에는 게임이 재미있는지 알 수 없다.
. 기획자는 치트쓰는 유저 --(돈을 쉽게 늘린다거나..)--> 기획자 스스로의 함정에 빠짐.
. 고난의 생략 => 밸런스 붕괴 => 판단미스
  고난 = 재미

SVN 1000 커밋 : 게임다워지기 시작
게임답다의 수준 정의
. 상호작용 & 결과의 피드백
. 기능의 피드백 가능
. 하루 3회 커밋 기준으로 1년이 걸림.

11년 봄 : UI 완전교체
리뉴얼과 UI기획
. 상호작용의 핵심 : 유저 인터페이스
. 10번의 리뉴얼
. UI는 게임이 보여줄수 있는 모든것

현재 클베, 오베를 거쳐 상용 서비스 중.
포털과 퍼블리시 제휴 계약중..

다양한 의견과 충돌
. 우리는 매일 싸운다.
. 수평적인 토론 및 합의
. 누구든지 틀릴 수 있다.
. 한명의 독단적 진행은 실패의 가능성이 높다.

게임 == 물을 담는 그릇.
유저 == 물.
구멍이 있으면 그릇은 쓸모가 없다.
투박하고 못생긴 질그릇이라도 그릇의 역할을 다하는 것이 중요하다.
그릇을 만들기 위해서는 내부기획의 치밀한 토론이 필요하다.

책임자라면 가져야 될 자세
. 의견수렴
. 수평적 분위기 조성
. 강압적 의사결정 X
. 행동보다는 생각이 필요.
. 바보같은 의견도 무시하지 말자.
. 틀린 의견의 존중 (틀렸다고 생각하는 본인도 틀림)
. 실패한 내용도 기록, 보관

기타
. 저축을 많이 하자
. 클베할 생각이 없었는데 오유에 글이 올라오자 엄청난 방문자 발생 -> 서버 안죽게 하려고 고생함
. 초반 많은 신규유저가 발생했는데 현재는 안정화.. 포탈과의 제휴를 통해 또 한번의 신규유저 증가를 노리고 있음.
. 포털과 제휴 계약 중 상용화 직전 단계에서 계약을 했으면 "신규 상용화" 타이틀을 걸고 홍보를 할 수 있어서 더 좋았을텐데 아쉽다는 말을 들었다고 함.
. 게임 크레딧의 외국이름들은 정식 직원들이 아님.
웹에서 멋진 그림을 발견 -> 원작자에게 게임에서 사용해도 되냐고 이메일 보냄 -> 수락받으면 사용.. 이때 로열티는 나중에 유명해지면 주겠다고 얘기했다고 하네요 ㅎㅎㅎ;;


2. 인디 개발자로 아이폰 게임 개발 및 이야기들(개발 프로세스, 북미 경험)
발표자 : 문기영[ProgC] 전 EA Canada AI, Animation 프로그래머(FIFA 09~12 개발)

발표 앞부분은 아이폰 게임 개발 준비사항등에 관한 이야기입니다.
한마디로 정리하면 xcode는 똥이다!

자체 게임 엔진 개발을 혼자서 다하고 있음. 능력자 ㄷㄷㄷ
라이브러리를 사용할 땐 믿을만한 라이브러리를 사용하자.
예) XML 모듈 제작시 RapidXML 사용했었는데 XML 파일 크기가 커지자 멋대로 xml 파싱을 건너뛰는 버그가 있었음 -> TinyXML 로 변경하고 해결

10여년 남짓 게임을 개발해본 경험으로 본 재밌는 게임 만드는 방법
=> 재밌을때까지 만든다!
주) Progc님은 빠른 프로토 타이핑을 통해 여러가지 시도를 해보고 있었습니다.

FE(=UI)의 중요성
한국의 경우 FE개발을 신입에게 맡김. 하지만 '제대로 된' FE를 만들긴 어려움.
단순히 버튼을 만들더라도 마우스가 오버되면 버튼이 떨린다거나
클릭시 파티클효과를 주는 등 많은 시도를 해볼것.

In-House툴의 활용
자유도를 프로그래머에게 제한하면 게임의 퀄리티도 프로그래머에게 제한된다.
Sprite 편집을 xml에서 직접 좌표를 적고, 애니메이션 등을 프로그래머가 제작하게 하면
능률도 떨어지고 결코 만족할만한 퀄리티의 결과물이 나오지 않음.
Progc님은 자체 제작한 스프라이트 툴에서 스프라이트 편집, VFS를 이용한 Asset 관리, 애니메이션 등을 해결하고 있음.
툴을 직접 보니 애니메이션 편집UI는 플래시의 방식을 많이 참고한듯. 현재 가장 대중적인 애니메이션 툴 = 플래시. 플래시의 방식이 디자이너가 사용하기 편함.

Fancy하되 완성은 하자.
과거와 달리 현재는 게임 제작에 관한 여러가지 정보가 공개되어 있음.
하지만 완성작은 오히려 줄어들음.. 처음부터 여러가지 개발이론을 도입하려다 보면 지쳐떨어짐.
과거 고등학생이 만든 게임 바이너리가 커뮤니티에 공개되서 좋은 반응을 받은적이 있었는데
공개된 소스 코드를 보니 모든 코드가 main.cpp 단 하나의 파일안에 들어있었음..

야근 많이 한다고 게임 잘 만드는게 아니다.
프로그래밍은 공장의 생산직이 아님. 시간 투자 != 결과물.
머리가 지쳐서 안되는건 아무리 해도 안됨. 편히 쉬는게 오히려 문제해결에 도움이 된다.

업무중 딴짓(게임,인터넷..)하지 말자.
한국에서 업무경험을 보면 보통 늦은 오전에 출근해서 인터넷이나 채팅등으로 시간을 보내고
오후~밤에 업무를 보는 경향이 있음. 업무시간에 집중해서 일하는것이 중요.

EA 이야기
. 연봉은 기본 한국의 두배라고 생각하면 됨. 하지만 세금도 두배... 세금으로 우리나라 1년 연봉쯤 냈다고 함;
. 10시 출근 5시반 퇴근.
. 회사 앞에 축구장이 있는데 날씨 좋으면 점심먹고 축구 한게임씩 한다고 함.
축구 끝나고 나면 퇴근시간인데 야근같은거 안하고 그냥 퇴근..
Progc님이 만든 회사에서도 한달에 한번은 그냥 쉰다고 함.
. No Mercy. 정리해고를 무섭게 한다. Progc님 출근 첫날에 400명이 정리해고되었다고 함.
방법은 그냥 아침에 와보면 아무도 없음.. 당사자한텐 너 정리해고 되었으니 나가라고 함;;
메일/컴퓨터 정리 이런거 회사에서 알아서 하니 이상한거 받지 말라고 ㅋ;;
. 팀장 외에 개발스케쥴 관리하는 사람이 따로 있음.
DD(Develop Director?? 잘 기억이 안나네요;)라고 하는데 일주일 일정인 일이 있다고 하면 4일쯤 되는날 와서 어느정도 개발이 되었는지 혹은 지연될거 같은지 체크.
지연될거 같다고 하면 일단 알았다고 한다음 팀장과 DD가 회의를 거쳐 계속 개발을 하거나 기능을 빼거나 해서 일정을 조율..
DD는 전부 여자라고 함; 남자가 하면 개발자와 싸움;; Progc님도 여자 DD가 X일까지 할 수 있어? 라고 물어봤을때 사실 힘들지만 OK라고 했던적이 있다고...ㅎㅎㅎ
. 한 게임 개발하는데 보통 50명이 넘는 인원이 투입. 각 팀도 국제적으로 흩어져 있어서 소스관리 프로그램을 이용하지 않으면 개발을 할 수 없다;
버그 트래킹 프로그램으로 QA와 의사소통에 1일 걸린다고 한다. 왜냐하면 QA팀이 아르헨티나에 있음 ㅎㅎ;;

기타
발표시간 초과로 QnA 없이 끝났음.. 아쉬었움.


==========================================================

많은 생각이 들게하는 발표들이었다.

몇가지 비공개로 말해준 개발비화들도 흥미로웠고..

Progc님 발표는 시간에 쫓겨서 QnA 없이 끝난게 조금 아쉽다.

2012/03/29 12:34 2012/03/29 12:34

지난글에서 만들었던 libirrlicht.a를 이용해서 안드로이드 irrlicht 프로젝트를 만드는 과정을 정리한다.

0. 먼저 이클립스에서 Android 프로젝트를 하나 생성한다. 이름같은건 적당히 지어주고, 사용 SDK 버전은 8이상으로 해줘야 한다(irrlicht 빌드할때 사용한 버전과 맞추는게 좋다)

사용자 삽입 이미지


1. 지난글에서 사용했던 프로젝트를 재활용할 것이다.(새로 예제 만들긴 귀찮...;;;) 다음 소스들을 프로젝트 폴더로 복사해온다. 복사할때는 그냥 탐색기로 해당 폴더로 이동한 다음 드래그&드롭으로 이클립스 프로젝트에 떨구고 대화상자에서 copy를 선택하면 된다.
 
 . irrlicht 폴더의 include 폴더를 복사해온다.
 . jni폴더를 생성하고 irrlicht/jni 폴더안의 다음 파일들을 복사해온다.
  - android-activity.cpp
    : JNI 함수 이름들을 변경해야 한다. 정석대로라면 javah로 생성하는게 맞는거겠지만.. 그냥 find&replace로 바꿔버리겠다.
함수이름의 앞부분이 "Java_com_ellismarkov_irrlicht_" 이런식으로 되있을텐데 본인이 생성한 프로젝트의 패키지 이름으로 변경하면 된다. 예를들어 패키지 이름이 kr.newbie.irrlichtTest 라면
Java_kr_newbie_irrlichtTest_ 라고 변경하면 된다.
     nativeInitGL 함수에서 createDevice 함수를 호출하는 부분을 보면 irrlicht 엔진을 OpenGL ES2로 생성하게 되어있는데 ES1으로 바꾸자(irrlicht를 ES1으로만 컴파일 해놔서리... ㅡㅅㅡ;;)
  - android-receiver.cpp
  - android-receiver.h
  - app-android.cpp
    : app-android.cpp 파일의 앞부분에서 다음 네 라인을 찾아서 주석처리하고,
#include <android-logger.h>
#include <importgl.h>
#include <os.h>
using namespace os;
      line. 161의
Printer::Logger = new CAndroidLogger();
      이 부분도 주석처리한다.

  . src 폴더에 IrrlichtGLView.java, IrrlichtTest.java, Utils.java 파일을 복사해온다.

2. src 폴더에 java 파일들을 복사해넣으면 아마 에러가 뜰 것이다. 소스 제일 앞부분의 package를 새로 만든 프로젝트의 패키지 이름과 맞춰준다. 패키지 이름을 잊었다면 AndroidManifest.xml 파일을 참고.

3. 새로생성된 프로젝트의 액티비티는 사용하지 않을 것인다. AndroidManifest.xml 파일을 열어서

<activity android:name=".IrrlichtTestActivity"
                  android:label="@string/app_name">

   android:name <- 이부분의 값을 .IrrlichtTest로 바꾸자.

4. irrlicht/obj/local.armeabi 폴더에 가면 libirrlicht.a 파일이 있다. jni 폴더로 복사해온다.

5. 중요한걸 하나 뻬먹었다. irrlicht/jni폴더의 Android.mk 파일도 복사해온다. ㅋㅋ;
   그리고 Android.mk 파일을 다음과 같이 수정한다.

#
# COSOperator.cpp was removed from IRROTHEROBJ
LOCAL_PATH := $(call my-dir)
#
# 1. Load Static library (.a)
#
include $(CLEAR_VARS)
LOCAL_MODULE := static_irrlicht
LOCAL_SRC_FILES = ./libirrlicht.a
include $(PREBUILT_STATIC_LIBRARY)
#
# 2. Build Shared library (.so)
#
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := static_irrlicht
ANDROID = android-activity.cpp android-receiver.cpp app-android.cpp
LOCAL_MODULE := irrlicht
LOCAL_ARM_MODE   := arm
LOCAL_CFLAGS := -O3 -DANDROID_NDK -I./../include/
LOCAL_SRC_FILES := $(ANDROID)
LOCAL_LDLIBS := -ldl -llog -lGLESv1_CM -lGLESv2
include $(BUILD_SHARED_LIBRARY)


6. cygwin 에서 jni 폴더로 이동한 다음에 ndk-build 커맨드를 실행한다.

7. 이클립스 패키지 익스플로러를 새로고침하면 obj 폴더가 추가된것이 보일것이다. F11키를 눌러서 Debug Run을 실행시키면 짜잔~! 열심히 뛰고 있는 시드니가 보인다 ^0^/

사용자 삽입 이미지


2011/12/04 21:50 2011/12/04 21:50

JNI를 이용하면 C++로 작성된 irrlicht 엔진을 Android 플랫폼에서도 돌아가게 할 수 있다.

인터넷 검색 및 삽질(-_-)끝에 알아낸 것들을 정리해둔다.

--------------------------------------------------------------

1. 프로그램 및 SDK 준비
 . Cygwin 설치
  - http://www.cygwin.com/
  - 설치시 git 플러그인을 같이 설치하는게 좋다.
    git를 이용해서 android로 포팅된 irrlicht 엔진 소스를 얻어오는데
    외부 프로그램으로 하려면 좀 귀찮아서... ㅡ,.ㅡ;
 . JDK 설치
  - http://www.oracle.com/technetwork/java/javase/downloads/index.html
 . Android SDK 설치
  - http://developer.android.com/sdk/index.html
 . Android NDK 설치
  - http://developer.android.com/sdk/ndk/index.html
  - NDK 설치 후 설치 경로를 시스템 환경변수 PATH에 추가시키자. 나중에 커맨드 칠때 편하다;

2. Android Irrlcht 소스 받기
 . Cygwin을 실행시킨 후 소스를 받을 디렉토리로 이동 후에 다음 커맨드를 입력한다.

git clone git://gitorious.org/irrlichtandroid/irrlichtandroid.git

 좀 기다리면 irrlichtandroid란 폴더에 소스가 다운받아져 있을 것이다.


3. Static Library로 빌드
 . irrlichtandroid/project/include/IrrCompileConfig.h 파일을 열어서 102번째 줄의 선언문을 다음같이 변경한다.

//++ ellis ++ // ANDROID NDK CAUSES TO BE HERE
//++ ellis ++ #define _IRR_POSIX_API_
//++ ellis ++ #define _IRR_COMPILE_WITH_X11_DEVICE_
//++ ellis ++ // Three lines added for android
#define _IRR_ANDROID_PLATEFORM_
#define _IRR_COMPILE_WITH_ANDROID_DEVICE_
#define _IRR_COMPILE_WITH_OGLES1_
// #define _IRR_COMPILE_WITH_OGLES2_  // <- 주석처리!
#define _DEBUG

  - OpenGL ES1 이나 ES2중 하나만 선택해야 빌드가 될텐데 일단 ES1으로 선택한다.
    (나중에 CreateDevice 함수로 Irrlicht Device를 만들때도 이때 선택한 그래픽옵션으로 만들어야 한다)

. irrlichtandroid/project/jni/Android.mk 파일을 다음과 같이 수정한다.

#
# COSOperator.cpp was removed from IRROTHEROBJ
LOCAL_PATH := $(call my-dir)
#
# 1. Build Static library (.a)
#
include $(CLEAR_VARS)
IRRMESHLOADER = CBSPMeshFileLoader.cpp CMD2MeshFileLoader.cpp CMD3MeshFileLoader.cpp CMS3DMeshFileLoader.cpp CB3DMeshFileLoader.cpp C3DSMeshFileLoader.cpp COgreMeshFileLoader.cpp COBJMeshFileLoader.cpp CColladaFileLoader.cpp CCSMLoader.cpp CDMFLoader.cpp CLMTSMeshFileLoader.cpp CMY3DMeshFileLoader.cpp COCTLoader.cpp CXMeshFileLoader.cpp CIrrMeshFileLoader.cpp CSTLMeshFileLoader.cpp CLWOMeshFileLoader.cpp CPLYMeshFileLoader.cpp
IRRMESHWRITER = CColladaMeshWriter.cpp CIrrMeshWriter.cpp CSTLMeshWriter.cpp COBJMeshWriter.cpp CPLYMeshWriter.cpp
IRRMESHOBJ = $(IRRMESHLOADER) $(IRRMESHWRITER) CSkinnedMesh.cpp CBoneSceneNode.cpp CMeshSceneNode.cpp CAnimatedMeshSceneNode.cpp CAnimatedMeshMD2.cpp CAnimatedMeshMD3.cpp CQ3LevelMesh.cpp CQuake3ShaderSceneNode.cpp
IRROBJ = CBillboardSceneNode.cpp CCameraSceneNode.cpp CDummyTransformationSceneNode.cpp CEmptySceneNode.cpp CGeometryCreator.cpp CLightSceneNode.cpp CMeshManipulator.cpp CMetaTriangleSelector.cpp COctreeSceneNode.cpp COctreeTriangleSelector.cpp CSceneCollisionManager.cpp CSceneManager.cpp CShadowVolumeSceneNode.cpp CSkyBoxSceneNode.cpp CSkyDomeSceneNode.cpp CTerrainSceneNode.cpp CTerrainTriangleSelector.cpp CVolumeLightSceneNode.cpp CCubeSceneNode.cpp CSphereSceneNode.cpp CTextSceneNode.cpp CTriangleBBSelector.cpp CTriangleSelector.cpp CWaterSurfaceSceneNode.cpp CMeshCache.cpp CDefaultSceneNodeAnimatorFactory.cpp CDefaultSceneNodeFactory.cpp
IRRPARTICLEOBJ = CParticleAnimatedMeshSceneNodeEmitter.cpp CParticleBoxEmitter.cpp CParticleCylinderEmitter.cpp CParticleMeshEmitter.cpp CParticlePointEmitter.cpp CParticleRingEmitter.cpp CParticleSphereEmitter.cpp CParticleAttractionAffector.cpp CParticleFadeOutAffector.cpp CParticleGravityAffector.cpp CParticleRotationAffector.cpp CParticleSystemSceneNode.cpp CParticleScaleAffector.cpp
IRRANIMOBJ = CSceneNodeAnimatorCameraFPS.cpp CSceneNodeAnimatorCameraMaya.cpp CSceneNodeAnimatorCollisionResponse.cpp CSceneNodeAnimatorDelete.cpp CSceneNodeAnimatorFlyCircle.cpp CSceneNodeAnimatorFlyStraight.cpp CSceneNodeAnimatorFollowSpline.cpp CSceneNodeAnimatorRotation.cpp CSceneNodeAnimatorTexture.cpp
IRRDRVROBJ = CNullDriver.cpp COGLESDriver.cpp COGLESTexture.cpp COGLESExtensionHandler.cpp
IRRDRVOBJ2 = COGLES2Driver.cpp COGLES2FixedPipelineShader.cpp COGLES2ParallaxMapRenderer.cpp COGLES2SLMaterialRenderer.cpp COGLES2ExtensionHandler.cpp COGLES2NormalMapRenderer.cpp COGLES2Renderer2D.cpp COGLES2Texture.cpp
IRRIMAGEOBJ = CColorConverter.cpp CImage.cpp CImageLoaderBMP.cpp CImageLoaderJPG.cpp CImageLoaderPCX.cpp CImageLoaderPNG.cpp CImageLoaderPSD.cpp CImageLoaderTGA.cpp CImageLoaderPPM.cpp CImageLoaderWAL.cpp CImageLoaderRGB.cpp CImageWriterBMP.cpp CImageWriterJPG.cpp CImageWriterPCX.cpp CImageWriterPNG.cpp CImageWriterPPM.cpp CImageWriterPSD.cpp CImageWriterTGA.cpp
IRRVIDEOOBJ = CVideoModeList.cpp CFPSCounter.cpp $(IRRDRVROBJ) $(IRRIMAGEOBJ)
IRRSWRENDEROBJ = CSoftwareDriver.cpp CSoftwareTexture.cpp CTRFlat.cpp CTRFlatWire.cpp CTRGouraud.cpp CTRGouraudWire.cpp CTRTextureFlat.cpp CTRTextureFlatWire.cpp CTRTextureGouraud.cpp CTRTextureGouraudAdd.cpp CTRTextureGouraudNoZ.cpp CTRTextureGouraudWire.cpp CZBuffer.cpp CTRTextureGouraudVertexAlpha2.cpp CTRTextureGouraudNoZ2.cpp CTRTextureLightMap2_M2.cpp CTRTextureLightMap2_M4.cpp CTRTextureLightMap2_M1.cpp CSoftwareDriver2.cpp CSoftwareTexture2.cpp CTRTextureGouraud2.cpp CTRGouraud2.cpp CTRGouraudAlpha2.cpp CTRGouraudAlphaNoZ2.cpp CTRTextureDetailMap2.cpp CTRTextureGouraudAdd2.cpp CTRTextureGouraudAddNoZ2.cpp CTRTextureWire2.cpp CTRTextureLightMap2_Add.cpp CTRTextureLightMapGouraud2_M4.cpp IBurningShader.cpp CTRTextureBlend.cpp CTRTextureGouraudAlpha.cpp CTRTextureGouraudAlphaNoZ.cpp CDepthBuffer.cpp CBurningShader_Raster_Reference.cpp
IRRIOOBJ = CFileList.cpp CFileSystem.cpp CLimitReadFile.cpp CMemoryFile.cpp CReadFile.cpp CWriteFile.cpp CXMLReader.cpp CXMLWriter.cpp CZipReader.cpp CPakReader.cpp CNPKReader.cpp CTarReader.cpp CMountPointReader.cpp irrXML.cpp CAttributes.cpp lzma/LzmaDec.c
IRROTHEROBJ = CIrrDeviceConsole.cpp CIrrDeviceStub.cpp CLogger.cpp Irrlicht.cpp os.cpp
IRRGUIOBJ = CGUIButton.cpp CGUICheckBox.cpp CGUIComboBox.cpp CGUIContextMenu.cpp CGUIEditBox.cpp CGUIEnvironment.cpp CGUIFileOpenDialog.cpp CGUIFont.cpp CGUIImage.cpp CGUIInOutFader.cpp CGUIListBox.cpp CGUIMenu.cpp CGUIMeshViewer.cpp CGUIMessageBox.cpp CGUIModalScreen.cpp CGUIScrollBar.cpp CGUISpinBox.cpp CGUISkin.cpp CGUIStaticText.cpp CGUITabControl.cpp CGUITable.cpp CGUIToolBar.cpp CGUIWindow.cpp CGUIColorSelectDialog.cpp CDefaultGUIElementFactory.cpp CGUISpriteBank.cpp CGUIImageList.cpp CGUITreeView.cpp
ZLIBOBJ = zlib/adler32.c zlib/compress.c zlib/crc32.c zlib/deflate.c zlib/inffast.c zlib/inflate.c zlib/inftrees.c zlib/trees.c zlib/uncompr.c zlib/zutil.c
JPEGLIBOBJ = jpeglib/jcapimin.c jpeglib/jcapistd.c jpeglib/jccoefct.c jpeglib/jccolor.c jpeglib/jcdctmgr.c jpeglib/jchuff.c jpeglib/jcinit.c jpeglib/jcmainct.c jpeglib/jcmarker.c jpeglib/jcmaster.c jpeglib/jcomapi.c jpeglib/jcparam.c jpeglib/jcprepct.c jpeglib/jcsample.c jpeglib/jctrans.c jpeglib/jdapimin.c jpeglib/jdapistd.c jpeglib/jdatadst.c jpeglib/jdatasrc.c jpeglib/jdcoefct.c jpeglib/jdcolor.c jpeglib/jddctmgr.c jpeglib/jdhuff.c jpeglib/jdinput.c jpeglib/jdmainct.c jpeglib/jdmarker.c jpeglib/jdmaster.c jpeglib/jdmerge.c jpeglib/jdpostct.c jpeglib/jdsample.c jpeglib/jdtrans.c jpeglib/jerror.c jpeglib/jfdctflt.c jpeglib/jfdctfst.c jpeglib/jfdctint.c jpeglib/jidctflt.c jpeglib/jidctfst.c jpeglib/jidctint.c jpeglib/jmemmgr.c jpeglib/jmemnobs.c jpeglib/jquant1.c jpeglib/jquant2.c jpeglib/jutils.c jpeglib/jcarith.c jpeglib/jdarith.c jpeglib/jaricom.c
LIBPNGOBJ = libpng/png.c libpng/pngerror.c libpng/pngget.c libpng/pngmem.c libpng/pngpread.c libpng/pngread.c libpng/pngrio.c libpng/pngrtran.c libpng/pngrutil.c libpng/pngset.c libpng/pngtrans.c libpng/pngwio.c libpng/pngwrite.c libpng/pngwtran.c libpng/pngwutil.c
LIBAESGM = aesGladman/aescrypt.cpp aesGladman/aeskey.cpp aesGladman/aestab.cpp aesGladman/fileenc.cpp aesGladman/hmac.cpp aesGladman/prng.cpp aesGladman/pwd2key.cpp aesGladman/sha1.cpp aesGladman/sha2.cpp
BZIP2OBJ = bzip2/blocksort.c bzip2/huffman.c bzip2/crctable.c bzip2/randtable.c bzip2/bzcompress.c bzip2/decompress.c bzip2/bzlib.c
ANDROID = importgl.cpp CIrrDeviceAndroid.cpp
LOCAL_MODULE := irrlicht
LOCAL_ARM_MODE   := arm
LOCAL_CFLAGS := -O3 -DANDROID_NDK -DDISABLE_IMPORTGL -I./../include/ -I./include/
LOCAL_SRC_FILES := \
     $(ANDROID) \
     $(IRRVIDEOOBJ) $(IRRDRVOBJ2) \
     $(IRRMESHOBJ) $(IRROBJ) $(IRRPARTICLEOBJ) $(IRRANIMOBJ) \
     $(IRRSWRENDEROBJ) $(IRRIOOBJ) $(IRROTHEROBJ) \
     $(IRRGUIOBJ) $(ZLIBOBJ) $(JPEGLIBOBJ) $(LIBPNGOBJ) $(LIBAESGM) \
     $(BZIP2OBJ)
LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lGLESv2
include $(BUILD_STATIC_LIBRARY)
#
# 2. Build Shared library (.so)
#
include $(CLEAR_VARS)
LOCAL_MODULE    := fakeIrrlicht
LOCAL_STATIC_LIBRARIES := irrlicht
include $(BUILD_SHARED_LIBRARY)

 . irrlichtandroid/project/jni 폴더로 이동한 후 ndk로 빌드하면 .a 파일이 생성!

ndk-bulid --jobs <CPU 코어수>

  - 멀티코어를 이용해서 빌드하면 빌드속도가 꽤 많이 단축되니 꼭 멀티코어 빌드로 하자.
    다만, 멀티코어 빌드시 별 이유없이 실패할 때가 있는데 그땐 그냥 obj 폴더를 지우고
    다시 빌드하면 된다. (아마도 버그인듯;)
 
 . 빌드가 성공하면 irrlichtandroid/project/obj/local/armeabi 폴더에 libirrlicht.a 파일이 생성되있을것이다.
   같이 생성된 so파일(libfakeIrrlicht.so)는 사용하지 않으니 무시할 것! (어차피 빈 껍데기 ㅋ)
 
 . irrlicht 프로젝트에서 사용하는 방법은 다음글에 계속.. 

2011/11/20 21:57 2011/11/20 21:57