amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Search [ - Search - New posts - Register - Login - ]

First << 9 10 11 12 13 -14- 15 16 17 18 19 >> Last Search results: 1858 hits (30 per page)
Reth   User

2011-07-23, 01:26 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

So, habe mal ein neues Bsp. (AOS4 binary) mit Source bereitgestellt.
Hier bekomme ich nun immer einen DSI-Fehler! Egal, ob mit oder ohne Begin-/EndRefresh()! Das Blit-Verhalten ist dennoch unverändert, also mit den Refresh-Funktionen sieht man nix, ohne allerdings das ganze 6-Eck! Also nicht nur den Bereich, den mein ClipRect angibt! Dabei ist es egal. ob ich Begin-/EndRefresh um den ganzen Code-Bereich (also mit den InstallClipRegion-Aufrufen) setze, oder nur direkt vor und nach dem Blitaufruf!

Was passt denn hier noch nicht?

[ Dieser Beitrag wurde von Reth am 23.07.2011 um 01:28 Uhr geändert. ]
 
Reth   User

2011-07-23, 01:11 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Zitat:
Original von Holger:
Zitat:
Original von Reth:
In meinem Originalcode erstelle ich eine ClippingRegion, rufe BeginRefresh(), installiere die ClippingRegion im Rastport, Blitte alles, installiere die originale ClippingRegion wieder und rufe EndRefresh(). So wie hier im Thread besprochen. Ergebnis ist dasselbe: Ohne Begin-/EndRefresh() funktioniert das Blitten, mit nicht.

Wie bereits gesagt, man muss herausfinden, was es bedeutet, wenn man es so macht. Es deutet alles darauf hin, dass eine so installierte eigene Clipping-Region mit der durch BeginRefresh installierten UND-verknüpft wird.

Ist natürlich doof, wenn man eigentlich gerne ODER gehabt hätte.

Im Originalcode verknüpfe ich die ClippingRegion via ODER mit der bereits im Layer vorhandenen Region. Das Ergebnis setze ich als neue Region (s. weiter oben im Thread).
Werde das im Bsp. mal anpassen.
Zitat:
Original von Holger:
Und wenn Du schon dabei bist, Dein Beispiel zu überarbeiten, solltest Du ein wenig Aufmerksamkeit auf den Unterschied zwischen Public-Screen und Custom-Screen legen. Außerdem darüber nachdenken, ob es gut ist, eine Message zurückzuschicken und danach noch darauf zuzugreifen. Und ob es sinnvoll ist, NoCareRefresh anzugeben, wenn man doch eigentlich den Refresh selbst in die Hand nehmen will.

Danke für die Hinweise! Bin wie gesagt noch Anfänger (aus meiner Sicht) bzgl. AmigaOS-Programmierung! Allerdings hab ich den Teil mit den Messages woanders aufgeschnappt nur hier falsch umgesetzt! Wenn man die Message gleich mit einem Reply versehen, aber dennoch weiter nutzen will, muss man sich die benötigten Attribute kopieren. Im Originalcode mach ich das auch (hoffentlich richtig)!
 
Reth   User

2011-07-23, 01:05 h

[ - Direct link - ]
topic: Unterschied zw. C und C++: Deklaration in while()?
Board: Programmierung

Danke für eure Erläuterungen! Damit hab ich dieses Thema glaub ich kapiert!
 
Reth   User

2011-07-22, 22:44 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Zitat:
Original von Thore:
Hast Du versucht, mal eigene Layer, bzw ClipRegions zu erstellen? Wenn die zerstört werden könnte bei EndRefresh diese wieder rekonstruiert werden, und klappen, auch ohne dem IDCMP.

In meinem Originalcode erstelle ich eine ClippingRegion, rufe BeginRefresh(), installiere die ClippingRegion im Rastport, Blitte alles, installiere die originale ClippingRegion wieder und rufe EndRefresh(). So wie hier im Thread besprochen. Ergebnis ist dasselbe: Ohne Begin-/EndRefresh() funktioniert das Blitten, mit nicht.
Ich versuch mal mein Bsp. anzupassen!
 
Reth   User

2011-07-22, 21:08 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Zitat:
Original von Thore:
Ja Du hast einen Denkfehler.
Der zeichnet bei Begin/EndRefresh auch nur wenn die Layer zerstört wurden.
Wenn du z.B. ein IDCMP_REFRESHWINDOW einbaust, kannst Du im Main-Loop (while Schleife mit den cases) BeginRefresh/EndRefresh verwenden, und das Bild refresht dann sobald die Layer zerstört werden (z.B. durch Verschieben des Fensters oder Größe ändern...also wenn systemseitig neu gezeichnet werden muss)

Dann hab ich irgendwo an Holgers Ausführungen was übersehen oder falsch verstanden! Wie kann ich denn dann nun meine Aktualisierungen am besten durchführen? Ohne Begin-/EndRefresh()? Bleibt immer noch das Problem mit dem grauen Hintergrund an den 6-Eck-Grenzen, der nicht wieder hergestellt wird. Dafür hab ich noch keine Idee (meine ursprüngliche möchte ich eigentlich nicht wieder einführen)!
Zitat:
Original von Thore:
Übrigens crasht der Hook unter MorphOS...

Was soll ich tun? Beim Thema MOS bin ich (leider) noch lange nicht (Ziel ist zwar schon, dass die Programme möglichst überall laufen, aber nicht das Primäre)!
 
Reth   User

2011-07-22, 00:43 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Also! Hab mal ein Bsp.-Programm mit Source erstellt (AOS4 binary), was mich dank "Amiga-API", rauskopieren und anpassen aus meinem C++ Code einige Stunden gekostet hat (bin immer noch Anfänger in diesen Dingen)! (Da könnt ich mich aufregen, für solch simple Sachen, wie in dem Bsp. angegeben so viel Code mit so vielen Fehlermöglichkeiten! So kommt keiner und programmiert für den Amiga oder das AmigaOS! Für meine C++-Gehversuche hab ich schon einiges gekapselt und gewrapped, als API taugt das aber nie und nimmer, v.a., da ich die Fehlerbehandlung hab schleifen lassen. Dafür lässt es sich etwas intuitiver und einfacher verwenden [finde ich]!)

So, zurück zum Thema! Bei dem Bsp. passiert Folgendes (wähle immer einen 1024x768 Screenmode):
In der aktuellen Sourceversion wird alles brav geblittet. Sobald ich aber BeginRefresh() und EndRefresh() aktiviere wird nichts mehr dargestellt! Dasselbe Problem hab ich auch in meinem eigentlichen Programm. Der Einfachheit halber hab ich mal alle Menüs und das Clipping weggelassen!
Wo ist denn nun aber mein fundamentaler (Denk-)Fehler? Sobald ich mit Begin-/EndRefresh() arbeite erfolgt keine Blitausgabe mehr!
 
Reth   User

2011-07-22, 00:15 h

[ - Direct link - ]
topic: Unterschied zw. C und C++: Deklaration in while()?
Board: Programmierung

@Thore:
Hab schon -std=c99 als Compilerflag angegeben, damit ist so etwas wie for (int i = 0; ... möglich, das o.a. Beispiel aber nicht! Das ist doch inkonsistent, oder nicht?

Ist dann bei der Nutzung von for (int i = 0; ... die Variable i auch in der ganzen Funktion bekannt und mit dem letzten Wert nach Schleifenende belegt (das wär ja was!)?
 
Reth   User

2011-07-21, 23:37 h

[ - Direct link - ]
topic: Unterschied zw. C und C++: Deklaration in while()?
Board: Programmierung

Hallo zusammen,

warum klappt das Folgende in C++, aber nicht in C (Codebench und AOS4 SDK)?
C code:
...
while (struct IntuiMessage *my_message = (struct IntuiMessage *)GetMsg(window->UserPort))
{
    ReplyMsg((struct Message *)my_message);
...

Compiler sacht: expected expression before 'struct'

Ja wieso das denn?
 
Reth   User

2011-07-21, 00:17 h

[ - Direct link - ]
topic: AOS4 undefined reference to IAsl trotz -D__USE_INLINE__
Board: Programmierung

Hngr! Hatte -l auto beim Linker vergessen! :glow:
 
Reth   User

2011-07-21, 00:09 h

[ - Direct link - ]
topic: AOS4 undefined reference to IAsl trotz -D__USE_INLINE__
Board: Programmierung

Hallo zusammen,

versuche gerade ein kurzes C-Programm mit dem AOS4 SDK zu compilieren. Für 68k-Kompatibilität nutze ich die Compiler-Option -D__USE_INLINE__. Dennoch bekomme ich bei der Nutzung von z.B. AllocAslRequestTag() oder FindDisplayInfo() ich Fehlermeldungen, dass IAsl und IGraphics undefinierte Referenzen sind!

Woran liegt das denn nun noch?

Dank euch schon mal!

Ciao
 
Reth   User

2011-07-20, 18:46 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Zitat:
Original von Holger:
Dann versteh ich das Problem nicht. Der graue Hintergrund wird doch beim Refresh wiederhergestellt.

Aber durch wen den? Selber blitten oder Backfill-Hook einbauen? Derzeit passiert da gar nichts (s. Screenshots in diesem Thread), egal, welchen der beiden Ansätze ich nehme (mein ursprünglicher und der mit Begin-/EndRefresh).
 
Reth   User

2011-07-20, 12:55 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Zitat:
Original von Holger:
Hast Du es inzwischen unter AOS3.x ausprobiert?

Nein noch nicht. Dort müsste ich erst einmal das Projekt komplett neu aufsetzen und compilierbar machen. Oder ein einfaches C-Bsp. programmieren und dieses dann unter 68k nochmal compilieren und ausführen.

Zitat:
Original von Holger:
Ja, wozu gibt es denn die Möglichkeit, mit einer Maske zu blitten?

Hilft in diesem Fall nicht, da die Türme an diesen Stellen ja teilweise über dem grauen Hintergrund erscheinen dürfen! Nur wenn man die Maus wieder wegbewegt, dann soll dort auch wieder der graue Hintergrund dargestellt werden und nicht Reste vom Turm!

Zitat:
Original von Holger:
Wenn Du eine Offscreen-BitMap benutzt, kannst Du alles exakt so machen, wie ohne. D.h. Du zeichest mit Clipping in die Offscreen-BitMap und blittest diese dann mit Clipping auf den Bildschirm.

Du kannst es natürlich auch ohne Clipping machen, so wie Du es auch ohne Offscreen-BitMap ohne Clipping machen könntest. Die Auswirkungen sind die gleichen.

Aber das Flimmern und der langsame Bildaufbau sollten bei einer Offscreen-Bitmap doch nicht mehr erfolgen!
 
Reth   User

2011-07-19, 16:07 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

@Holger:
Hi nochmal Holger,

aus meinem Code oben kannst Du die Reihenfolge der Aufrufe entnehmen. Ich kann auch nochmal selbst versuchen die relevanten Teile in ein C-Bsp.-Programm zu packen, zu testen und hier zu posten! (Wie gesagt, derzeit funktioniert es nicht, sobald ich Begin-/EndRefresh benutze, wenn ich alles Andere unverändert lasse und nur die beiden Aufrufe auskommentiere klappts!)

Bei weiterem Nachdenken ist mir allerdings aufgefallen, dass die Lösung für mich wohl auch nicht 100% funktionieren wird! Und zwar aus folgendem Grund:
Am Spielfeldrand liegen ja meine 6-Ecke über dem grauen Hintergrund, dort sind aber die entstehenden Clipping-Rechtecke nicht 6-eckig! D.h., Türme, die dort am Rand blinken und wieder entfernt werden müssen, würden mit diesem Ansatz auch nicht richtig behandelt werden und Spuren wie auf meinen Screenshots hinterlassen!
D.h., ich brauche hier eine grundsätzlich andere Vorgehensweise und stehe mir wohl gerade selbst immer im Weg. Das Problem ham doch schon zig Andere auf dem Amiga vor mir gelöst, dann müsste es doch probate Mittel dafür geben! Den Vorschlag mit Doublebouffering hab ich allerdings noch nicht ganz kapiert (außer die Trivialvariante alles in ner Offscreen-BitMap neu zu blitten und diese dann in den Rastport zu blitten!

Wie wäre denn eine gute Herangehensweise für meine Anforderungen:

  • Objekte liegen "übereinander" in Ebenen, beginnend vom Untergrund bis zur höchsten Ebene (Himmel)
  • Objekte können sich veränderen, die darunter und darüber liegenden Objekte müssen nach so einer Änderung wieder in ihrem aktuellen Zustand aktualisiert werden
  • Der Umgebungsrand (grau auf meinen Screenshots") muss nach "Übermalungen" (z.B. durch animierte Türme am Mauscursor) wieder hersgestellt werden
Ich glaub, das wars im Wesentlichen!
 
Reth   User

2011-07-17, 19:57 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Langsam wird es echt megafrustrierend! Habe nun alles so umgestellt, dass ich zuerst meine ClippingRegion erzeuge, dann BeginRefresh() rufe, danach die dadurch erzeugte ClippingRegion mit meiner VerODERe, das Ergebnis als ClipRegion installiere, den Blit durchführe, die OriginalClipRegion wieder installiere und EndRefresh rufe.

Für das erste anzuzeigende Objekt wird das auch durchgeführt, nur leider wird nix dargestellt (kein Blitergebnis zu sehen)! Beim 2. Objekt komme ich nur bis OrRegionRegion, dann friert alles ein! (Argfhmpfgrfxl!!!) Ich könnte schreien vor Wut (musste mal raus)!

Keine Ahnung was falsch läuft, allerdings ist eines auffällig: Für meine Eigene ClippingRegion wird bei jedem neuen Objekt eine neues Regionobjekt erzeugt und intern mit NewRegion() eine neue Region initialisiert (das liegt am Spielfeldaufbau, für jedes neu ermittelte 6-Eck wird die Schleife für den Aufbau wieder neu gerufen - das ist noch suboptimal). Komisch ist dabei, dass beim ersten und zweiten Aufruf die Adresse der Region-Struct immer die gleiche ist, obwohl nach dem Blitten des 1. Objektes das Region-Objekt zerstört wird (hat nur Scope innerhalb der Schleife), dabei wird DisposeRegion auf die Region-Struct ausgeführt und beim nächsten Refresh wird wieder NewRegion() ausgeführt und das Ergebnis dem Zeiger im Region-Objekt zugewiesen! Ist doch seltsam, dass dabei immer wieder die gleiche Adresse für die Region-Struct verwendet wird, oder (hab ich schon bei den ganzen letzten Tests gemerkt)?

Oder kann es damit zusammenhängen, dass ich die Referenz meiner ClipRegion als const übergebe und über diese Referenz auf den Zeiger meiner Region-Struct zugreife?

Wird immer verrückter! Hab noch nen Test gemacht und BeginRefresh() und EndRefresh() weggelassen. Dann wird auch brav geblittet (darf man diese Funktionen mit dem AOS4-SDK nicht mehr verwenden?)! Allerdings wird auch in Bereiche ausserhalb der erzeugten ClipRegion geblittet und das ist irritierend!

So, um mal beim Blog-Character zu bleiben: Neuer Test mit Begin-/EndRefresh(), aber ohne Verknüpfung meiner Region mit der vorher installierten. Ergebnis: Es wird nichts geblittet, auch nicht ausserhalb meiner selbst erzeugten Region (diese hat folgende Ausmaße: MinX: 0 MinY: 20 MaxX: 810 MaxY: 740, ermittelt mit region->bounds.MinX usw.)!

Zitat:
Original von Holger:
Die aktuelle ClipRegion steht im Layer.

Versuche nun zusätzlich noch die aktuell im Layer des RastPorts befindliche ClippingRegion mit zu VerODERn. Allerdings stellt mir hier das AOS4-SDK ein Bein, da der Zeiger auf die ClipRegion im Layer mit einem CONST versehen wurde! Habe mich erst einmal mit dem Weg-Casten des CONST begnügt, da der Zeiger auf die Region-Struct in meiner selbst gebauten Region-Klasse natürlich nicht CONST ist (und sein kann)! Gibt es hier noch eine bessere Lösung (für meine Konstellation)?

Habe nun auch den letzten Test zusammen mit dem CONST-Hack wiederholt und die vor BeginRefresh() im Layer installierte ClipRegion zu meiner hinzugeODERt. Ergebnis ist immer noch ein leeres Spielfeld, da trotz installierter Region und trotz Begin-/EndRefresh() kein einziger Blit zu ner Darstellung führt! Hab ich noch was übersehen? Muss ich ausser auf Begin-/EndRefresh() auf noch was Anderes achten, z.B. auf Refresh-Messages, die ich dadurch erzeuge? So wie es aussieht erfolgt der Refresh einfach nicht, sobald ich mit und zwischen Begin-/EndRefresh() arbeite! Oder darf ich dann nicht mehr BltMaskBitMapRastPort() verwenden?

[ Dieser Beitrag wurde von Reth am 18.07.2011 um 23:15 Uhr geändert. ]
 
Reth   User

2011-07-12, 23:29 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Zitat:
Original von Thore:
Ist NewMenu nicht in gadtools.h definiert? Wär entsprechend auch dann davon ausgegangen daß es die gadtools verwendet.

Davon bin ich auch ausgegangen, aber weniger wegen der Menüs sondern weil ich dachte, dass die Fenstergadgets dann von GadTools gemacht würden (in meinem Fall werden aber weder Rahmen noch Fenstergadgets angezeigt).
 
Reth   User

2011-07-12, 20:07 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Tja, bin mir nicht 100% sicher. Öhm, wie kann ich das denn zuverlässig feststellen (peinliche Frage)?
Aus der gadtools.library nehme ich derzeit nur die GetVisualInfo- und die LayoutMenus-Funktion.
Für Gadgets nehme ich die AddGadget-Funktion. Allerdings verwende ich struct NewMenu für meine Menüs.
Heisst das nun, ich habe GadTools-Gadgets (in Form der Menüs) oder nicht?
 
Reth   User

2011-07-11, 16:36 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Zitat:
Original von Holger:
Nur noch mal als Gedächtnisstütze: BeginRefresh dient einem primären Zweck: die Damage-Liste in eine aktive Clip-Region umzuwandeln. Wenn Du also Deine Clip-Region vor dem Aufruf setzt, gibt es nur zwei Möglichkeiten: a) die Regionen werden effektiv verknüpft oder b) Deine vorher gesetzt Region wird übergebügelt.

Was davon nun wirklich passiert, sollte man wissen, bevor man sich entscheidet, es so zu tun.

Ups, Du hast recht. Ich weiss nicht genau, was hier passiert. Das war aber schon als nächste Änderung vorgesehen (Umstellung der Reihenfolge zw. BeginRefresh und ClipRegion-Erstellung)!

Zitat:
Original von Holger:
Du solltest außerdem beachten, dass das Logging in eine Textkonsole problematisch werden kann, da diese unter Umständen die Meldung auf den Bildschirm bringen will und das mit den durch Deinen BeginRefresh gelockten Layern interferiert. Da die Ausgabe meist gepuffert ist, treten solche Problem möglicherweise nicht schon bei der ersten Meldung auf. Nur eine Möglichkeit...

Die Textkonsole wird immer auf dem WB Bildschirm geöffnet. Hat für die hier beschriebenen Situationen aber keine Relevanz, da ich alle Ausgaben in eine Textdatei umleite, um die Infos für den Neustart nach dem Freeze parat zu haben.

Zitat:
Original von Holger:
Die Gadtools-Refresh-Aufrufe dienen einzig und allein den über Gadtools angelegten Gadgets. Mit "ganz normal mit struct Gadget" hat das nichts zu tun.

Mit ganz normal meinte ich lediglich BeginRefresh() und EndRefresh() anstelle von GT_BeginRefresh() bzw. GT_EndRefresh().
 
Reth   User

2011-07-10, 15:38 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Nachtrag zu:

So hier noch die beiden Refresh-Methoden, sind als inline im Header angelegt:
C++ code:
inline void beginGadToolsRefresh() { if (window) GT_BeginRefresh(window); }
inline void endGadToolsRefresh() { if (window) GT_EndRefresh(window, TRUE); }

Gemeint ist der Header meiner Window-Klasse und window ist ein Zeiger vom Typ struct window.
 
Reth   User

2011-07-10, 00:01 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Zitat:
Original von Thore:
Sind WindowC und RastPortC von Window und RastPort abgeleitet?

Nicht abgeleitet, beide kapseln mehr oder weniger die entsprechenden Intuition Strukturen und bieten die entsprechenden Funktionen als Methoden an. Ist wie gesagt nur ein Wrapping, keine neue API. In der Fensterklasse findet auch das Messagehandling statt (mir ist dazu noch nichts Besseres eingefallen).
Zitat:
Original von Thore:
Du kannst ja ein DEBUG_OUT definieren, und wenn Debug=True ist, ausgeben und wenn False dann ignorieren. So kannst du prüfen ob es an deinen Ausgaben liegt.

Ja, die Vorgehensweise kenn ich auch. Wollte aber wenn dann möglichst gleich ein "richtiges" Logging einbauen (mit Logleveln usw.), in der Art von Log4J.
Zitat:
Original von Thore:
Bringt er beim Beenden den Fehler? Versuchst Du da irgendwas freizugeben was bereits frei ist oder NULL?

Wie gesagt in der hier geposteten Version friert alles sofort ein, sobald versucht wird das 2. 6-Eck zu blitten (fürs erste läufts noch durch, es wird aber nicht angezeigt). Wenn ich das ganze Clipping mitsamt Regionbildung weglasse ändert sich auch nix. Erst wenn ich die Begin-/EndRefresh-Aufrufe weglasse, dann klappt das blitten (NOCAREREFRESH-Window) und während des Endens des Programms kommt ein recoverable alert, nach dem das Programm beendet ist friert das System komplett ein (vor meiner Umstellung hatte ich keines dieser Probleme, d.h., da hab ich wohl einige üble Sachen eingebaut).
Vielleicht sollte ich statt der Gadtools-Begin-/EndRefresh Aufrufe mal die "normalen" probieren? Habe allerdings Gadgets, die ganz normal mit struct Gadget arbeiten, kein Boopsi, Reaction o.ä.. Daher bin ich davon ausgegangen, dass ich auch die Gadtools-Refresh-Aufrufe benötige!

[ Dieser Beitrag wurde von Reth am 10.07.2011 um 00:13 Uhr geändert. ]
 
Reth   User

2011-07-09, 20:35 h

[ - Direct link - ]
topic: Repository-Server und 68k CrossCompiler für AOS4?
Board: Programmierung

Hallo zusammen,

gibts sowas schon? Kennt da jmd. was?
svn und cvs ausm OS4Depot kenne ich. Bei cvs ist aber soweit ich weiss kein Repositoryserver dabei und bei svn (auch 68k) funktioniert er nicht (wurde mir schon von unterschiedlicher Seite bestätigt, ergaben auch meine Versuche unter AOS4)!

Danke und Ciao
 
Reth   User

2011-07-09, 20:31 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

@Thore:
Meinst Du die Refresh-Schleife? Hier isse (der Formatierer hier zerhaut mir leider die Einrückungen). Ich hoffe, ich muss nicht alles erklären, was (aus meiner Sicht) nichts mit dem Ganzen zu tun hat und in der früheren Version auch prima funktioniert hatte!
Wenn ich das Region-Erstellen und den Begin-/EndRefresh weglasse funktionierts wie gesagt mit dem Recoverable Alert und dem Freeze zu/nach Programmende.
Vernünftiges Logging hab ich wie gesagt auch noch nicht eingebaut, die Logausgaben sind aber mal mit drin (vielleicht machen die ja Probleme)! Wenn ich sie für die Übersichtlichkeit entfernen soll gebt Bescheid!
C++ code:
void AnimObjectManagerC::refreshAllObjects(WindowC& window)
{
    RegionC clipRegion;
    std::vector<RectangleC> rectangles;
    
    long start = time(NULL);
std::cout << "Beginne mit Refresh aller Objekte: " << start << std::endl;
    
    // TODO: Bei beweglichen Objekten auch vorherige Position mit berücksichtigen
     
    /************************************************************************************
     * 1. Durchgehen aller Objekte und Prüfen, welches sich geändert hat                *
     * 2. Für geänderte Objekte original ClippingRegion des Layers ergänzen             *
     * 3. Original ClippingRegion sichern und eigene ClippingRegion installieren        *
     * 4. EraseRect auf ganzes Spielfeld                                                *
     * 5. Alle Objekte entsprechend ihrer Layer von unten nach oben ablaufen und blitten*
     * 6. Alte ClippingRegion wieder herstellen                                         *
     ************************************************************************************/
    
    // 1. Durchgehen aller Objekte und Prüfen, welches sich geändert hat
    for (std::vector<AnimObjectC *>::iterator innerIterator = animObjects.begin(); innerIterator != animObjects.end(); innerIterator++)
    {
        AnimObjectC *animObject = (*innerIterator);
        // 2. Für geänderte Objekte ClippingRegion ergänzen
std::cout << "Prüfe, ob AnimObject: " << animObject << " dargestellt werden will." << std::endl;
        if (animObject->willAnimate())
        {
std::cout << "AnimObject: " << animObject << " will dargestellt." << std::endl;
            // umgebendes Rechteck für aktuelles AnimObjekt in aktueller Darstellung anlegen
            rectangles.push_back(RectangleC(animObject->getYPos(), animObject->getXPos(), animObject->getYPos() + animObject->getActiveAnimation()->getActHeight(),
                                               animObject->getXPos() + animObject->getActiveAnimation()->getActWidth()));
std::cout << "Rechteck " << rectangles.back().getRectangleStruct() << " mit X=" << rectangles.back().getLeft() << " Y=" << rectangles.back().getTop() << " WIDTH=" << rectangles.back().getRight() << " HEIGHT=" << rectangles.back().getBottom() << " für AnimObject: " << animObject << " erzeugt." << std::endl;
            clipRegion.orNewRectangle(rectangles.back());
std::cout << "ClipRegion für AnimObject: " << animObject << " erweitert." << std::endl;
        }
if (!rectangles.empty()) std::cout << "Rechteck in Schleife ist: " << rectangles.back().getRectangleStruct() << " mit X=" << rectangles.back().getLeft() << " Y=" << rectangles.back().getTop() << " WIDTH=" << rectangles.back().getRight() << " HEIGHT=" << rectangles.back().getBottom() << std::endl;
    }

    // wenn nix zu animieren ist => fertig
    if (!rectangles.empty())
    {
std::cout << "Letztes Rechteck nach Schleife ist: " << rectangles.back().getRectangleStruct() << " mit X=" << rectangles.back().getLeft() << " Y=" << rectangles.back().getTop() << " WIDTH=" << rectangles.back().getRight() << " HEIGHT=" << rectangles.back().getBottom() << std::endl;

        layers.unique();    // Duplikate entfernen
        layers.sort();
std::cout << "Layer sortiert und Duplikate eliminiert." << std::endl;
        // 3. Alte ClippingRegion sichern und eigene ClippingRegion installieren
        window.getRastPort().installClipRegion(clipRegion);
std::cout << "ClipRegion installiert." << std::endl;
        window.beginGadToolsRefresh();
std::cout << "GadToolsRefresh gestartet." << std::endl;
        // 4. EraseRect auf ganzes Spielfeld
        window.getRastPort().eraseRect(0, 0, 807, SCREENHEIGHT);
std::cout << "Spielbereich gelöscht." << std::endl;
    // 5. Alle Objekte entsprechend ihrer Layer von unten nach oben ablaufen und blitten
        for (std::list<int>::iterator layerIterator = layers.begin(); layerIterator != layers.end(); layerIterator++)
        {
            std::vector<AnimObjectC *> layerObjects = allObjects[*layerIterator];
               for (std::vector<AnimObjectC *>::iterator objectIterator = layerObjects.begin(); objectIterator != layerObjects.end(); objectIterator++)
               {
                    AnimObjectC *animObject = (*objectIterator);
std::cout << "AnimObject: " << animObject << std::endl;
                    if (animObject->isVisible())
                    {
                        window.getRastPort().blitFrameAt(animObject->getActiveFrame(), animObject->getXPos(), animObject->getYPos());
std::cout << "AnimObject geblittet. XPos=" << animObject->getXPos() << " YPos=" << animObject->getYPos() << " ActWidth=" << animObject->getActWidth() << " ActHeight=" << animObject->getActHeight() << std::endl;
                    }
            }
        }

        window.endGadToolsRefresh();
std::cout << "GadToolsRefresh beendet." << std::endl;
        // 6. Alte ClippingRegion wieder installieren
        window.getRastPort().restoreOldClipRegion();    
std::cout << "Alte ClipRegion wieder hergestellt." << std::endl;
std::cout << "Fertig mit Refresh aller Objekte: " << time(NULL) << " - Dauer: " << (time(NULL) - start) << std::endl;
    }
}


Was passier im Einzelnen:
In jedem Rectangle-Object wird eine struct rectangle mit den Werten befüllt. Die passen soweit überall auch. In der Klasse RegionC hat einen Zeiger auf struct region in sich, der wird im Default-Konstruktor mit NewRegion() initialisiert. Bei orNewRectangle() passiert Folgendes:
C++ code:
void RegionC::orNewRectangle(const RectangleC& newRectangle)
{
std::cout << "OrRectRegion für region: " << region << " und Rechteck: " << newRectangle.getRectangleStruct() << std::endl;
	if (region == NULL) region = NewRegion();
	BOOL result = OrRectRegion(region, newRectangle.getRectangleStruct());
std::cout << "OrRectRegion fertig, Ergebnis: "<< result << std::endl;
}

Bei den Animationen und AnimObjekten war ich noch auf Neubau und Highlevel-API unterwegs. Mittlerweile wrappe ich die nativen Sachen nur noch in Klassen! Die Prüfung der region auf NULL kann ich eigentlich überall weglassen, weil in beiden Konstruktoren immer dafür gesorgt wird, dass der region-Zeiger nicht NULL ist! Aber Vorsicht ist die Mutter...

Die Rastport-Klasse hat nen Zeiger auf strucht rastport in sich und ein Objekt vom Typ RegionC (sie ist als Friend deklariert). Bei installClipRegion passiert Folgendes:
C++ code:
void RastPortC::installClipRegion(const RegionC& clipRegion)
{
    if (rastPort)
    {
std::cout << "Installiere Region. MinX: " << clipRegion.region->bounds.MinX << " MinY: " << clipRegion.region->bounds.MinY << " MaxX: " << clipRegion.region->bounds.MaxX << " MaxY: " << clipRegion.region->bounds.MaxY << std::endl;
        regionBuffer.region = InstallClipRegion(rastPort->Layer, clipRegion.region);
    }
}

Hier der Vollständigkeit halber das Entfernen und der Restore der ClipRegion:
C++ code:
void RastPortC::uninstallClipRegion()
{
    if (rastPort)
    {
        RegionC oldRegion;
        // DisposeRegion für Zeiger auf region struct wird im Destruktor von RegionC gerufen
		oldRegion.region = InstallClipRegion(rastPort->Layer, NULL);
    }
}

void RastPortC::restoreOldClipRegion()
{
    if (rastPort)
    {
	    RegionC oldRegion;
        // DisposeRegion für Zeiger auf region struct wird im Destruktor von RegionC gerufen
		oldRegion.region = InstallClipRegion(rastPort->Layer, NULL);
        InstallClipRegion(rastPort->Layer, regionBuffer.region);
    }
}

EraseRect und das Blitten werden 1:1 durchgereicht.

So hier noch die beiden Refresh-Methoden, sind als inline im Header angelegt:
C++ code:
inline void beginGadToolsRefresh() { if (window) GT_BeginRefresh(window); }
inline void endGadToolsRefresh() { if (window) GT_EndRefresh(window, TRUE); }


So, hoffe das genügt fürs Erste!
 
Reth   User

2011-07-09, 10:45 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Also hab letzte Nacht noch was rausgefunden. Habe mal systematisch die Neuerungen eliminiert. Zuerst das geänderte Regionhandling (das alte hatte funktioniert), so dass immer alles gelöscht und neu gezeichnet wird - immer noch Freeze. Dann Rückstellung auf NOCAREREFRESH - nun hat alles wieder funktioniert (ist aber unakzeptabel). D.h., GT_BeginRefresh/GT_EndRefresh führen bei mir zum Freeze!!!

Leider hatte diese "Lösung" immer noch ein Problem: Bei Beenden des Programms kam ein recoverable Alert, danach beendete sich das Programm und anschließend erfolgt ein kompletter Freeze. Also hab ich wohl noch ein anderes Problem (das zuvor noch nicht da war, kann aber u.U. auch nicht am Programm liegen!)!
Helfen hier eigentlich Zusatzprogramme (wie Mungwall oder was auch immer) und wenn ja, welche?

Da hab ich letzte Nacht wieder bedauert, dass es keinen funktionierenden SVN- oder CVS-Server für AOS gibt, sonst hätte ich mir den letzten, getaggten und funktionierenden Stand schnell mal auschecken können. Hmpf, sehr ärgerlich! Und nen 2. Rechner nebenher laufen zu lassen, nur für Repository seh ich nicht ein!
 
Reth   User

2011-07-09, 00:23 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Hi Holger,
Zitat:
Original von Holger:
Ähm, Du musst Dich nicht bei mir entschuldigen, mir ist es doch egal, ob Du es so oder so machst. Du solltest Dich nur fragen
Funktionieren eigentlich diese Beispiele unter AOS4?
Ist „es stand so in einem Beispiel“ als Erklärung ausreichend, was Dein Code macht?

Das Beispiel findet sich hier und auf allen anderen ähnlich gemachten Sites zur Beschreibung des "klassischen" Amiga-APIs.
Zitat:
Original von Holger:
Was macht es denn nun? Wird die Clip-Region überhaupt verwendet, wird sie mit der Damage-Region verknüpft, wenn ja, via AND oder OR, und wieso erklärt das Beispiel (bzw. dessen Autor) nicht, warum das so gemacht wurde und was passieren soll?

Ja, wird im Bsp. verwendet und als ClipRegion gesetzt. Das Erstellen der ClipRegion wird aber nicht einzeln gezeigt.
Wie oben gesagt erstelle ich meine Region so, dass ich alle Rechtecke der geänderten grafischen Objekte mit OrRectRegion hinzufüge, dann die so erzeugte Region als ClipRegion installiere, meine Blits durchführe und danach die alte ClipRegion wieder installiere. Eine Veroderung meiner ClipRegion mit der ggf. bereits vorhandenen erfolgt noch nicht.
Zitat:
Original von Holger:
Ähem, wenn Du eine komplette BitMap via CPU in eine sichtbare BitMap kopierst, wozu dann überhaupt noch das Double-Buffering?

Also wie gesagt, das Thema Doublebuffering schiebe ich erst mal in den Hintergrund. Das ich damit alles bisher diskutierte vergessen kann war mir klar. Um die Frage für mich zu beantworten hatte ich hier das Doublebuffering so verstanden, dass neben der BitMap des Fensters noch eine nicht sichtbare benutzt wird, die dann immer neu aufgebaut und ins Fenster geblittet wird. Deiner Frage entnehme ich mal, dass dies nicht die beste Lösung ist.
 
Reth   User

2011-07-08, 22:23 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

Gibt es denn irgendwo ne gute Übersicht, was ich bei Intuition, Begin-/EndRefresh und Messages alles beachten muss (neben dem hier bereits gesagtem)?

Codeausschnitte kann ich immer gern posten, den ganzen Code (erst mal noch) nicht. Bis jetzt schon noch closed source.
 
Reth   User

2011-07-08, 20:42 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

@Holger:
Hab ich leider noch nicht probiert (kann man denn aus dem AOS4-G++ cross-compilieren?)! Den letzten Compile-Versuch unter AOS3.9 hatte ich damals mit Abbruch aus Speichermangel. Seit dem hab ichs nie wieder probiert (wüsste auch nicht wie, zudem dauert es ewig!).

Meine erste Vermutung war, dass die erzeugten Rectangle-Objekte schuld sind, da ich die direkt in einer Schleife erstellt habe (ohne Zeiger oder Referenz) und das Objekt dann ja nach der Schleife eigentlich seinen Scope verliert (wenn ich mir das richtig gemerkt habe), so dass die darin gekapselten Rectangle-Strukturen auch futsch waren.
Hab das umgestellt und nun sollte es passen (Objekte werden zwar immer noch in der schleife erzeugt, aber direkt in einem Vector, der außerhalb der Schleife deklariert und definiert wurde)! Trotzdem erfolgt der Freeze immer noch an derselben Stelle. Ich hab bestimmt irgendwo nen dicken Hund bzgl. Reihenfolge und Abhängigkeiten der Intuition-relevanten Teile (Refresh-Funktionen etc.). Nur wo? Muss ich nach meinem Refreshzyklus noch irgendwas anstoßen oder irgendwelche Messages verarbeiten (wie gesagt, das ganze erfolgt außerhalb des Message-Handlings!)?
 
Reth   User

2011-07-08, 17:58 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

@Thore:
Danke für die Tips. Muss das Thema leider erst einmal nach hinten schieben, da sich meine Fehlersuche wie erwartet als "widerlich" erweist: Überlegen, Codestelle ändern, Logausgaben einfügen, compilieren, starten, Rechner kaltstarten, Logfile lesen und von vorn!

Habe wahrscheinlich ein grundsätzliches Problem mit dem Refresh-Handling. Vorher hatte ich immer NOCAREREFRESH und selbst einfach nur geblittet, ohne BeginRefresh/EndRefresh. Jetzt ja nicht mehr.
Beim Aufbau des Spielfeldes wird ein Hexagon nach dem anderen geblittet. Für das Erste läuft der ganze Zyklus auch durch, aber ohne, dass man was zu sehen bekommt. Beim 2. friert das System maximal ein, wenn es zu OrRectRegion kommt. RefreshMessages behandle ich derzeit noch nicht, sondern blitte wie zuvor alles immer selbst, wenn ich es brauche. Liegt es vielleicht daran?
Was ich unabhängig von RefreshMessages mache ist folgendes für jedes Hexagaon:
  • Bestimme aus allen existierenden grafischen Objekten, welches sich darstellen will, für dieses dann folgende Schritte durchführen
  • Rechteck ermitteln
  • Eigene Clipregion erweitern (OrRectRegion)
  • InstallClipRegion mit eigener ermittelten Region rufen, mir die alte Region merken
  • BeginRefresh rufen
  • EraseRect auf ganzen Spielfeldbereich ausführen
  • alle grafischen Objekte blitten
  • EndRefresh rufen
  • die alte gemerkte Region wieder installieren

Hier ist noch nicht die Verknüpfung mit der bereits bestehenden Region enthalten!
(Sorry Holger, dass mit den InstallClipRegion außerhalb von Begin-/EndRefresh hab ich in allen OS-Beispielen auf innoidea usw. so gesehen!)

Wie gesagt friert das System beim 2. Hexagon komplett ein, sobald OrRectRegion aufgerufen wird. Region hat dieselbe Adress wie beim ersten Aufruf, das Rechteck hat die erwarteten Dimensionen! Fehlt hier noch was? Irgendein Intuition-Aufruf? bin am Verzweifeln! V.a. ist die Art des Testens alles andere als effizient oder produktiv (eher stumpfsinnig). Mir ist aber noch nix Besseres eingefallen.
Was mich auch wundert ist, dass für die Region beim 2. Aufruf bei jedem Test dieselbe Adresse benutzt wird, wie beim ersten Aufruf, obwohl der Scope nur innerhalb der aufgerufenen Methode ist. Zufall?
So mich ärgerts gewaltig!
An die Hilfswilligen, wenn ihr mehr Details/Code was auch immer braucht, einfach hier melden!

Dank euch schon mal!
 
Reth   User

2011-07-07, 22:46 h

[ - Direct link - ]
topic: Jabberaccount mit Jabberwocky einrichten
Board: Amiga, AmigaOS 4

Gibt es denn für den Amiga noch ein anderes Chattool, welches unterschiedliche Protokolle, wie Jabber unterstützt? Hab leider noch keines gefunden! Ist nämlich sehr angenehm, wenn man für die unterschiedlichen Dienste nicht immer ein eigenes Tool nehmen muss!

OK, Ergänzung:
Habe im OS4Depot 2 gefunden, aber noch nicht ausprobiert: Pidgion und Epistula.

[ Dieser Beitrag wurde von Reth am 08.07.2011 um 14:08 Uhr geändert. ]
 
Reth   User

2011-07-07, 22:41 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

@Thore:
Und nehme ich dazu einfach 2 BitMaps oder 2 RastPorts (wohl eher BitMaps)?
Wenn ich dann in Richtung 68k denke, dann wäre das wohl die bessere Alternative, da den Speicher die meisten höher getakteten Classics haben dürften, mit der Prozessorpower ist aber beim 68060 Schluss! Dann müsste ich aber immer eine BitMap im Hauptspeicher haben, nicht im Grafikkarten-RAM (denn das ist knapp bemessen)! Kann man das auch über MEMF_CHIP o.ä. steuern?

[ Dieser Beitrag wurde von Reth am 07.07.2011 um 22:44 Uhr geändert. ]
 
Reth   User

2011-07-07, 22:04 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

@Thore:
Das mit dem DoubleBouffer muss ich mir mal im Hinterkopf behalten, wird aber ne Menge Speicher verbrauchen (habe gerade fixe 1024x768 eingestellt)!

Meinst Du das Thema Viewport im Zusammenhang mit Intuition und systemkonform+API oder als 2 unterschiedliche Alternativen (hätte hier eher Letzteres verstanden)?

@All:
So nun ist noch mehr Ärger da. Der Compile unter AOS4 läuft durch (mit -D__USE_INLINE__, da ich eigentlich 68k-kompatibel programmiere) und nach dem Start friert das System so ein, dass sich nicht einmal mehr der Mauszeiger bewegen lässt!
Meine Logausgaben zeigen mir, dass beim Aufbau des Spielfeldes für das erste Hintergrundobjekt noch Alles durchläuft, beim 2. jedoch der Freeze erfolgt!
(Nebenbei: Gibt es denn ein empfehlenswerte Loggingkonzept für Amiga und C++? Mache derzeit alles mit std:out, ohne Loglevels. Dazu noch mit verschachtelten Aufrufen, so dass innerhalb eines std:out eine Objektmethode gerufen wird, die selbst auch noch ein std:out macht! Weiss nicht, ob das gesund ist? Habe mir mal kurz Log4C++ angesehen, aber in Richtung Portierung noch nichts gemacht!)
Das wird wahrscheinlich ne anstrengende Suche, v.a., wenn ich an das nächste Manko denke: Ein fehlender graphischer Source Level Debugger (hier fand ich HiSoftC++ unübertroffen!!!)!

Also dann mal frisch ans Werk (Hände feste reib)!

[ Dieser Beitrag wurde von Reth am 07.07.2011 um 22:30 Uhr geändert. ]
 
Reth   User

2011-07-04, 23:43 h

[ - Direct link - ]
topic: Neue Frage zu Überdeckungen
Board: Programmierung

So, nochmal zu dem Thema hier:
  • BeginRefresh rufen
  • InstallClipRegion rufen
  • mir die zurückgegebene Region merken
  • meine zu aktualisierenden Bereiche zu dieser alten Region hinzu-ODERn
  • wieder InstallClipRegion mit dieser neu ermittelten Region rufen
  • alles blitten
  • die alte gemerkte Region wieder installieren
  • EndRefresh rufen

Bei allen Beispielen, die ich bisher fand (z.B. auf innoidea) kam BeginRefresh() nach InstallClipRegion(), genauso wie EndRefresh! Aber wie soll ich denn dann an die gerade aktive ClipRegion kommen, um meine Bereiche hinzuzufügen?

Aber auch im anderen Fall, also wenn ich BeginRefresh() zuerst rufe: Muss ich denn immer eine Region mit InstallClipRegion setzen, damit ich an die gerade aktuelle ClipRegion komme? Gibt es keine andere Möglichkeit, die aktuelle ClipRegion des RastPorts zu ermitteln, damit ich meine Bereiche hinzufügen kann?!

Das mit dem Thema fehlende High-Level-API stresst immer mehr! Was man sich abmühen muss, nur um ein "paar lumpige Bildchen" animiert darstellen zu können ist abnormal! Und bei dem Aufwand, den ich da treiben muss mit Sicherheit höllisch unperformant!
Ich frage mich immer wieder, wie man das bei so Sachen wie SWIV und NAPALM hinbekommen hat?! Assembler aufs Übelste? Die Zeiten sollten doch hoffentlich vorbei sein! Ich finde, man sollte auch auf dem Amiga heute ein halbwegs normales Spiel in einer Hochsprache performant schreiben können! Befürchte aber, das geht wahrscheinlich nicht (oder nicht so leicht)!

Ja, ja, der Frust macht sich gerade breit hier!
 
 
First << 9 10 11 12 13 -14- 15 16 17 18 19 >> Last Search results: 1858 hits (30 per page)

Search terms
keywords      username
Search options
Only search these boards
   match whole words only
show only titles
show all results

.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.