Static Geometry - Problem (Keine Rückmeldung)

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Static Geometry - Problem (Keine Rückmeldung)

Beitrag von Chimorin »

Hiho,

ich weiß, dass ich diese Frage schon einmal gestellt habe, aber ich kann den Thread nicht mehr finden.
Mein Problem: Der folgende Code führt nach ein paar Ausführungen einer Schleife zu einem "Keine Rückmeldung" von Windows.
Weiß jemand, wie man das beheben könnte?

(Das ist ein editiertes Beispiel und gehört in eben diesen Ordner.)

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Static Geometry
;
;    (c) 2012 - Fantaisie Software
;
; ------------------------------------------------------------
;

IncludeFile "Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY
Define nx.f, nz.f, Boost.f = 10, Yaw.f, Pitch.f

If InitEngine3D()
  
  Add3DArchive("Data/Textures", #PB_3DArchive_FileSystem)
  Add3DArchive("Data/Scripts",#PB_3DArchive_FileSystem)
  Parse3DScripts()
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    WorldShadows(#PB_Shadow_Additive)
    
    AmbientColor(0)
        
    ; node for Light and Billboard (Sun)
    CreateNode(0, 0, 3000, 0)
    
    ;Create light
    CreateLight(0, RGB(90, 105, 132), 0, 3000, 0)
    AttachNodeObject(0, LightID(0))
    
    ; Create flare
    GetScriptMaterial(0, "Scene/burst")
    CreateBillboardGroup(0, MaterialID(0), 2048, 2048)
    AddBillboard(0, 0, 0, 3000, 0)
    AttachNodeObject(0, BillboardGroupID(0))
    
    
    ; Static geometry
    ;
    
    ; Create Entity
    CreateCube(0, 1)
    CreateEntity(0, MeshID(0), #PB_Material_None)
        
    ; Create Static geometry
    CreateStaticGeometry(0, 1000, 1000, 1000, #True)
    For i = 0 To 3
      Debug "1"
      CreateStaticGeometry(#PB_Any, 10000, 10000, 10000, #True)
      Debug "2"
        Repeat
        Until WindowEvent() = 0
      Next

    For z = -10 To 10
      For x = -10 To 10
        AddStaticGeometryEntity(0, EntityID(0), x * 1000, 0, z * 1000, 1000,  10, 1000, 0, 0, 0)        
        Height.f = 200 + Random(800)
        AddStaticGeometryEntity(0, EntityID(0), x * 1000, Height/2, z * 1000,  200, Height, 200, 0, Random(360), 0)
      Next
    Next
    
    ; Build the static geometry
    BuildStaticGeometry(0)
   
    FreeEntity(0)

    ; Camera
    ;
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 2000, 2000, 2000, #PB_Absolute)
    CameraLookAt(0, 0, 0, 0)
    CameraRange (0, 2, 5000)
    CameraFOV   (0, 90)
    CameraBackColor(0, RGB(90, 105, 132))
    
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        Yaw   = -MouseDeltaX() * 0.05
        Pitch = -MouseDeltaY() * 0.05
      EndIf
      
      If ExamineKeyboard()
              
        If KeyboardPushed(#PB_Key_Up)    
          MoveCamera(0,  0, 0, -2 * Boost)
        ElseIf KeyboardPushed(#PB_Key_Down)
          MoveCamera(0,  0, 0,  2 * Boost)
        EndIf 
  
        If KeyboardPushed(#PB_Key_Left)  
          MoveCamera(0, -2 * Boost, 0, 0) 
        ElseIf KeyboardPushed(#PB_Key_Right)
          MoveCamera(0,  2 * Boost, 0, 0)
        EndIf 
  
      EndIf
           
      ; Sun
      nx = 10000 * Cos(ElapsedMilliseconds() / 2500)
      nz = 10000 * Sin(ElapsedMilliseconds() / 2500)   
      MoveNode(0, nx, 3000, nz, #PB_Absolute)
      
      RotateCamera(0, Pitch, Yaw, 0, #PB_Relative)
      
      RenderWorld()
      Screen3DStats()
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End
Bild

- formerly known as Bananenfreak -
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Static Geometry - Problem (Keine Rückmeldung)

Beitrag von NicTheQuick »

Stichwort WindowEvent().

Schade, dass diese Frage immer und immer wieder gestellt wird.
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: Static Geometry - Problem (Keine Rückmeldung)

Beitrag von Chimorin »

kA, habs einfach durch

Code: Alles auswählen

WaitWindowEvent(10)
ersetzt, funktioniert einwandfrei. Die SuFu hat nicht viel gebracht.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Static Geometry - Problem (Keine Rückmeldung)

Beitrag von NicTheQuick »

Bau lieber ein

Code: Alles auswählen

While WindowEvent() : Wend
ein.
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: Static Geometry - Problem (Keine Rückmeldung)

Beitrag von Chimorin »

Wo liegt da der Unterschied zwischen den beiden Varianten?
Ich finde, da ist kein großer Unterschied; Beim Einen wird am Anfang der Schleife abgefragt, beim Anderen am Ende...
Bild

- formerly known as Bananenfreak -
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Static Geometry - Problem (Keine Rückmeldung)

Beitrag von NicTheQuick »

'WaitWindowEvent(10)' arbeitet nur einen Event ab pro Durchlauf deiner Hauptschleife. Wenn du 'While WindowEvent() : Wend' benutzt, dann werden alle Events abgearbeitet, die tatsächlich gerade anstehen. Es können nämlich durchaus mal mehrere auf einmal kommen.
Die Version mit dem einzelnen 'WaitWindowEvent(10)' kann durchaus auch funktionieren, aber wirklich sicher ist meine. Und darauf kommt es ja an, oder? :wink:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Static Geometry - Problem (Keine Rückmeldung)

Beitrag von ts-soft »

Das WaitWindowEvent(10) wird entweder durch ein Event durchbrochen, oder weil 10 ms vorbei sind und
flasht auch nur ein Event, falls vorhanden.
Die zweite Schleife flasht alle Events, aber nur wenn auch welche vorhanden sind.

//edit
war wieder einer schneller als ich tippen kann :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: Static Geometry - Problem (Keine Rückmeldung)

Beitrag von Chimorin »

Nein, ich glaube ich habe mich nicht treffend ausgedrückt ^^

Ich würde gerne den Unterschied zwischen

Code: Alles auswählen

Repeat
        Until WindowEvent() = 0
und

Code: Alles auswählen

While WindowEvent() : Wend
wissen. Für mich ist das wie schon gesagt verwunderlich, dass Nummero 1 zu "Keine Rückmeldung" führt.
Bild

- formerly known as Bananenfreak -
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Static Geometry - Problem (Keine Rückmeldung)

Beitrag von ts-soft »

Bananenfreak hat geschrieben: Ich würde gerne den Unterschied zwischen

Code: Alles auswählen

Repeat
        Until WindowEvent() = 0
und

Code: Alles auswählen

While WindowEvent() : Wend
Die erste Version ist Fußgesteuert und wird mind. einmal durchlaufen, während die zweite Version
Kopfgesteuert ist und somit bei keinem Event gar nicht durchlaufen wird. Die zweite Variante wäre
also die "optimalere", wobei das im realem Lebem aber wohl eher rein gar nichts ausmachen wird :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Static Geometry - Problem (Keine Rückmeldung)

Beitrag von NicTheQuick »

...zumal die Schleife auch leer ist.
Also in diesem Fall macht es wirklich keinen Unterschied, welche Schleife man verwendet.
Hier die beiden ASM-Codes:

Code: Alles auswählen

; While WindowEvent() : Wend
_While1:
  CALL   PB_WindowEvent
  AND    rax,rax
  JE    _Wend1
  JMP   _While1
_Wend1:
; 
; Repeat : Until WindowEvent() = 0
_Repeat2:
  CALL   PB_WindowEvent
  MOV    r15,rax
  AND    r15,r15
  JNE   _Repeat2
_Until2:
Wie man sieht brauchen beide Schleifen genau gleich lang. :wink:
Antworten