2015-08-03 3 views
5

Aufruf habe ich eine Struktur wie dieviele Methoden von vielen Objekten viele Male pro Sekunde

abstract Class Entity { 
    //some variables... 
    //some methods ... 
    public abstract void render(Graphics g); 
    } 

Das ist das Mutter ..Now I 3 Kinder haben ..

Class A extends Entity{} 
Class B extends Entity{} 
Class C extends Entity{} 

Jede Klasse einige andere hat Sachen machen rendern. Ein Beispiel ist das Zeichnen eines gelben Kreises, der zweite grüne Text und das dritte Bild wird angezeigt.

Aber ... es ist eine Sache.

Class A have List<B>... 
Class B have List<C>... 

eine Einheit hat zum Beispiel 10 B ... und jeder B 20 Cs hat ... So, jetzt .. Ich habe eine Methode machen, die 60x pro Sekunde macht .. Und ich habe jeden anrufen machen Methode von jedem Objekt.

So habe ich so etwas wie diese

for(A a : listOfAs){ 
    for(B b : listOfBs){ 
     for(C c : listOfCs){ 
     c.render(g); 
     }b.render(g); 
    }a.render(g); 
} 

Nun, wenn Sie sich vorstellen, ich habe viel mehr Objekte so, und ich nenne diese Methode 60x pro Sekunde ... Ich finde das wirklich ... wirklich schlechte Praxis. Ich weiß nicht, wie ich das besser lösen soll oder so ... Ich glaube nicht, dass dies für jede Schleife die beste Lösung ist oder nicht. Irgendwelche Ideen?

Ich dachte an das Kind wie die Umsetzung:

Entity x = new A(); ... 
Entity y = new B(); ... 

und so, aber einige der Klassen haben andere Methoden, wie das geschleift werden müssen, und ich kann sie nicht von den Eltern anrufen.

Für die Render-Methode ... bleiben Sie einfach bei der Tatsache, dass Sie einige Male in einer kurzen Zeit für eine lange Zeit wiederholen müssen.

Ich kann nicht durchkommen ... Ich bin hier für eine lange Zeit stecken geblieben und ich bin mir nicht sicher, wie ich das lösen soll.

+1

ich wie Lambdas fühlen wäre schneller hier, da die verschachtelten foreach-Schleifen Schleifen auftreten 'listOfAs.count' *' listOfBs.count' * 'listOfCs.count' mal während einer Lambda richtig mit irgendeiner Form von HashJoin getan oder inner join kann es in 'listOfAs.count' +' listOfBs.count' + 'listOfCs.count' mal machen. Ich würde den Beweis dafür schreiben, aber das wird deine Frage nicht beantworten. – Adam

+2

Das klingt nach einem Fall, in dem man seine Entities zuerst in ein temporäres Image rendert und dann das in paint/paintComponent malt ... Außerdem muss man nicht wirklich 60x pro Sekunde rendern; das Auge ist nur gut für etwa 24x – ControlAltDel

+0

@Adam Ich bin mir nicht sicher, was Sie meinen, aber ich bin nicht ohne eine gute Erklärung, die ich fürchte, nicht überzeugt! Es gibt eine Reihe von Objekten, die durchlaufen werden müssen; keine Menge an Verbindung kann diese Zahl reduzieren, sicher? Mein Instinkt wäre stattdessen, über Nebenläufigkeit nachzudenken. Eine andere Optimierung könnte darin bestehen, herauszufinden, welche Pixel neu gezeichnet werden und nur den letzten Wert ziehen, obwohl die Kosten den Nutzen überwiegen könnten. – Oly

Antwort

1

Da Ihr Hauptanliegen scheint, bestimmte Entitäten zu rendern oder nicht zu rendern, unabhängig davon, ob es sich um untergeordnete Entitäten handelt, sollten Sie allgemeine Optimierungen und Tricks der Grafikprogrammierung untersuchen und welche Rendering-Engines zur Verbesserung der Leistung verwenden. Ein großer Leistungsgewinn in Rendering-Engines macht keine Arbeit, die nicht notwendig ist.

Eines wurde bereits erwähnt, welches zu ermitteln ist, welcher Status sich tatsächlich geändert hat und nur rendern soll. Eine weitere Möglichkeit besteht darin, die Grenzen Ihrer Ansicht anhand der Grenzen jeder Entität auf dem Grafikbereich zu überprüfen und nur Objekte innerhalb der Grenzen zu rendern. Unabhängig davon, ob Sie 2D oder 3D haben, können Sie sich überlappen, sodass Sie feststellen können, welche Objekte verdeckt sind, und vermeiden, sie zu rendern. Wenn sich Ihre untergeordneten Entitäten innerhalb der Grenzen des übergeordneten Elements befinden, können Sie vermeiden, dass eine gesamte Struktur Ihres Objektdiagramms gerendert wird, und die Iteration vieler Elemente vermeiden.

Auch diese Dinge können in Teilbearbeitungen durchgeführt werden, indem nach einem Teil einer Entität gesucht wird, der erneut gerendert werden muss, ein Teil, der nicht verdeckt wird usw. Dies kann einige Änderungen an Ihrer API erfordern, um Grenzen zu überschreiten Es wird erwartet, dass Entitäten anstelle des gesamten Grafikkontexts für jedes Element gerendert werden.

Wenn Sie nichts anderes über Ihre renderbaren Entitäten wissen, wie z. B. einen schmutzigen Status oder Grenzen, dann müssen Sie alle Iterationen durchführen und jeweils eine davon rendern.

0

Ich bin mir nicht sicher, ob ich recht folge ... Aber machst du eine Entität, die aus mehreren anderen Entitäten besteht? Egal, wie sehr du das durchschaust, du musst jedes Wesen immer einmal besuchen. Es spielt keine Rolle, welche Art von Schleife Sie wählen.

Wenn Sie jedoch eine Entity haben, die aus einer Menge Sprites besteht, würde ich empfehlen, eine neue Textur zu erstellen und diese Sprites einmal auf diese Textur zu rendern. Dann müssen Sie diese Textur nur für jeden Frame rendern. Macht Sinn?

0

Ich fand einen Freund bei der Arbeit, der einen Blick darauf warf und mir half, ihn zu stabilisieren. Vielen Dank für Ihre Tipps und Hilfe. Ich denke nicht, dass Lambdas hier viel helfen können.

Es ist schwer zu erklären, was ich in diesem Projekt mache. Es ist überhaupt kein Spiel. Es ist etwas anderes. Ich habe doppelte Rendering, also ist es wirklich 2 * 30 mal pro Sekunde. Ich habe nur mit der Ladung von Objekten gespielt, die ich später in meiner Engine verwenden kann. Aber dieses Problem hat mich für eine ziemlich lange Zeit feststecken lassen.

Wieder. Danke euch allen .