首先,我不认为我正在制作“SFML和/或C ++性能问题”类型的问题。我对这个我一直在研究的地图编辑器的性能不满意,我百分之九十九确定我有错。
目前我如何在地图上放置瓷砖基本上我有一个循环遍历地图上每个瓷砖的功能,并检查鼠标是否悬停在它上面。我在另一个名为handleMouseClick()
如果你只想在每次放置瓷砖时单击,这是非常实用的,但是我有点像画笔。即使地图上只有500个图块,如果您快速将其拖动到屏幕上,它也会跳过图块。我需要能够创建具有5000多个瓷砖的地图,而我却无法承受如此高的性能。
我查看了我的代码并确保我没有制作不必要的副本。我很确定提高性能的最佳方法是改变我检查鼠标正在改变哪个图块的方式。
我唯一的想法是将地图放在“块”中,以便检查鼠标所在的“块”的图块。
答案 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填充鼠标所在的图块之间的所有图块目前正指向,以及鼠标指向之前的图块。