2013-10-23 2 views
0

우선 "SFML 및/또는 C++ 성능 문제"유형 질문을하고 있다고 생각하지 않습니다. 나는 내가 해왔 던이 맵 에디터의 성능에 만족하지 않고, 나는 그것이 잘못되었다고 99 % 확신한다.지도 편집기 성능 조언

현재 맵에 타일을 배치하는 방법은 기본적으로 맵의 모든 타일을 반복하고 마우스가 마우스를 가리키고 있는지 확인하는 기능이 있습니다. 이 함수를 단순히 다른 함수 내에서 호출합니다. handleMouseClick()

타일을 배치 할 때마다 클릭 만하면 충분합니다. 그러나 페인트 브러시와 비슷합니다. 지도에 500 개의 타일이 있어도 타일을 화면 전체로 빠르게 드래그하면 타일을 건너 뜁니다. 5000 개 이상의 타일이있는지도를 만들 수 있어야합니다. 그렇게하면 성능이 떨어질 수 있습니다.

나는 코드를 살펴보고 불필요한 복사본을 만들지 않았 음을 확인했습니다. 성능 향상을위한 가장 좋은 방법은 마우스가 바뀌는 타일을 확인하는 방법을 변경하는 것입니다. 는 "덩어리"의 타일을 확인할 수 있도록

내가 가진 유일한 아이디어는 "덩어리"의지도를하는 것입니다 마우스입니다.

+0

귀하의 타일은 모두 정사각형입니까? –

+0

네, 그렇습니다, 당신의 대답은 확실히 당신을 도울 수있을 것 같습니다. –

답변

3

를 사용하여 수학. 픽셀 크기가 {tile.width, tile.height} 인 타일이 있다고 가정 해 보겠습니다. 그리고 응용 프로그램의 창은지도의보기이며, 창의 왼쪽 상단 모서리는 픽셀 {view.x, view.y}에 있습니다. 창의 왼쪽 위 모서리를 기준으로 한 마우스 위치는 {mouse.x, mouse.y}입니다. 이벤트 시스템이 충분히 빠르게 업데이트되지 않는 드래그 효과를 처리하기위한

transformed_mouse.x = mouse.x + view.x; 
transformed_mouse.y = mouse.y + view.y; 

mouse_tile.x = transformed_mouse.x/tile.width; 
mouse_tile.y = transformed_mouse.y/tile.height; 

마우스는 이전의 반복에 대해 어디를 추적하고 : 당신은 마우스가 다음과 같이 가리키는되는 타일 계산할 수 있습니다 Bresenham's line algorithm을 사용하여 마우스가 현재 가리키고있는 타일과 이전에 가리키고 있던 타일 사이의 모든 타일을 채 웁니다.