Ich erstellte eine MPxLocatorNode
mit Maya API in C++. Der Knoten hat keine compute
Methode, es hat nur verschiedene Arten von Formen, die mit Open gl in der draw
Methode gezeichnet wird.Optimieren MPxLocatorNode zeichnen
Ein Stil, den es zeichnet, ist das Kreuz, genau das gleiche wie ein Locator. Also habe ich einige Benchmarks genommen, um es mit einem nativen Locator zu vergleichen, und festgestellt, dass die Leistung meines Knotens viel langsamer ist. Maya's Locator war ungefähr 4x schneller!
1000 Knoten
Mein Knoten: 74 fps
Maya Locator: 300 fps
Was mache ich falsch, dass die Leistung meiner Knotens verlangsamt? Das einzige, was ich mir vorstellen kann, ist, dass ich die MObjects
meines Knotens über MPlug
in der draw
Methode bekomme, im Gegensatz dazu, sie aus einem Datenblock zu bekommen, wie Sie es in der compute
Methode könnten.
Meine cpp-Datei ist unten. Der Großteil der Verlangsamung sollte in der Draw-Methode sein.
#include "point.h"
MTypeId Point::id(0x00000900);
MObject Point::input_display;
MObject Point::input_box;
MObject Point::input_cross;
MObject Point::input_tick;
MObject Point::input_axis;
MObject Point::input_color;
MColorArray Point::colors;
Point::Point() {
}
void Point::postConstructor() {
MObject self = thisMObject();
MFnDependencyNode fn_node(self);
fn_node.setName("pointShape#");
}
Point::~Point() {
}
void* Point::creator() {
return new Point();
}
MStatus Point::initialize() {
MFnNumericAttribute nAttr;
input_display = nAttr.create("display", "display", MFnNumericData::kInt, 1);
nAttr.setKeyable(true);
nAttr.setMin(0);
nAttr.setMax(1);
addAttribute(input_display);
input_box = nAttr.create("box", "box", MFnNumericData::kInt, 0);
nAttr.setKeyable(true);
nAttr.setMin(0);
nAttr.setMax(1);
addAttribute(input_box);
input_cross = nAttr.create("cross", "cross", MFnNumericData::kInt, 1);
nAttr.setKeyable(true);
nAttr.setMin(0);
nAttr.setMax(1);
addAttribute(input_cross);
input_tick = nAttr.create("tick", "tick", MFnNumericData::kInt, 0);
nAttr.setKeyable(true);
nAttr.setMin(0);
nAttr.setMax(1);
addAttribute(input_tick);
input_axis = nAttr.create("axis", "axis", MFnNumericData::kInt, 0);
nAttr.setKeyable(true);
nAttr.setMin(0);
nAttr.setMax(1);
addAttribute(input_axis);
MFnEnumAttribute eAttr;
input_color = eAttr.create("color", "color", MFnData::kNumeric);
eAttr.addField("Black", 0);
eAttr.addField("Grey", 1);
eAttr.addField("White", 2);
eAttr.addField("Red", 3);
eAttr.addField("Light red", 4);
eAttr.addField("Dark red", 5);
eAttr.addField("Green", 6);
eAttr.addField("Light green", 7);
eAttr.addField("Dark green", 8);
eAttr.addField("Blue", 9);
eAttr.addField("Light blue", 10);
eAttr.addField("Dark blue", 11);
eAttr.addField("Purple", 12);
eAttr.addField("Magenta", 13);
eAttr.addField("Brown", 14);
eAttr.addField("Yellow", 15);
eAttr.addField("Dark yellow", 16);
eAttr.addField("Orange", 17);
eAttr.setDefault(8);
eAttr.setKeyable(true);
eAttr.setStorable(true);
addAttribute(input_color);
colors.append(MColor(0.0f, 0.0f, 0.0f)); // black
colors.append(MColor(0.5f, 0.5f, 0.5f)); // grey
colors.append(MColor(1.0f, 1.0f, 1.0f)); // white
colors.append(MColor(1.0f, 0.0f, 0.0f)); // red
colors.append(MColor(1.0f, 0.6899999976158142f, 0.6899999976158142f)); // light_red
colors.append(MColor(0.5f, 0.0f, 0.0f)); // dark_red
colors.append(MColor(0.0f, 1.0f, 0.0f)); // green
colors.append(MColor(0.5f, 1.0f, 0.5f)); // light_green
colors.append(MColor(0.0f, 0.25f, 0.0f)); // dark_green
colors.append(MColor(0.1889999955892563f, 0.6299999952316284f, 0.6299999952316284f)); // blue
colors.append(MColor(0.3919999897480011f, 0.8629999756813049f, 1.0f)); // light_blue
colors.append(MColor(0.0f, 0.01600000075995922f, 0.37599998712539673f)); // dark_blue
colors.append(MColor(0.25f, 0.0f, 0.25f)); // purple
colors.append(MColor(1.0f, 0.0f, 1.0f)); // magenta
colors.append(MColor(0.75f, 0.2f, 0.0f)); // brown
colors.append(MColor(1.0f, 1.0f, 0.0f)); // yellow
colors.append(MColor(0.62117999792099f, 0.6299999952316284f, 0.1889999955892563f)); // dark_yellow
colors.append(MColor(1.0f, 0.5f, 0.0f)); // orange
return MS::kSuccess;
}
void Point::draw(M3dView& view, const MDagPath& mdag_path,
M3dView::DisplayStyle display_style,
M3dView::DisplayStatus display_status) {
MObject self = thisMObject();
int display = MPlug(self, input_display).asInt();
int use_box = MPlug(self, input_box).asInt();
int use_cross = MPlug(self, input_cross).asInt();
int use_tick = MPlug(self, input_tick).asInt();
int use_axis = MPlug(self, input_axis).asInt();
int color_index = MPlug(self, input_color).asInt();
if (display == 0) {
return;
}
MPlug local_position = MFnDependencyNode(thisMObject()).findPlug("localPosition");
float tx = local_position.child(0).asFloat();
float ty = local_position.child(1).asFloat();
float tz = local_position.child(2).asFloat();
MPlug local_scale = MFnDependencyNode(thisMObject()).findPlug("localScale");
float sx = local_scale.child(0).asFloat();
float sy = local_scale.child(1).asFloat();
float sz = local_scale.child(2).asFloat();
MColor color;
switch (display_status) {
case M3dView::kActive:
color = MColor(1.0f, 1.0f, 1.0f);
break;
case M3dView::kLead:
color = MColor(0.26f, 1.0f, 0.64f);
break;
case M3dView::kActiveAffected:
color = MColor(0.783999979496f, 0.0f, 0.783999979496f);
break;
case M3dView::kTemplate:
color = MColor(0.469999998808f, 0.469999998808f, 0.469999998808f);
break;
case M3dView::kActiveTemplate:
color = MColor(1.0f, 0.689999997616f, 0.689999997616f);
break;
default:
color = colors[color_index];
}
view.beginGL();
if (use_axis == 1) {
view.setDrawColor(MColor(1.0, 0, 0));
view.drawText("x", MPoint(sx + tx, ty, tz), M3dView::kCenter);
view.setDrawColor(MColor(0, 1.0, 0));
view.drawText("y", MPoint(tx, sy + ty, tz), M3dView::kCenter);
view.setDrawColor(MColor(0, 0, 1.0));
view.drawText("z", MPoint(tx, ty, sz + tz), M3dView::kCenter);
}
glPushAttrib(GL_CURRENT_BIT);
glEnable(GL_BLEND);
glBegin(GL_LINES);
if (use_box == 1) {
glColor3f(color.r, color.g, color.b);
// Top
glVertex3f(-sx + tx, sy + ty, -sz + tz);
glVertex3f(sx + tx, sy + ty, -sz + tz);
glVertex3f(sx + tx, sy + ty, -sz + tz);
glVertex3f(sx + tx, sy + ty, sz + tz);
glVertex3f(sx + tx, sy + ty, sz + tz);
glVertex3f(-sx + tx, sy + ty, sz + tz);
glVertex3f(-sx + tx, sy + ty, sz + tz);
glVertex3f(-sx + tx, sy + ty, -sz + tz);
// Bottom
glVertex3f(-sx + tx, -sy + ty, -sz + tz);
glVertex3f(sx + tx, -sy + ty, -sz + tz);
glVertex3f(sx + tx, -sy + ty, -sz + tz);
glVertex3f(sx + tx, -sy + ty, sz + tz);
glVertex3f(sx + tx, -sy + ty, sz + tz);
glVertex3f(-sx + tx, -sy + ty, sz + tz);
glVertex3f(-sx + tx, -sy + ty, sz + tz);
glVertex3f(-sx + tx, -sy + ty, -sz + tz);
// Left
glVertex3f(-sx + tx, -sy + ty, -sz + tz);
glVertex3f(-sx + tx, sy + ty, -sz + tz);
glVertex3f(-sx + tx, sy + ty, -sz + tz);
glVertex3f(-sx + tx, sy + ty, sz + tz);
glVertex3f(-sx + tx, sy + ty, sz + tz);
glVertex3f(-sx + tx, -sy + ty, sz + tz);
glVertex3f(-sx + tx, -sy + ty, sz + tz);
glVertex3f(-sx + tx, -sy + ty, -sz + tz);
// Right
glVertex3f(sx + tx, -sy + ty, -sz + tz);
glVertex3f(sx + tx, sy + ty, -sz + tz);
glVertex3f(sx + tx, sy + ty, -sz + tz);
glVertex3f(sx + tx, sy + ty, sz + tz);
glVertex3f(sx + tx, sy + ty, sz + tz);
glVertex3f(sx + tx, -sy + ty, sz + tz);
glVertex3f(sx + tx, -sy + ty, sz + tz);
glVertex3f(sx + tx, -sy + ty, -sz + tz);
}
if (use_cross == 1) {
glColor3f(color.r, color.g, color.b);
glVertex3f(tx, -sy + ty, tz);
glVertex3f(tx, sy + ty, tz);
glVertex3f(-sx + tx, ty, tz);
glVertex3f(sx + tx, ty, tz);
glVertex3f(tx, ty, -sz + tz);
glVertex3f(tx, ty, sz + tz);
}
if (use_tick == 1) {
glColor3f(color.r, color.g, color.b);
glVertex3f((-sx*0.05f) + tx, (sy*0.05f) + ty, tz);
glVertex3f((sx*0.05f) + tx, (-sy*0.05f) + ty, tz);
glVertex3f((sx*0.05f) + tx, (sy*0.05f) + ty, tz);
glVertex3f((-sx*0.05f) + tx, (-sy*0.05f) + ty, tz);
glVertex3f(tx, (sy*0.05f) + ty, (-sz*0.05f) + tz);
glVertex3f(tx, (-sy*0.05f) + ty, (sz*0.05f) + tz);
glVertex3f(tx, (sy*0.05f) + ty, (sz*0.05f) + tz);
glVertex3f(tx, (-sy*0.05f) + ty, (-sz*0.05f) + tz);
glVertex3f((sx*0.05f) + tx, ty, (-sz*0.05f) + tz);
glVertex3f((-sx*0.05f) + tx, ty, (sz*0.05f) + tz);
glVertex3f((sx*0.05f) + tx, ty, (sz*0.05f) + tz);
glVertex3f((-sx*0.05f) + tx, ty, (-sz*0.05f) + tz);
}
if (use_axis == 1) {
glColor3f(color.r, color.g, color.b);
if (display_status == M3dView::kDormant) {
glColor3f(1.0f, 0.0f, 0.0f);
}
glVertex3f(tx, ty, tz);
glVertex3f(sx + tx, ty, tz);
if (display_status == M3dView::kDormant) {
glColor3f(0.0f, 1.0f, 0.0f);
}
glVertex3f(tx, ty, tz);
glVertex3f(tx, sy + ty, tz);
if (display_status == M3dView::kDormant) {
glColor3f(0.0f, 0.0f, 1.0f);
}
glVertex3f(tx, ty, tz);
glVertex3f(tx, ty, sz + tz);
}
glEnd();
glDisable(GL_BLEND);
glPopAttrib();
view.endGL();
}
bearbeiten
ich Teile des Codes zu kommentieren die Verlangsamung ist, um herauszufinden, wo und es sieht so aus, sobald ich Kommentar- gl die Leistung zeichnen Methoden von 300 fps bis 80 fps fällt. Whaddup damit?
Dank! Ich habe es geschafft, es um 10% schneller zu bekommen, indem ich 'findPlug' entferne. Ich habe beide Benchmarks im alten Ansichtsfenster gemacht, also sollte es Fair Play sein. Ich würde Draw für Viewport 2.0 selbst implementieren, aber es lässt meinen Kopf explodieren, wie kompliziert es aussieht. –
ja, aber das ist der einzige Weg, um einige Leistungsverbesserungen zu erhalten, wenn Sie immer noch GL-Code verwenden, sogar auf VP2, werden Sie nicht besser – cyrille
Gibt es ein anständiges Beispiel, wie man es implementiert? Jeder, den ich fand, war entweder unvollständig oder ein bisschen zu kompliziert. –