Funktion optimieren?



  • meine CMatrix:

    class CMatrix
    {
    public:
    	float	_11, _12, _13, _14;
    	float	_21, _22, _23, _24;
    	float	_31, _32, _33, _34;
    	float	_41, _42, _43, _44;
    };
    


  • Bashar schrieb:

    Die Frage kann man nicht beantworten, ohne CMatrix zu kennen. Glücklicherweise hat Optimizer(?) die vor ein paar Tagen auszugsweise gepostet 😉

    ähm, ne. 🙂



  • wenn's deine eigene ist, dann designe sie doch so, dass die Konvertierung schmerzlos vonstatten geht. Um nicht zu sagen, unnötig ist. Jetzt mal unter absichtlicher Verletzung des Standards:

    inline float* convert(CMatrix& m) {
      return reinterpret_cast<float*>(&m);
    }
    

    Funktioniert theoretisch nur, wenn der Compiler gutgelaunt ist und wenn die Mondphase richtig steht, glücklicherweise ist das oft genug für praktische Anwendungen 😉

    Optimizer: Auch keine D3D-Matrixklasse? Mir war so



  • Ich hab da ne Idee, die aber nicht stimmen muss: bist du sicher, dass du die Matrix einmal in das übergebene Feld opieren willst und einmal in das statische Feld? Nicht, das sowas schon reichen würde:

    float *ConvertMatrixToFloatArray (float* Output, const CMatrix &Matrix)
    {
        if (Output)
        {
            Output[ 0] = Matrix._11;
            Output[ 1] = Matrix._12;
            Output[ 2] = Matrix._13;
            Output[ 3] = Matrix._14;
    
            Output[ 4] = Matrix._21;
            Output[ 5] = Matrix._22;
            Output[ 6] = Matrix._23;
            Output[ 7] = Matrix._24;
    
            Output[ 8] = Matrix._31;
            Output[ 9] = Matrix._32;
            Output[10] = Matrix._33;
            Output[11] = Matrix._34;
    
            Output[12] = Matrix._41;
            Output[13] = Matrix._42;
            Output[14] = Matrix._43;
            Output[15] = Matrix._44;
        }
    
        return Output;
    }
    


  • Nein, ich habe lediglich mal irgendwo geschrieben, dass es keinen Grund gibt, eigene Matrixfunktionen zu schreiben, weil es gute in der D3DX-Erweiterung gibt.



  • aber nicht für OpenGL oder andere APIs oder z.B. eigenen kram

    @der_Held
    und was wenn Output NULL ist?



  • Dann wird NULL zurückgegeben.



  • geil: kurz kann man knicken.



  • Verstehst du meinen Vorschlag nicht, findest du ihn Sch****, oder warum ignorierst du ihn?



  • Ohne Matrix zu optimieren könnte man schreiben:

    float *ConvertMatrixToFloatArray (float* Output, const CMatrix &Matrix) 
    { 
      static float result[16];
      if (!Output) Output = result; 
      float* fptr = Output;
    
      *fptr++ = Matrix._11; 
      *fptr++ = Matrix._12; 
      *fptr++ = Matrix._13; 
      *fptr++ = Matrix._14; 
    
      *fptr++ = Matrix._21; 
      *fptr++ = Matrix._22; 
      *fptr++ = Matrix._23; 
      *fptr++ = Matrix._24; 
    
      *fptr++ = Matrix._31; 
      *fptr++ = Matrix._32; 
      *fptr++ = Matrix._33; 
      *fptr++ = Matrix._34; 
    
      *fptr++ = Matrix._41; 
      *fptr++ = Matrix._42; 
      *fptr++ = Matrix._43; 
      *fptr   = Matrix._44; 
    
      return Output; 
    }
    


  • Geo schrieb:

    Ohne Matrix zu optimieren könnte man schreiben:

    und was ist daran optimiert?

    das Output=result; hat auch nicht die gewünschte Wirkung...



  • 1. Die Codegröße ist optimiert.

    2. Output=result; hat die (hier) gewünschte Wirkung.



  • Bashar schrieb:

    Verstehst du meinen Vorschlag nicht, findest du ihn Sch****, oder warum ignorierst du ihn?

    casts sind langsam! sagt jetzt nicht das ist UNSINN! TGGC hats bewiesen! Und lame Funktionen kann man für games nicht gebrauchen!



  • iSAK schrieb:

    casts sind langsam! sagt jetzt nicht das ist UNSINN! TGGC hats bewiesen! Und lame Funktionen kann man für games nicht gebrauchen!

    Es ist ja so bequem, wenn man auf Autoritäten (?) verweist, anstelle selbst nachzudenken...



  • cd9000: Das ist offensichtlich ein Fake.



  • Bashar schrieb:

    cd9000: Das ist offensichtlich ein Fake.

    Danke für diesen Hinweis. 🤡

    Deswegen habe ich keine Gegenargumente oder Links gebracht.





  • Geo schrieb:

    2. Output=result; hat die (hier) gewünschte Wirkung.

    Ah, obfuscated. Jetzt hab ichs verstanden...

    @iSAK:
    *lol*

    float <-> int ist lahm, aber auch nur relativ

    Bashars Variante finde ich am besten, vorausgesetzt man ersetzt den cast durch ne ordentliche Konvertierung.



  • Shade Of Mine schrieb:

    Geo schrieb:

    2. Output=result; hat die (hier) gewünschte Wirkung.

    Ah, obfuscated. Jetzt hab ichs verstanden...

    Dann ist die gewünschte Wirkung aber eine sehr seltsame. C++ hat immer noch Call-by-value, dh output wird nicht verändert.

    @iSAK:
    *lol*

    float <-> int ist lahm, aber auch nur relativ

    hier wird nirgends float in int umgewandelt. erstens nur float in float und zweitens sowieso nur ein CMatrix* in einen float*. Zeigerkonvertierungen sind kostenlos (mal Memberpointer und ähnliches rausgelassen) und werden nur gemacht, um den Gott des statischen Typsystems zu besänftigen.

    Bashars Variante finde ich am besten, vorausgesetzt man ersetzt den cast durch ne ordentliche Konvertierung.

    Was verstehst du unter ordentlicher Konvertierung? Ich fürchte diese würde am Kernpunkt meiner Variante vorbei gehen.



  • Was ist an einem Pointer-Cast (oder reinterpret_cast, wo gar nichts an den Daten geändert wird), bitte langsam? AFAIK werden da einfach nur die Daten an der Adresse anders interpretiert beim Auslesen.
    Aber was solls, du willst einfach nichts von ein paar Leuten lernen, die sich mit der Materie auskennen. Stattdessen berufst du dich auf ein kurzes Trash-Programm von TGGC, was völlig andere Konvertierungen vornimmt und sagst, casts sind langsam. 🙄

    Bashar schrieb:

    ... und werden nur gemacht, um den Gott des statischen Typsystems zu besänftigen.

    *lol* 😃


Anmelden zum Antworten