|
C-/C++-Quelltext
|
1
2
|
pVideo = strrev(pVideo);
memcpy(pTexture, pVideo, pSample->GetSize());
|
1. strrev darfst Du nicht benutzen, da die Daten kein String sind. Er würde bei der ersten auftretenden Null aufhören, weil er denkt, der "String" wäre zu Ende.
2. Warum überhaupt die Daten umkehren? Damit wäre es noch langsamer als es ohnehin schon ist. Eine Spiegelung kann man mit veränderten Texturkoordinaten besser erzielen, außerdem sind die Bilder nicht vertikal, sondern horizontal gespiegelt. Mit dem Umkehren aller Daten würdest Du nur aus einem horizontal gespiegelten Bild ein vertikal gespiegeltes Bild machen, was einem nichts bringt.
3. Du darfst nicht die kompletten Daten einfach auf einmal in die Textur schreiben. Man sollte immer nur eine Zeile auf einmal schreiben, weil man nicht weiß, wie viel Speicher "zwischen" zwei Texturzeilen liegt. Dafür gibt es ja das Member D3DLOCKED_RECT:
itch. Es kann also durchaus sein, dass die Grafikkarte z.B. bei 640x480 intern(!) eine 1024x512-Textur nimmt und 384 Pixel in jeder Zeile einfach ignoriert werden. Würdest Du da rein schreiben, bekämst Du die geschriebenen Daten nie zu Gesicht.
Hier nochmal der entsprechende Ausschnitt aus tbVideo. Da man sowieso jede Zeile einzeln kopieren muss, kann man sie auch gleich in die richtige Reihenfolge bringen, ohne dass es zusätzliche Performance kostet (naja, ein bisschen vielleicht wegen Cache, aber nicht entscheidend).
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// 24-Bit-Format
else if(m_TexDesc.Format == D3DFMT_R8G8B8)
{
BYTE* pVideo;
pSample->GetPointer(&pVideo);
pVideo += dwVideoWidth * (dwVideoHeight - 1) * 3;
BYTE* pTexture = (BYTE*)(LockedRect.pBits);
DWORD dwPitch = LockedRect.Pitch;
for(DWORD y = 0; y < dwVideoHeight; y++)
{
memcpy(pTexture, pVideo, dwVideoWidth * 3);
pTexture += dwPitch * 3;
pVideo -= dwVideoWidth * 3;
}
}
|
Jedenfalls kann es an diesem Stückchen Code nicht liegen, dass es bei einigen Leuten so langsam läuft. Vor allem nicht, dass es im Vollbildmodus ruckelt und im Fenstermodus nicht.
Allerdings habe ich festgestellt, dass es im Vollbildmodus nicht so stark ruckelt, wenn man V-Sync abschaltet.