게임에서 데이터 형보다 경험치가 더 클 경우...

cjy1126의 이미지

학원 수료하고 윈도우 공부하면서 가끔씩 리니지를 합니다.

리니지 게시판에 이런 글이 올라왔습니다.

그냥 생각나서 적어보는글입니다....

제가 보건데 리니지는 라풀수치는 2바이트 2바이트는 32767 ~ - 32768 입니다.. 경험치는 4바이
트인듯합니다..

4바이트의 수치는 2147483647 인데.. 여기서 50랩까지의 경험치 대충 5천8백만빼고 나머지 수치
를 3천6백만으로 나누면 약 58이나오네요.. 물론 108랩을 키우는사람은없지만.. (이때쯤돼면 리
니지가 망하던지 리니지의 대대적인 업뎃이 돼겠죠 ㅡㅡ) 현제상태론 아마 108이나 109랩이 최고
인듯하네요.. 왜냐.. 포세이든님이 70랩이됐던가? 그때쯤 경험치 1/6 획득하도록만들었죠.. 왜 
경험치량을 늘리지를 않고 획득량을 줄였을까요?  랩업경험치를 늘리면 한계경험치인 4바이트에 
빨리 도달하게돼고 그렇게돼면 리니지는 프로그램 모든것을 처음부터 다시 뒤엎어야합니다.. 그
런 수고를 덜기위해 획득경험치를 줄여버린거죠.. 이상태로 간다면 108랩이 끝인듯하네요.. 아
마 80랩에는 경험치를 더 줄여버리겠죠... 엔씨는 리니지 프로그램을 뜯어 고칠 계획이 없거든
요..

그냥 생각난김에 주저리주저리 적었습니다..
아.. 그럴수도있구나 하고 읽어주시면 감사하고요.. 반론제기는 사양입니다 ^^

그럼 수고하세요

제가 달은 리플입니다.

현재 32비트 운영체제를 씁니다.

즉, int형이 unsigned long(4바이트) 입니다.

이제 나올 64비트 운영체제에서는 8바이트가 됩니다.

그럼 경험치가 늘어나겠죠.

만약 운영체제가 안바뀐다면 엔씨는 엄청나게 짜증나겠죠.

현재 가장 큰 정수형이 unsigned long인데... 이걸 float로 바꿀수도 없고(엄청난 속도저하와 신뢰성의 압박이 -_-;;;)

모... 알아서 하겠죠.

이미 64운영체제랑 cpu도 나왔으니까요.

누가 밑에 이런 악플을 달았더군요.

컴공과 대학년 1-2년생분들이 아닐지 대략 추정 -_-;

옛날처럼 파일시스템두 아닐꺼구 다 DB로 관리하는뎅
데이타형 바꾸는게 엔씨들한테는 문제안되져

OS교체로 데이타형변환? 엔지니어로서 실격! -_-;

엔지니어로 실격 그런말까지 들어야하는지... 어이가 없더군요.

그런말을 할려면 설명이라도 해주던지. 도저히 이해가 안됩니다.

1000!을 구할때도 데이터형보다 사이즈가 커서 문자열이나 그런데 저장하지않습니까?

그럼 경험치도 데이터형보다 크기때문에 다른형 변수에 저장해야하고, 그러면 속도가 떨어지지 않습니까?(float와 int는 연산방법이 다르니까요.)

여기서 filesystem과 DB가 왜 나오는지 이해가 안됩니다.

기분은 안좋지만... 모르는거야 공부해서 알면된다고 생각하지만, 도저히 감이 안와서 질문올립니다.

참고자료나 설명 좀 부탁드리겠습니다. ^^;;;

kslee80의 이미지

확신은 못하지만, 플레이어의 데이터를 DB 로 관리하는건 맞을 겁니다.
비슷한 MMORPG 인 라그나로크의 경우 캐릭터 정보를 DB 로 관리하죠.

그리고,
int 형이 플랫폼에 의해서 크기가 변하는 타입이긴 하지만,
그건 int 타입의 정의 자체가 그럴 뿐입니다.
컴파일된 바이너리에서 int 타입을 어떻게 다루느냐는
컴파일러에 의존적이죠.

Java 나 .NET 의 CLR 에서 굴러가는 바이너리들은 몰라도,
Native 바이너리의 경우에는 64bit 플랫폼으로 이전하려면
최소한 재컴파일 과정이 필요하게 됩니다.

하지만,
저기서 파일시스템은 왜 나오는지 의문이군요 -_-;;
DB 를 사용하기 전에는 파일시스템을 DB 대용으로 썼다..라는 말을 하고 싶은 걸 수도 있긴 하겠네요.

sunyzero의 이미지

왠간해서는 long long을 넘기 정말 힙듭니다.

32bit OS내에서도 보면 long long은 8byte인데 이것을 넘기는 정말 힘들죠... ^^*

========================================
* The truth will set you free.

cjy1126의 이미지

long long 이 있는지 몰랐습니다. -_-;;;

책에서 unsigned long 이 제일 크다고 봐서요.

그리고 제가 리플단 글의 의도는 계산에 관련된쪽을 걱정하는거거든요.

저장이야 str로 하던지하면 된다고쳐도...

제가 c 배울때 4개월간 c 카페에서 답변달아주면서 연습했거든요.

그때 팩토리얼 구하는 문제가 있었는데, 그건 데이터형보다 사이즈가 커서 str로 저장해서 계산했습니다.

문제는 게임에서도 float나 str을 이용해서 데이터를 계산안할거라는거죠.(엄청난 속도에 부담이 있을거라 생각합니다.)

그런데, 갑자기 DB가 나와서 이해가 안되는거거든요.

제가했던 프로젝트는 NMS나 NIDS쪽이였는데, 그때 속도때문에 DB는 가능하면 사용안했습니다.(이때부터 지금까지 제가 잘못안것인지? 아니면, 저분이 잘못말한것인지 확실히 몰라서요.)

제가 제시한 문제는 데이터형을 넘는 크기의 변수가 들어오면, 계산시에 오버헤드가 걸릴것 같다는거죠.(어차피 int가 cpu의 bit와 같은 이유는 최고의 속도를 내기위해서니까요.)

변수형 바꾸는거야 프로그래머가 #define 경험치 unsigned long 이런식으로 했을거라 생각하고요.

제가 말한건 저장 문제가 아닌데, 왜 DB가 나왔는지가 이해가 안되서요.

설마 메모리대신 DB에 올려놓고 cpu와 DB만을 이용해서 저장하는것도 아닐테고요.

cjy1126의 이미지

두번 올라갔네요 -_-;;; 삭제가 안되서...

ㅡ,.ㅡ;;의 이미지

저기서 말하는 파일시스템이란.. 아마도 일반 상용DB 가아닌 과거 File 기반으로 처리한것을 말할듯.. sam isam vsam 물론 오라클도 isam의 발전된형태라볼수 있죠

그리고 DB상에서만 경치를 계산할수는 없는일이죠 하다못해 클라이언트에서도 계산해야되니까요..
님들컴푸타에 전부 오라클이 설치되있지 않은데도 디아블로 싱글모드 잘돌아가자나요.
어쨋든 재대로된프로그램만들려면 스트링으로 큰숫자를 계산하기보다 새로운데이터형을만들고 그를계산할수 있는방법또한 만드는것이 좋겠죠


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

sozu의 이미지

cjy1126 wrote:
long long 이 있는지 몰랐습니다. -_-;;;

long long 은 VC++에서는 지원않되지 않나요? :?

제가 알기로는 리니지 서버는 NT기반인데...

-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com

cjy1126의 이미지

저희 학원 강사님 친구분이 만들었다면서 얘기해주신듯 하네요.

저희반에서 게임서버쪽으로 짠 형들도 iocp라고 말한듯하네요.

그런데, long long형이 VC++에서는 또 안되나요? -_-;;;

sangheon의 이미지

OS를 바꾸는 건 무리로 보이고, 하나의 32 bit 정수를 추가하는 것으로 큰 무리없이 수정 가능할 것 같네요.

--

Minimalist Programmer

죠커의 이미지

한동안 32비트 컴퓨터에서도 16bit int를 사용했습니다. 운영체제와는 상관없어요.

컴파일러 종속적이죠.

dudungsil의 이미지

VC++에는 __int64랑 LARGE_INTEGER를 쓰는게 일반적이겠죠. 그리고 생각해보셔야 할게 게임만들면서 잔머리 많이 씁니다.

원문에서 쓰셨듯이 50렙에 경험치가 겨우 5천8백만밖에 안된다면서요. 렙 50이되면

level: 50
Exp: 0

이렇게 하면 레벨제한이란 말은 생길 가능성이 없다라고 해도 틀린 말이 아니겠죠. 저런 방법이 아니더라도 위에 책벌레님께서 말씀하신것처럼

unsigned int lowExp;
unsigned int highExp;

이렇게 하면 거의 무한대의 숫자를 쓸수 있습니다. 아주 큰수의 경우에 많이 사용하는 방법이죠. 몇비트짜리 cpu인가에 의해서 사용할수 있는 수가 제한되는건 절대 아닙니다.

그리고 64bit에서 int는 64bit가 아닙니다. int는 지금과 같이 32bits입니다. 64비트가 된다고 해서 모든게 64비트가 되는건 아니니까요.

교과서에 나오는 문제풀이가 아닌 이상 항상 다른면에서 생각을 해보세요. unsigned가 32비트니까 2^32가 제일 큰 수일꺼야. 그러니 경험치도 그 수가 넘어가면 더 못올라가겠네하고 생각하는건 너무 단순한 발상이죠.

설마 처음에 만들면서 그런 생각안해보고 만들었거라고 생각을 하지는 않으시겠죠. 이럴 것 같은데 빠져나가기 위해서 무슨 방법이있을까 하는 생각을 해보시면 다른면이 보이죠.

산넘어 산

Necromancer의 이미지

자리올림(carry)를 이용하면 자릿수는 얼마든지 무한대로 만들 수 있습니다.

(어셈블리 해보신분은 아실겁니다. add대신 adc를 이용하면 됩니다)

다만 문제가 되는 것은 프로그램의 구조가 되겠죠. 특히 저장과 관련된 자료구조

Written By the Black Knight of Destruction

Testors의 이미지

cjy1126 wrote:
long long 이 있는지 몰랐습니다. -_-;;;
책에서 unsigned long 이 제일 크다고 봐서요.

^^;;;

cjy1126 wrote:

그리고 제가 리플단 글의 의도는 계산에 관련된쪽을 걱정하는거거든요.
저장이야 str로 하던지하면 된다고쳐도...
제가 c 배울때 4개월간 c 카페에서 답변달아주면서 연습했거든요.
그때 팩토리얼 구하는 문제가 있었는데, 그건 데이터형보다 사이즈가 커서 str로 저장해서 계산했습니다.
문제는 게임에서도 float나 str을 이용해서 데이터를 계산안할거라는거죠.(엄청난 속도에 부담이 있을거라 생각합니다.)

뭐.. 64bit integer 쓰면 됩니다.
나누기같은짓 안하면 인스트럭션 몇개 안늘어납니다.
그리고 요새 CPU 에서 float 연산 그리 느리지 않습니다.
(저도 어떤 MMORPG 게임 서버를 만들었는데 서버 좌표계가 float 였습니다.)

cjy1126 wrote:

그런데, 갑자기 DB가 나와서 이해가 안되는거거든요.
제가했던 프로젝트는 NMS나 NIDS쪽이였는데, 그때 속도때문에 DB는 가능하면 사용안했습니다.(이때부터 지금까지 제가 잘못안것인지? 아니면, 저분이 잘못말한것인지 확실히 몰라서요.)
제가 제시한 문제는 데이터형을 넘는 크기의 변수가 들어오면, 계산시에 오버헤드가 걸릴것 같다는거죠.(어차피 int가 cpu의 bit와 같은 이유는 최고의 속도를 내기위해서니까요.)

경험치 같은것의 계산부하는 크게 중요하지 않습니다.
그거 계산 초당 얼마나 일어나겠습니까? ^^
그리고 MMORPG 류의 게임 서버에서 실제 부하는 뭐 NPC 처리나 길찾기.. 충돌체크.. 유효성검사.. 이런데서 다 먹지 경험치 +, - 이런 계산부하는 없다고 봐도 됩니다.
아시죠? 부하의 80% 는 20%의 코드에서 먹는다. -- 그 코드에서 64bit +, - 연산은 빼 주세요~ -
그리고 DB 음.. 생각만큼 느리지 않아요~ 해보니 기계 하나에서 MMORPG 스타일 게임 유저 동시에 만명까지 받고도 남던데.. ㅡ.ㅡ

cjy1126 wrote:

변수형 바꾸는거야 프로그래머가 #define 경험치 unsigned long 이런식으로 했을거라 생각하고요.

#define 이 아니라 typedef 을 써야죠~
#define 과 typedef 의 차이점을 모르신다면 낭패.. ;;

cjy1126 wrote:

제가 말한건 저장 문제가 아닌데, 왜 DB가 나왔는지가 이해가 안되서요.

댓글다신분이 DB 를 언급하신것은 이것은 결국은 형변환 문제이고 저장에 영향을 끼치기 때문인 것으로 보이는군요.
사실 코딩쪽은 아무 문제가 안됩니다. 타입 하나 바꾸면 끝이니..
형변환 문제는 사실 DB 문제가 더 큽니다.
댓글다신분이 filesystem 을 언급하신건 ISAM 이나 버클리DB 같은 파일 DB 를 의미하신걸로 보입니다.
정말 그런 파일 기반 DB 는 데이터형 하나 바뀌면 난리나죠. 이전 백업본과 호환성 다 깨지고, 컨버터 돌려야되고..
-- 사실 파일기반 DB 의 진정한 문제는 인덱스를 기록하다 app 가 비정상적 종료를 하면 DB 전체가 작살 날 수 있다는데 있습니다. --
그래서 상용 서비스 하는 게임에서는 보통 DBMS 를 씁니다. 그리고 DBMS 경우는 32bit 필드 64bit 로 바꾸는데 SQL 한줄이면 끝. ^^

성능문제는 일단 둘째이고 상용 서비스에서 가장 중요한 것은 '관리' 입니다.
(이런 일 하면 어느새 회사 사원의 절반 이상이 고객상담 직원으로 채워지게 됩니다.)

cjy1126의 이미지

제가 얼마나 모르는지 깨닫는 사건이었네요. ㅡ.ㅜ

cjy1126의 이미지

제가 얼마나 모르는지 깨닫는 사건이었네요. ㅡ.ㅜ
답글 달아주신 분들 감사합니다. 좋은 하루되세요. ^^;

tinywolf의 이미지

ㅎㅎ 첫글 읽어 보고 답글 달려했더니.. 다 달려 있네요..

제가 생각 못해던 부분도 있네요.. 도움 됬습니다.. ㅎㅎ

ㅡ_ㅡ;

creativeidler의 이미지

Java의 BigInteger 같은 클래스 하나 만들면 간단하게 해결이죠. 무한대 연산 가능.

ihavnoid의 이미지

creativeidler wrote:
Java의 BigInteger 같은 클래스 하나 만들면 간단하게 해결이죠. 무한대 연산 가능.

C 쪽에는 GNU MP라는 라이브러리가 존재합니다... -_- 메모리가 되는데까지 늘릴 수 있다고 하죠.
4096비트 정수까지 사용해 봤습니다.... 어차피 경험치 계산을 하는데에 나노초 단위의 시간을 요구할 것도 아니니, 정말로 64비트보다 큰 숫자를 요구한다면 이런 것을 이용할수도...-_-

Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24

pettizelt의 이미지

......

------------------------
http://eriny.net

kihlle의 이미지

값이 파일시스템에 저장되든 DB에 저장되든 문제가 되진 않습니다. 현대적인 운영체제라면 64비트 정수를 지원하지 않는 경우가 없거든요. long long이나 __int64같은 얘기는 이미 위에서 나왔구요. DB에서도 number(38), 즉 십진수 38자리의 정수까지를 담을수 있습니다. 그 외에도 MP나 혹은 직접 캐리가 구현된 수치클래스를 사용할수도 있습니다.이상 ILP64든 LP64든 그러한 모델에 관계없습니다.

그런데... 아주 간혹 LP32환경이 있다고는 합니다. (전 실제로는 보지못했습니다만.. 아주 예전에 도스가 아마 그렇겠지요?) 이런 모델로 서버가 구축되었으리라고는 상상하기 힘들군요. :-)

homeless

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.