블로그 이미지
fiadot_old

칼퇴근을 위한 게임 서버 개발 방법론에 대한 심도있는 고찰 및 성찰을 위한 블로그!

Rss feed Tistory
Technical Article/펌 2004. 10. 21. 20:57

서버에서 Connection만 되고 recv가 안될때...

난감...;;
멀티스레드 기반이고 IOCP로 구성했을때..
소캣과 IOCP 릴레이션을 맺어준뒤 함수콜을 통해 Recv를 걸어주게 되면 context switching때문에 지연으로 인해서 connection은 이루어지나 GetQueueCompletionPort함수에서도 이벤트가 발생하지 않는다...

접속관련된 부분은 함수 하나에 몽땅 집어넣어 미연에 방지하세..흐흐


http://serious-code.net/moin.cgi/DeadlockDetection
,
Technical Article 2004. 10. 14. 13:59

두 강체간의 입사각, 입사속도에 따른 충돌후 반사각,속도 구하기

#ifndef MAX
   #define  MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
#endif

#ifndef MIN
   #define  MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )
#endif


typedef struct _FIA_POINT
{
        int x;
        int y;
} FIA_POINT;

#define BIG_TILE_SIZE        ROTATE_CHR_SIZE
#define SMALL_TILE_SIZE        12


#define DOT_PRODUCT(ux,uy,vx,vy) ((ux)*(vx) + (uy)*(vy))


void        CollisionResponse(void *pv, BALLSTATE *pBallState, int nStage, int nMapAngle)
{
        PCAMELTRYApp        pApp = (PCAMELTRYApp)pv;
        
        //
        // 1. 공의 위치(다음번에 이동될)에 타일이 있는지 체크
        //

        FIA_POINT        ptAbsPos;
// #ifndef _DEBUG
//        ptAbsPos.x = MIN(MAX((pBallState->posX/ PRECISION + pBallState->vX )/BIG_TILE_SIZE , 0),CX_STAGE);        
//        ptAbsPos.y = MIN(MAX((pBallState->posY/ PRECISION + pBallState->vY )/BIG_TILE_SIZE , 0),CY_STAGE);
// #else
//        ptAbsPos.x = ((pBallState->posX) / PRECISION + 24 + pBallState->vX ) / BIG_TILE_SIZE;        
//        ptAbsPos.y = ((pBallState->posY) / PRECISION + 24 + pBallState->vY ) / BIG_TILE_SIZE;

        ptAbsPos.x = (pBallState->posX + pBallState->vX ) / PRECISION / BIG_TILE_SIZE;        
        ptAbsPos.y = (pBallState->posY + pBallState->vY ) / PRECISION / BIG_TILE_SIZE;

// #endif
        
        if ( 0 == g_cStageMap[nStage][ptAbsPos.y][ptAbsPos.x] )
                return;        // 충돌되는 타일 없다!
        
        
        FIA_POINT ptScroll;
        ptScroll.x = pApp->ScrollOffsetX / PRECISION;        // 스크롤 값
        ptScroll.y = pApp->ScrollOffsetY / PRECISION;

        FIA_POINT ptCollPixel;        // 충돌픽셀 위치
        ptCollPixel.x = 0;
        ptCollPixel.y = 0;

        // 이미지에서 위치에 다른 값 검색 (?)
        FIA_POINT ptScreenImgPos;        // 스크린 화면에 좌표에 해당하는거 얻어냄( 절대 좌표에서 스크린좌표-상대좌표 로 변환)
//        ptScreenImgPos.x = ptAbsPos.x * BIG_TILE_SIZE - ptScroll.x;
//        ptScreenImgPos.y = ptAbsPos.y * BIG_TILE_SIZE - ptScroll.y;
//        ptScreenImgPos.x = ptAbsPos.x;
//        ptScreenImgPos.y = ptAbsPos.y;

        ptScreenImgPos.x = (pBallState->posX + pBallState->vX ) / PRECISION - ptScroll.x;
        ptScreenImgPos.y = (pBallState->posY + pBallState->vY ) / PRECISION - ptScroll.y;


        NativeColor ncClr;
        RGBVAL                rgb;
        
        int        nCollNorX = 0;
        int        nCollNorY = 0;
        int        nCollDist = 0;
        
        bool bFound = FALSE;


        nCollNorX = (pBallState->posX/PRECISION - ptAbsPos.x*BIG_TILE_SIZE)+1;
        nCollNorY = (pBallState->posY/PRECISION - ptAbsPos.y*BIG_TILE_SIZE)+1;
        nCollDist = sqrt(nCollNorX * nCollNorX + nCollNorY * nCollNorY);

        bFound = TRUE;
        
//                
//                //
//                // 2. 타일과 공의 충돌픽셀 체크
//                //
//                for(int nY = ptScreenImgPos.y ; nY < ptScreenImgPos.y + BIG_TILE_SIZE ; nY++ )
//                {
//                        if ( TRUE == bFound )
//                                break;
//                        
//                        for(int nX = ptScreenImgPos.x ; nX < ptScreenImgPos.x + BIG_TILE_SIZE ; nX++ )
//                        {                                        
//                                IBITMAP_GetPixel(pApp->ddbBuffer[ROTATE_BUFFER], nX, nY, &ncClr);        // BG_BUFFER맞나?                
//                                rgb = IBITMAP_NativeToRGB(pApp->ddbBuffer[ROTATE_BUFFER], ncClr);
//
//                                if ( rgb != CLEARCOLOR )                // 해당 위치에 타일 픽셀이 있다.
//                                {                                                                
//                                        nCollNorX = (pBallState->posX/PRECISION - ptScroll.x - nX);
//                                        nCollNorY = (pBallState->posY/PRECISION - ptScroll.y - nY);
//                                        nCollDist = sqrt(nCollNorX * nCollNorX + nCollNorY * nCollNorY);
//
//                                        // 공과 충돌
//                                        if ( nCollDist == 12) // 공 위치에서 r=12 주변 만큼 체크
//                                        {
//                                                ptCollPixel.x = nX + ptScroll.x;
//                                                ptCollPixel.y = nY + ptScroll.y;
//                                                if ( nCollDist == 0 )
//                                                        nCollDist = 1;
//                                                bFound = TRUE;
//                                                break;
//                                        }
//                                }
//                        }
//
//
//                }


        if ( FALSE == bFound )
                return;        // 충돌되는 픽셀이 없다~
        
        //
        // 3. 반사각과 충돌후 속도 계산
        //

        // 충돌노멀벡터 normalize 해주고~
        nCollNorX /= nCollDist;
        nCollNorY /= nCollDist;

        // 접선에 대한 노멀벡터
        int tabx =  -nCollNorX;
        int taby =  nCollNorY;

        // 반사각및 충돌후 속도 구하는 부분  2(N dot L) - L
        int vait = DOT_PRODUCT(pBallState->vX, pBallState->vY, tabx, taby);
        int vain = DOT_PRODUCT(pBallState->vX, pBallState->vY, nCollNorX, nCollNorY);
        int vbit = DOT_PRODUCT(3, 3, tabx, taby);                                // 2, 2는 벽의 노멀벡터에 해당하는 값으로 치환해야함
        int vbin = DOT_PRODUCT(3, 3, nCollNorX, nCollNorY);                // = 벽(타일)의 중점과 충돌픽셀의 벡터 = 노멀벡터에 해당

        int vafn = vbin*2 / 2;
        int vaft = vait;

        int xfa = vafn*nCollNorX + vaft*tabx;
        int yfa = vafn*nCollNorY + vaft*taby;

        // 이단계에서 각에 대해 변환후 변수 치환
        // 속도 적용
//        pBallState->vX = (xfa * pApp->g_sin[nMapAngle]) / PRECISION;
//        pBallState->vY = (yfa * pApp->g_cos[nMapAngle]) / PRECISION;
        
//        pBallState->vX = xfa;
//        pBallState->vY = yfa;

        pBallState->vX = (xfa * pApp->g_sin[nMapAngle]) / PRECISION;
        pBallState->vY = (yfa * pApp->g_cos[nMapAngle]) / PRECISION;        


        // 속도에 따른 위치 이동
        pBallState->posX += pBallState->vX;
        pBallState->posY += pBallState->vY;        
}
,
Technical Article 2004. 10. 4. 09:21

곱셈 성능 최적화..

곱셈 성능 최적화..  
곱셈 성능을 최적해 해보자.. 라는 글을 읽었다.
역시나 최적화라는것은 프로그래머의 로망인듯 싶다. ^^

하여간.. 내용은 이렇다.
다들 알고 있듯이..

a = a * 2 ;
이것을 쉬프트로 바꾸면 a = a << 1;

a = a * 3;
->a = (a << 1) + a;

a = a * 640;
640 -> 0000 0010 1000 0000b
-> a = (a << 9) + (a << 7);

이렇다는 글이다.

바로 테스트에 들어갔다.
테스트 내용을 아래 포스팅한다.

결론적으로는 인텔 컴파일러 짱!!! 이란거다. -.-;;

-- 이하 코드 --
#include "stdafx.h"


#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include

#include
#include

#include
#pragma comment(lib, "winmm.lib")

using namespace std;

int main()
{
int a = 1;

int start = timeGetTime();
for (int i = 0; i < 100000000; i++)
{
a = 1;
for (int j = 0; j < 10; j++)
{
a = a * 640;
}
// if ((i % 50000000) == 0)
// cout << a << endl;
}

int end = timeGetTime();
cout << "time : " << end - start << endl;

start = timeGetTime();;
for (i = 0; i < 100000000; i++)
{
a = 1;
for (int j = 0; j < 10; j++)
{
a = (a << 9) + (a << 7);
}
// if ((i % 50000000) == 0)
// cout << a << endl;
}
end = timeGetTime();
cout << "time2 : " << end - start << endl;
return 0;
}

-- 이하 결과 --
p3 700 , 384Memory, Win2k, Intel 7.1 Compiler, VC 6.0 Compiler

Intel :
time : 451
time2 : 291
Press any key to continue

Intel 출력을 한것.
0
0
time : 1611
0
0
time2 : 1605
Press any key to continue

Intel 옵테마이저를 끄고 돌린것.
time : 22844
time2 : 12046
Press any key to continue

VC
time : 5820
time2 : 5812
Press any key to continue

VC 로 출력
0
0
time : 9936
0
0
time2 : 9874
Press any key to continue

VC 로 옵티마지저 끈것
time : 16151
time2 : 13687
Press any key to continue

ps. 참고로 친구 용희를 통해 2003 으로 컴파일 했을때는...
시간이 0 으로 나와서.. 믿어야 하나..
,
Technical Article/펌 2004. 9. 30. 08:35

캠관련 콜백정보

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

Technical Article/펌 2004. 9. 26. 05:11

VisualStudio assist에서 method창 나오게 하는거..

#define 으로 해놨을때

함수 보임
#define GET_HANDLE m_pSL->m_pHandle

함수 안보임 ㅋㅋ
#define GET_HANDLE() m_pSL->m_pHandle()
,
Technical Article/펌 2004. 9. 6. 08:10

폰트 스케일 조정 방법.

ex) 14포인트로 할때
int nScaleX = 1400;
nScreenX = (x*nScaleX)/1000+((nBitPos%m_nWidth));
m_pGraph->DrawPoint(nScreenX, y);

크흐흐흐...
,
Technical Article/펌 2004. 8. 25. 17:55

OLEDB관련 전체다

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

Technical Article/펌 2004. 8. 25. 17:53

보안관련링크

http://sudhirmangla.netfirms.com/


http://www.codeproject.com/internet/drvfltip.asp

http://www.codeproject.com/internet/smfirewall.asp

http://www.codeproject.com/internet/nsfundamentals.asp

http://www.codeproject.com/internet/#Security


http://www.bcpark.net/forum/read.html?table=special&num=65&no=57&depth=0


http://www.gaseum.co.kr/8150/article_show.asp?content_idx=535

http://new.rockid.net/column/read.php?num=20&page=1&code=board
,
Technical Article/펌 2004. 8. 25. 17:52

함수 접두어 정리

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

Technical Article/펌 2004. 8. 25. 17:51

STL List에서 delete시에 에러날때

insert시에 오버플로우 아닌가 체크해라!
,
TOTAL TODAY