0

首先,不要认为我在提出“SFML 和/或 C++ 性能问题”类型的问题。我对我一直在研究的这个地图编辑器的性能不满意,我 99% 的把握是我的错。

目前我在地图上放置图块的方式基本上是我有一个函数循环遍历地图上的每个图块并检查鼠标是否悬停在它上面。我在另一个简单命名的函数中调用这个函数handleMouseClick()

如果您每次想要放置瓷砖时都单击一下,这将非常实用,但我有它有点像画笔。即使地图上只有 500 个图块,如果您在屏幕上快速拖动它,它也会跳过图块。我需要能够创建具有 5000 多个图块的地图,但我负担不起马马虎虎的性能。

我查看了我的代码并确保我没有制作不必要的副本。我很确定提高性能的最佳方法是更改​​我检查鼠标正在更改的图块的方式。

我唯一的想法是将地图放在“块”中,以便它检查鼠标所在的“块”的图块。

4

1 回答 1

3

使用数学。假设您有像素尺寸的瓷砖{tile.width, tile.height}。并且您的应用程序的窗口是地图的视图,并且窗口的左上角位于 pixel 上{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 的线算法填充鼠标当前指向的图块之间的所有图块,以及鼠标之前指向的图块。

于 2013-10-23T16:05:28.627 回答