0

世界座標の点のリストを画面 (ピクセル) の点に変換したいと考えています。基本的に、世界の (worldX, worldY) 座標の束をスクリーン マトリックスに乗算したいと考えています。

問題は、この手順が非常に遅いことです。

コード:

for (int i = 0; i < cnt; i++)
{
   worldX = getWorldX(i);
   worldY = getWorldY(i);

   screenX = wtsMat.vx1 * worldX + wtsMat.vy1 * worldY + wtsMat.tx;
   screenY = wtsMat.vx1 * worldX + wtsMat.vy2 * worldY + wtsMat.ty;

  ...
  //Do something with screenX and screenY
}

このタスクを達成するためのより良い、より速い方法があるのだろうか。

4

2 に答える 2

0

その動作を考えると、計算は正しく、速度の問題に過ぎないと思います。

また、コードの一部を省略したので、sceenX と screenY で何もしないと遅いと思います。そのため、投稿したループにすべて含まれています。これが非常に単純な計算であることを確認すると、低速になるには cnt が非常に高くなければなりません。

物事をスピードアップするためにできることはいくつかあります:

//store object vars locally for quicker access
var wtsMatVx1 = wtsMat.vx1; 
var wtsMatVy1 = wtsMat.vy1; 
var wtsMatVy2 = wtsMat.vy2; 
var wtsMatTx = wtsMat.tx; 
var wtsMatTy = wtsMat.ty; 

while (cnt--)
{
   //while-- is faster according to tests

   var worldX = getWorldX(i); //dont use a global scope, which is used if you dont use var
   var worldY = getWorldY(i); //dont use a global scope


   var screenX = wtsMatVx1 * worldX + wtsMatVy1 * worldY + wtsMatTx;
   var screenY = wtsMatVx1 * worldX + wtsMatVy2 * worldY + wtsMatTy;

  ...
  //Do something with screenX and screenY
}
于 2012-11-28T11:51:34.743 に答える
0

wtsMat 変数はループ中に変更されないので、プロパティではなく変数として定義してみませんか?

コードは次のようになります。

var worldX, worldY, screenX, screenY;
var wtsMatVx1 = wtsMat.vx1;
var wtsMatVy1 = wtsMat.vy1;
var wtsMatTx = wtsMat.tx;
var wtsMatVx2 = wtsMat.vx2;
var wtsMatVy2 = wtsMat.vy2;
var wtsMatTy = wtsMat.ty;
var i = cnt;
for (i; i > 0; i--)
{
    worldX = getWorldX(i);
    worldY = getWorldY(i);

    screenX = wtsMatVx1 * worldX + wtsMatVy1 * worldY + wtsMatTx;
    screenY = wtsMatVx1 * worldX + wtsMatVy2 * worldY + wtsMatTy;

    ...
    //Do something with screenX and screenY
}

PS: を計算screenYするために を使用しますがwtsMat.vx1、これは ではないwtsMat.vx2でしょうか?

于 2012-11-28T08:40:24.760 に答える