검색결과 리스트
Technical Article에 해당되는 글 282건
- 2004.10.21 서버에서 Connection만 되고 recv가 안될때...
- 2004.10.14 두 강체간의 입사각, 입사속도에 따른 충돌후 반사각,속도 구하기
- 2004.10.04 곱셈 성능 최적화..
- 2004.09.30 캠관련 콜백정보
- 2004.09.26 VisualStudio assist에서 method창 나오게 하는거..
- 2004.09.06 폰트 스케일 조정 방법.
- 2004.08.25 OLEDB관련 전체다 5
- 2004.08.25 보안관련링크
- 2004.08.25 함수 접두어 정리
- 2004.08.25 STL List에서 delete시에 에러날때
글
Technical Article/펌 2004. 10. 21. 20:57서버에서 Connection만 되고 recv가 안될때...
난감...;;
멀티스레드 기반이고 IOCP로 구성했을때..
소캣과 IOCP 릴레이션을 맺어준뒤 함수콜을 통해 Recv를 걸어주게 되면 context switching때문에 지연으로 인해서 connection은 이루어지나 GetQueueCompletionPort함수에서도 이벤트가 발생하지 않는다...
접속관련된 부분은 함수 하나에 몽땅 집어넣어 미연에 방지하세..흐흐
http://serious-code.net/moin.cgi/DeadlockDetection
멀티스레드 기반이고 IOCP로 구성했을때..
소캣과 IOCP 릴레이션을 맺어준뒤 함수콜을 통해 Recv를 걸어주게 되면 context switching때문에 지연으로 인해서 connection은 이루어지나 GetQueueCompletionPort함수에서도 이벤트가 발생하지 않는다...
접속관련된 부분은 함수 하나에 몽땅 집어넣어 미연에 방지하세..흐흐
http://serious-code.net/moin.cgi/DeadlockDetection
![](https://lh3.googleusercontent.com/-hYZb_novCPQ/V5HuGPkGFUI/AAAAAAAAANk/f8zcKkeTBbA1A-W6yuqfk12fs8bd8FeOQCL0B/banner_468_60.png)
트랙백
댓글
글
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;
}
#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;
}
![](https://lh3.googleusercontent.com/-hYZb_novCPQ/V5HuGPkGFUI/AAAAAAAAANk/f8zcKkeTBbA1A-W6yuqfk12fs8bd8FeOQCL0B/banner_468_60.png)
트랙백
댓글
글
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 으로 나와서.. 믿어야 하나..
곱셈 성능을 최적해 해보자.. 라는 글을 읽었다.
역시나 최적화라는것은 프로그래머의 로망인듯 싶다. ^^
하여간.. 내용은 이렇다.
다들 알고 있듯이..
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 으로 나와서.. 믿어야 하나..
![](https://lh3.googleusercontent.com/-hYZb_novCPQ/V5HuGPkGFUI/AAAAAAAAANk/f8zcKkeTBbA1A-W6yuqfk12fs8bd8FeOQCL0B/banner_468_60.png)
트랙백
댓글
글
Technical Article/펌 2004. 9. 26. 05:11VisualStudio assist에서 method창 나오게 하는거..
#define 으로 해놨을때
함수 보임
#define GET_HANDLE m_pSL->m_pHandle
함수 안보임 ㅋㅋ
#define GET_HANDLE() m_pSL->m_pHandle()
함수 보임
#define GET_HANDLE m_pSL->m_pHandle
함수 안보임 ㅋㅋ
#define GET_HANDLE() m_pSL->m_pHandle()
![](https://lh3.googleusercontent.com/-hYZb_novCPQ/V5HuGPkGFUI/AAAAAAAAANk/f8zcKkeTBbA1A-W6yuqfk12fs8bd8FeOQCL0B/banner_468_60.png)
트랙백
댓글
글
Technical Article/펌 2004. 9. 6. 08:10폰트 스케일 조정 방법.
ex) 14포인트로 할때
int nScaleX = 1400;
nScreenX = (x*nScaleX)/1000+((nBitPos%m_nWidth));
m_pGraph->DrawPoint(nScreenX, y);
크흐흐흐...
int nScaleX = 1400;
nScreenX = (x*nScaleX)/1000+((nBitPos%m_nWidth));
m_pGraph->DrawPoint(nScreenX, y);
크흐흐흐...
![](https://lh3.googleusercontent.com/-hYZb_novCPQ/V5HuGPkGFUI/AAAAAAAAANk/f8zcKkeTBbA1A-W6yuqfk12fs8bd8FeOQCL0B/banner_468_60.png)
트랙백
댓글
글
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
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
![](https://lh3.googleusercontent.com/-hYZb_novCPQ/V5HuGPkGFUI/AAAAAAAAANk/f8zcKkeTBbA1A-W6yuqfk12fs8bd8FeOQCL0B/banner_468_60.png)
RECENT COMMENT