• Save
KGC2010 배현직 게임 엔진 api 디자인을 잘 하려면
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

KGC2010 배현직 게임 엔진 api 디자인을 잘 하려면

  • 1,192 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,192
On Slideshare
1,192
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 게임 엔진 API디자인을 잘 하기 배현직 ㈜넷텐션
  • 2. YESNO
  • 3. YESNO
  • 4. GUI = Graphic User InterfaceAPI = Application Programming InterfaceGUI = 게이머가 다룸API = 개발자가 다룸 결국 API는 사람이 쓰는 것이다!
  • 5. 기본 중의 기본
  • 6. MyEngine/File.h class CFile { Open(); Close(); }
  • 7. MyEngine/File.h namespace MyEngine { class CFile { Open(); Close(); } }
  • 8. MyEngine/LivingOne.h namespace MyEngine { class Animal { void Push(Vector amount); } }
  • 9. MyEngine/MovableEntity.h namespace MyEngine { class MovableEntity { void AddVelocity(Vector newValue); } }
  • 10. DirectPlay
  • 11. Microsoft.Xna.Framework.Net
  • 12. MyEngine/MyEngine.h #include <boost/cstdint.hpp> #include <ace/containers.h> #include “c:/goodsoundengine/sound.h” …
  • 13. MyEngine/MyEngine.h #include “../../otherlib/boost/cstdint.hpp” #include “../../otherlib/ace/containers.h” #include “../../otherlib/goodsoundengine/sound.h” …
  • 14. MyEngine/MyEngine.h #include <d3dx9.h> #include “../../otherlib/boost/cstdint.hpp” #include “../../otherlib/ace/containers.h” #include “../../otherlib/goodsoundengine/sound.h” …
  • 15. MyEngine/MyEngine.h #include “../../otherlib/directx/d3dx9.h” #include “../../otherlib/boost/cstdint.hpp” #include “../../otherlib/ace/containers.h” #include “../../otherlib/goodsoundengine/sound.h” …
  • 16. MyEngine/MyEngine.h #include “../../otherlib/directx/d3dx9.h” #include “../../otherlib/boost/cstdint.hpp” #include “../../otherlib/ace/containers.h” #include “../../otherlib/goodsoundengine/sound.h” …
  • 17. src/MyEngine_internal.h #include “../../otherlib/directx/d3dx9.h” #include “../../otherlib/boost/cstdint.hpp” #include “../../otherlib/ace/containers.h” #include “../../otherlib/goodsoundengine/sound.h” …
  • 18. 유연성 VS 용이성
  • 19. MyEngine/Renderer.h class Renderer { BeginScene(…); BeginStateBlock(…); CreateIndexBuffer(…); CreateTexture(…); SetStreamSource(…); … 그리고 수백개가 넘는 아주 유연한 메서드 }
  • 20. MyEngine/Renderer.h class Renderer { IDirect3DDevice9* GetDevice(); …; }
  • 21. MyGame/MainLoop.cpp#include “../MyEngine/Engine.h”void main(){ MyEngine::Main main; MyEngine::A a = main.CreateA(); MyEngine::B b = a.DoBad(main, a); MyEngine::C c = b.DoWorse(main.x,main.y,main.z,a.app,c.something); MyEngine::D d = c.GoToHell(d, a.key.feed.data[200].bIsGood, dynamic_cast<X*>(c.something.getValue());
  • 22. MyGame/MainLoop.cpp#include “../MyEngine/Engine.h”void main(){ MyEngine::SomeFrequentUsageFrameworkmain; main.StraightGoToHell(); Façade Pattern
  • 23. VeryComplexFoo(int index, string name, int indexAfter, Node* parent, int *outErrorCode, float* outBlahblah);
  • 24. FooParameter p;p.index=…;p.name=…;p.indexAfter =…;p.parent =…;VeryComplexFoo(p);Use(p.outErrorCode);Use(p.outBlahblah);
  • 25. SetIndex(…);SetName(…);SetIndexAfter(…);SetParent(…);VeryComplexFoo();Use(GetErrorCode());Use(GetBlahblah());
  • 26. 직관성
  • 27. 클래스 구조도 클래스 구조를 이해하기 위해 알 아야 하는 디자인 패턴들
  • 28. <거의 없음>클래스 구조도 클래스 구조를 이해하기 위해 알 아야 하는 디자인 패턴들
  • 29. 안정성
  • 30. SoundDevice* dev = new SoundDevice();SoundSource* beer = new SoundSource(dev,”beer.wav”);SoundChannel* pChannel = dev->GetFreeSoundChannel();if(pChannel!=NULL) pChannel->PlaySound(beer,pChannel);delete beer; // CRASH! pChannel이 사용중이닷!
  • 31. SoundDevice* dev = new SoundDevice();SoundSource* beer = new SoundSource(dev,”beer.wav”);int freeChannelNumber = dev->GetFreeSoundChannel();dev->PlaySound(beer,freeChannelNumber);delete beer; // 안젂. 사운드도 덩달아 잘 스톱됨.
  • 32. /* 사운드 장치 초기화건 파일 로딩이건 플레이건 해제건 뭐건 알아서다 해줍니다. 님은 그냥 이 한줄만 기억하시면 돼요 */PlaySound(“beer.wav”);Sleep(1초);PlaySound(“beer.wav”);Sleep(1초);PlaySound(“beer.wav”);Sleep(1초);PlaySound(“beer.wav”);Sleep(1초);PlaySound(“beer.wav”);
  • 33. PlaySound(“beer.wav”);// (comment by jack)// 소리가 안난다! 왜 안나는지 모르겠다!
  • 34. if(!PlaySound(“beer.wav”)){ ErrorInfo e = GetLastError(); Print(e.GetSource()); Print(e.GetDescription());}
  • 35. 하위 호환성
  • 36. • Ver 1 • Foo(int a)• Ver 2 • Foo(float a,int b)• Ver 3 • Foo(float a,int b,string c)
  • 37. • Ver 1 class FooParameter • Foo(FooParameter s) {• Ver 2 • Foo(FooParameter s) a; // ver 1• Ver 3 b; // ver 2에서 추가 • Foo(FooParameter s) c; // ver 3에서 추가 }
  • 38. • Ver 1 • 릴리즈 노트 없음 • FooParameter { a }• Ver 2 • FooParameter { a,b }• Ver 3 • FooParameter { a,b,c }
  • 39. • Ver 1 • 매 버전마다 릴리즈 노트 • FooParameter { a } • Ver 2• Ver 2 • FooParameter에 b가 추 • FooParameter { a,b } 가되었습니다.• Ver 3 • Ver 3 • FooParameter { a,b,c } • FooParameter에 c가 추 가되었습니다. • 저희는 API를 웬만하면 변경하 지 않기 위해 최선을 다합니다. 귀사의 협조에 짂심으로 감사드 리며, 릴리즈 노트를 잘 읽어보지 않다가 생 기는 문제 갖고 우리 좀 달달 볶지 마세요
  • 40. 성능 VS. 편의성
  • 41. byte data[10000];int length = MyResource.CanReadBytes(myFile);if(length>10000){ ….} else { MyResource.ReadBytes(data, myFile, length);} ReadBytes가 초당 10,000회 이상 호출될 일이 거의 없다면
  • 42. ByteArray ret;ret = MyResource.ReadBytes(myFile);
  • 43. 특정 프로그래밍 언어에서의고려사항들
  • 44. C/C++• 입력 젂용 파라메터이면 const를 써야• 가장 널리 쓰인 네이밍 규칙을 따라야• smart pointer를 엔짂 API에서 노출시 thread safety 를 고려해야 • 심지어 사용자가 사고칠 수 있음• STL, boost 등 얶어 스펙을 사용하는 엔짂 API는 정말 정말 정말 고려해야 • Visual Studio 20xx (그리고 서비스팩) 버젂이 달라져도 호홖 성 사라짐
  • 45. C#, Javaclass TheDelegate inherits MyEngine.SomeDelegate{ override OnSomeEvent() { … }}MyEngine.SomeModule x = new …;x.SetDelegate(new TheDelegate);
  • 46. C#, JavaTheSomeEvent(){ …}MyEngine.SomeModule x = new …;x.SomeEvent += TheSomeEvent;
  • 47. API 디자인만이 젂부는 아니다게임 엔진 사용자를 위하는 철학
  • 48. 쓰기 쉽게 해줘라
  • 49. 재미있게 쓰게 해줘라• 툴은 강한 첫인상• 갂단한 GUI• 점프 스타트를 위한 • 튜토리얼 • 샘플 복잡함에도 불구하고 이제는 많은 그래픽 디 자이너들에게 매우 칚숙한 GUI (3dsmax)
  • 50. 쓰다가 짜증날 일이 없도록 해줘라[사용법 변경 사항입니다. 중요 사항이므로 반드시 확인 바랍니다.]* AfterRmiInvocation, BeforeRmiInvocation의 파라메터 타입이 변경됐습니다. 이들 메서드는 이제 더 많은 정보를 제공합니다.* CNetServer.EnableNagleAlgorithm 메서드가 삭제되었습니다. 대신, CNetServer.Start의 입력 인자에서 Nagle Algorithm 을 제어할 수 있습니다.* INetCoreEvent.OnException의 인자 타입이 여러개였으나, 이제 하나로 통합되었습니다. INetCoreEvent.OnException(Proud.Exception&) 만이 유일한 오버라이드 대상이며 다른 오버라이드는 제거해 주시기 바랍니다.[새로운 기능]* ProudClr에 Proud.ByteArray에 대한 marshaler method들이 추가됐습니다.* 클라이얶트-서버갂 핑보다 P2P 핑이 훨씬 큰 경우 강제로 릴레이 통신을 할 수 있는 기능이 추가되었습니다.( 자세한 것은 RmiContext.m_forceBypassThresholdRatio를 참고하십시오. )* 피어에서 직접 상대 피어의 프레임레이트를 얻어 오는 기능이 추가됐습니다. 자세한 것은 CNetClient.GetPeerInfo를 참고하십시오.* 릴레이 메시징을 안해버리는 기능이 추가됐습니다. P2P 파일 배포 앱 개발시 유용합니다. RmiContext.m_allowBypassSend 도움말을 참고하십시오.[일반 업데이트]* 일부 샘플 프로젝트 .sln들이 더블 클릭으로 열 수 없던 문제가 해결됐습니다.* 샘플 프로그램에서 오류 핸들러가 더 가시화되도록 보강되었습니다.* 사용자 정의 루틴과 무관한 스레드에서 catch(...)가 실행됨으로 인해 오류가 조기에 발견되지 못하는 잠재적 문제를 해결하였습니다.* P2P 연결 맺음/해제를 자주 발생시킬 경우 인터넷 공유기 내 포트 매핑 정보가 과다 발생을 예방하는 기능이 추가됐습니다.* LAN client의 적은 확률의 메모리 긁는 문제를 해결하였습니다.* 여러 개의 랜카드가 장착되어 있으면서 각 랜카드가 일부분만 상대 피어와 통신할 수 있는 제한된 홖경(가령 랜카드1은 사내 보안 네트워크, 랜카드2는 외부 인터넷, 그리고 테스트 서버가 사내 보안 네트워크에서실행되는 경우)에서 홀펀칭 율이 떨어지는 문제가 발견되어 해결됐습니다.* CLanClient에서 GetRecentPing에 HostID_Server를 넣었을경우 핑을 제대로 얻지못했던 버그가 수정되었습니다.
  • 51. 항상 잘 돌아가는 엔진을 제공하라• 자동화된 유닛 테스트 SUITE• 샘플 프로그램• 데모 게임• 많은 사용자(엔짂 고객사) 갂혹, 테스트 프로그램 코딩량이 엔짂 코어 코딩 량보다 많을 때도 있습니다. 당연한 일입니다. (ProudNet의 Unit Test Suite)
  • 52. 결론
  • 53. 요약• 목적! 용도!• 한 눈에 팍팍!• EASY TO LEARN, HARD TO MASTER• 하위호홖성• 변강쇠• 칚젃+상세 보고• 성능? 편의성?
  • 54. 엔진 개발자 스스로의 만족은무의미하다.엔진 사용자가 만족해야좋은 엔진 API 디자인이다.
  • 55. 감사합니다!imays@nettention.co.krQ&A