用于检查像素坐标中的偏移的高效代码

时间:2014-06-22 07:00:09

标签: java performance math

我正在使用Java为游戏制作基于图块的渲染方法。

有可能在屏幕上部分绘制第一行(和列)的图块,我想知道屏幕上有多少像素。

我想出了这个(用于检查破碎瓷砖的最大X坐标):

int brokenX = xOffset; //xOffset can be any number
while (brokenX < 0){
    brokenX += tileSet.getTileSize(); //corrects if the number is negative
}
while (brokenX >= tileSet.getTileSize()){
    brokenX -= tileSet.getTileSize(); //corrects if the number is too big
}

这很好用。但这似乎是浪费资源(考虑到每帧会做两次)。

是否有一些高效的方式(位掩码等)这样做?

5 个答案:

答案 0 :(得分:2)

我认为你正在寻找

brokenX = xOffset % getTileSize();

我认为上面的内容也适用于否定但如果xOffset可以更大,那么你可以做到

好的..好的。我想只需在最后一行添加一个支票即可解决问题。

hiddenTiles = xOffset /  getTileSize();
xOffset -= hiddenTiles * getTileSize();
if(xOffset < 0) {
    brokenX=  -(-xOffset % getTileSize());
}
else {
    brokenX = xOffset % getTileSize();
}

或者杰森建议: 只有一行...

brokenX=  (xOffset + getTileSize())% getTileSize());

我真的认为,这也适用于负补偿。因此不需要进行任何更改。

答案 1 :(得分:1)

以下是在没有条件的情况下克服模数中的负面问题的常用方法:

int tileSize = tileSet.getTileSize();
int brokenX = ((xOffset % tileSize) + tileSize) % tileSize;
int brokenY = ((yOffset % tileSize) + tileSize) % tileSize;

这是有效的:

  1. 第一个模数确保数字小于tileSize
  2. 添加确保数字为正数,因为它小于tileSize,并添加了tileSize
  3. 第二个模数确保数字为正数且小于tileSize

答案 2 :(得分:1)

我建议使用库函数。显然,对于这项任务来说,这是一个巨大的过度杀伤力,但是在一个好的图书馆中还有更多。我最喜欢的是Guava和mod int result = x % m; return (result >= 0) ? result : result + m; 方法:

13, 3, -7, -17

一个例子应该说清楚。我正在尝试使用10模数13 % 10 = 3,这些数字应该返回相同的结果。

  • 3 % 10 = 3,没关系
  • -7 % 10 = -7,还可以。
  • -7 % 10 + 10 = 3为负数且无法用作索引,但使用-17 % 10 + 10 = 3则没问题。
  • result < 0也很好。

因此,对于m < 0或等效m,您需要添加{{1}}才能获得正面结果。

答案 3 :(得分:0)

如果瓷砖尺寸是2的幂,那么

brokenX = xOffset & (tileSize - 1);

答案 4 :(得分:0)

if (brokenX < 0)
    brokenX = tileSizeX - (Math.abs(brokenX) % tileSizeX);