ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Suche | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
|
||||||
Reth
Nutzer
23.07.2011, 01:26 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: 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
Nutzer
23.07.2011, 01:11 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: Programmierung Zitat: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: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
Nutzer
23.07.2011, 01:05 Uhr [ - Direktlink - ] |
Thema: Unterschied zw. C und C++: Deklaration in while()?
Brett: Programmierung Danke für eure Erläuterungen! Damit hab ich dieses Thema glaub ich kapiert! |
|||||
Reth
Nutzer
22.07.2011, 22:44 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: Programmierung Zitat: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
Nutzer
22.07.2011, 21:08 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: Programmierung Zitat: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: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
Nutzer
22.07.2011, 00:43 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: 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
Nutzer
22.07.2011, 00:15 Uhr [ - Direktlink - ] |
Thema: Unterschied zw. C und C++: Deklaration in while()?
Brett: 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
Nutzer
21.07.2011, 23:37 Uhr [ - Direktlink - ] |
Thema: Unterschied zw. C und C++: Deklaration in while()?
Brett: Programmierung Hallo zusammen, warum klappt das Folgende in C++, aber nicht in C (Codebench und AOS4 SDK)? C code:Compiler sacht: expected expression before 'struct'... while (struct IntuiMessage *my_message = (struct IntuiMessage *)GetMsg(window->UserPort)) { ReplyMsg((struct Message *)my_message); ... Ja wieso das denn? |
|||||
Reth
Nutzer
21.07.2011, 00:17 Uhr [ - Direktlink - ] |
Thema: AOS4 undefined reference to IAsl trotz -D__USE_INLINE__
Brett: Programmierung Hngr! Hatte -l auto beim Linker vergessen! |
|||||
Reth
Nutzer
21.07.2011, 00:09 Uhr [ - Direktlink - ] |
Thema: AOS4 undefined reference to IAsl trotz -D__USE_INLINE__
Brett: 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
Nutzer
20.07.2011, 18:46 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: Programmierung Zitat: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
Nutzer
20.07.2011, 12:55 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: Programmierung Zitat: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: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:Aber das Flimmern und der langsame Bildaufbau sollten bei einer Offscreen-Bitmap doch nicht mehr erfolgen! |
|||||
Reth
Nutzer
19.07.2011, 16:07 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: 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:
|
|||||
Reth
Nutzer
17.07.2011, 19:57 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: 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: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
Nutzer
12.07.2011, 23:29 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: Programmierung Zitat: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
Nutzer
12.07.2011, 20:07 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: 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
Nutzer
11.07.2011, 16:36 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: Programmierung Zitat: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: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:Mit ganz normal meinte ich lediglich BeginRefresh() und EndRefresh() anstelle von GT_BeginRefresh() bzw. GT_EndRefresh(). |
|||||
Reth
Nutzer
10.07.2011, 15:38 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: Programmierung Nachtrag zu: So hier noch die beiden Refresh-Methoden, sind als inline im Header angelegt: C++ code:Gemeint ist der Header meiner Window-Klasse und window ist ein Zeiger vom Typ struct window.inline void beginGadToolsRefresh() { if (window) GT_BeginRefresh(window); } inline void endGadToolsRefresh() { if (window) GT_EndRefresh(window, TRUE); } |
|||||
Reth
Nutzer
10.07.2011, 00:01 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: Programmierung Zitat: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: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: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
Nutzer
09.07.2011, 20:35 Uhr [ - Direktlink - ] |
Thema: Repository-Server und 68k CrossCompiler für AOS4?
Brett: 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
Nutzer
09.07.2011, 20:31 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: 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: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...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; } 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:Hier der Vollständigkeit halber das Entfernen und der Restore der ClipRegion: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); } } C++ code:EraseRect und das Blitten werden 1:1 durchgereicht.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); } } 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
Nutzer
09.07.2011, 10:45 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: 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
Nutzer
09.07.2011, 00:23 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: Programmierung Hi Holger, Zitat:Das Beispiel findet sich hier und auf allen anderen ähnlich gemachten Sites zur Beschreibung des "klassischen" Amiga-APIs. Zitat: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: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
Nutzer
08.07.2011, 22:23 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: 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
Nutzer
08.07.2011, 20:42 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: 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
Nutzer
08.07.2011, 17:58 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: 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:
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
Nutzer
07.07.2011, 22:46 Uhr [ - Direktlink - ] |
Thema: Jabberaccount mit Jabberwocky einrichten
Brett: 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
Nutzer
07.07.2011, 22:41 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: 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
Nutzer
07.07.2011, 22:04 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: 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
Nutzer
04.07.2011, 23:43 Uhr [ - Direktlink - ] |
Thema: Neue Frage zu Überdeckungen
Brett: Programmierung So, nochmal zu dem Thema hier:
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! |
|||||
|
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten. |