Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

24.02.2007, 12:54

Mögliche Lösung für ruckelnde Videos mit tbVideo

Hallo an alle!

Ich habe mir lange Gedanken gemacht, wie man den das Problem der ruckelnden Videos angehen könnte: Das größte Problem ist doch, dass die Bilddaten in einem Video von unten nach oben aufgebaut sind. Wäre es nicht die einfachste Lösung, das Videobild einfach mit memcpy in die Textur zu kopieren und am Schluss die Texturkoordinaten der oberen und unteren Verticies zu vertauschen?
Leider bin ich noch ein Anfänger was die Programmierung mit C++ angeht und deshalb habe ich mich noch nicht daran getraut.
Was haltet ihr davon?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

24.02.2007, 13:09

Und was würde das bringen?
Das ändert nichts an der Datenmenge, die kopiert werden muss.
Ob man die jetzt von oben nach unten oder von unten nach oben kopiert, sollte so gut wie keinen Unterschied machen.

3

25.02.2007, 18:21

Das stimmt, aber ein for-Schleife benötigt auch noch eine gewisse ausführungszeit. Ich habe aber auch vergessen, dass die Texturen in D3D auch noch einen Zeilenabstand haben, also würde es nichts bringen. Ich habe aber noch ein Problem mit der tbVideo-Klasse: Wenn ich ein Video in der Relase-Version abspiele, dann funktioniert alles, wenn ich es aber mit der Debug-Version versuche, dann bekomme ich nur einen weißen Bildschirm zu sehen. Ich verwende die tbVideo-Klasse wie folgt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "main.h"
#define TEST_DX_ERROR(x) {HRESULT DXr; DXr = x; if (DXr) {TB_ERROR_DIRECTX(__TB_FUNCTION__, DXr, TB_ERROR); }}
#define TEST_FOR_ERROR(x) {tbResult r; r = x; if (r) {return r; }}
char* IntroFilename = "Data\\Intro.mpg";
struct SVideoVertex
{
    tbVector3           vPosition;
    float               fRHW;
    tbVector2           vTexture;
    static const DWORD  dwFVF;
};
tbVideo*        g_pIntroVideo;
const DWORD SVideoVertex::dwFVF = D3DFVF_XYZRHW | D3DFVF_TEX1;
tbResult CIntro::Init() {
    TB_INFO("Der Gamestate GS_INTRO wurde initalisiert");
    return TB_OK;
}
tbResult CIntro::Load() {
    TB_INFO("Der Gamestate GS_INTRO wurde geladen");
    g_pIntroVideo = (tbVideo*) tbMemAlloc(sizeof(tbVideo));
    if (!tbFileExists(IntroFilename)) 
        TB_ERROR("Das Introvideo wurde nicht gefunden!", TB_NOT_FOUND);
    TEST_FOR_ERROR(g_pIntroVideo->Init(IntroFilename));
    TEST_FOR_ERROR(g_pIntroVideo->Play(0));
    return TB_OK;
}
tbResult CIntro::Render(float time) {
    SVideoVertex    VideoPrimitive[4];
    tbDirect3D&     D3D = tbDirect3D::Instance();
    TEST_DX_ERROR(D3D->BeginScene());
    // Vertexformat und Videotextur setzen, Z-Buffer aus

    TEST_FOR_ERROR(D3D.SetFVF(SVideoVertex::dwFVF));
    TEST_FOR_ERROR(D3D.SetTexture(0, g_pIntroVideo->GetRenderer()->GetTexture()));
    TEST_FOR_ERROR(D3D.SetRS(D3DRS_ZENABLE, D3DZB_FALSE));
    // Links unten

    VideoPrimitive[0].vPosition = tbVector3(0.0f, D3D.GetScreenSize().y, 0.5f);
    VideoPrimitive[0].fRHW = 1.0f;
    VideoPrimitive[0].vTexture = tbVector2(0.0f, g_pIntroVideo->GetRenderer()->GetBottomRightTex().y);
    // Links oben

    VideoPrimitive[1].vPosition = tbVector3(0.0f, 0.0f, 0.0f);
    VideoPrimitive[1].fRHW = 1.0f;
    VideoPrimitive[1].vTexture = tbVector2(0.0f, 0.0f);
    // Rechts unten

    VideoPrimitive[2].vPosition = tbVector3(D3D.GetScreenSize().x, D3D.GetScreenSize().y, 0.5f);
    VideoPrimitive[2].fRHW = 1.0f;
    VideoPrimitive[2].vTexture = g_pIntroVideo->GetRenderer()->GetBottomRightTex();
    // Rechts oben

    VideoPrimitive[3].vPosition = tbVector3(D3D.GetScreenSize().x, 0.0f, 0.5f);
    VideoPrimitive[3].fRHW = 1.0f;
    VideoPrimitive[3].vTexture = tbVector2(g_pIntroVideo->GetRenderer()->GetBottomRightTex().x, 0.0f);
    // Szene zeichnen und beenden

    TEST_DX_ERROR(D3D->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, VideoPrimitive, sizeof(SVideoVertex)));
    TEST_DX_ERROR(D3D->EndScene());
    TEST_FOR_ERROR(g_pIntroVideo->NextFrame());
    return TB_OK;
}
tbResult CIntro::Move(float time) {
    TEST_FOR_ERROR(g_pIntroVideo->Process());
    if (!g_pIntroVideo->IsPlaying())
        GetGame()->SetGameState(GS_MAINMENU);
    return TB_OK;
}
tbResult CIntro::Unload() {
    TB_INFO("Der Gamestate GS_INTRO wurde entladen");
    TB_SAFE_MEMFREE(g_pIntroVideo);
    return TB_OK;
}
tbResult CIntro::Exit() {
    TB_INFO("Der Gamestate GS_INTRO wurde heruntergefahren");
    return TB_OK;
}

GetGame liefert die Spielklasse zurück.
Was ist dabei der Fehler?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

25.02.2007, 18:38

Ich glaube wir hatten schonmal darüber gesprochen, aber wäre nicht ein eigene Thread + mehrere Texturen ne Lösung für das Ladeproblem? Gut die CPU Leistung wird dadurch nicht mehr, aber immerhin sind die Zeiten wo GPU und CPU aufeinander warten müssen nicht mehr so groß und in Zeiten von Multicore, dürfte das doch in gewisser Weise helfen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

5

04.04.2007, 18:02

v-sync abzuschalten schwächt das Ruckeln auch ab!

Werbeanzeige