2013-10-23 54 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来填充鼠标当前指向的平铺块和鼠标先前指向的平铺块之间的所有平铺块。