performance optimizations (reducing allocations)
This commit is contained in:
parent
aa0f7462ec
commit
43bdd39739
44
graphics.go
44
graphics.go
|
@ -23,46 +23,58 @@ func (td *TrianglesData) Draw() {
|
||||||
panic(fmt.Errorf("%T.Draw: invalid operation", td))
|
panic(fmt.Errorf("%T.Draw: invalid operation", td))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update copies vertex properties from the supplied Triangles into this TrianglesData.
|
func (td *TrianglesData) resize(len int) {
|
||||||
//
|
if len > td.Len() {
|
||||||
// TrianglesPosition, TrianglesColor and TrianglesTexture are supported.
|
newData := make(TrianglesData, len-td.Len())
|
||||||
func (td *TrianglesData) Update(t Triangles) {
|
// default values
|
||||||
if t.Len() > td.Len() {
|
for i := range newData {
|
||||||
*td = append(*td, make(TrianglesData, t.Len()-td.Len())...)
|
newData[i].Color = NRGBA{1, 1, 1, 1}
|
||||||
|
newData[i].Texture = V(-1, -1)
|
||||||
|
}
|
||||||
|
*td = append(*td, newData...)
|
||||||
}
|
}
|
||||||
if t.Len() < td.Len() {
|
if len < td.Len() {
|
||||||
*td = (*td)[:t.Len()]
|
*td = (*td)[:len]
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (td *TrianglesData) updateData(offset int, t Triangles) {
|
||||||
// fast path optimization
|
// fast path optimization
|
||||||
if t, ok := t.(*TrianglesData); ok {
|
if t, ok := t.(*TrianglesData); ok {
|
||||||
copy(*td, *t)
|
copy((*td)[offset:], *t)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// slow path manual copy
|
// slow path manual copy
|
||||||
if t, ok := t.(TrianglesPosition); ok {
|
if t, ok := t.(TrianglesPosition); ok {
|
||||||
for i := range *td {
|
for i := offset; i < len(*td); i++ {
|
||||||
(*td)[i].Position = t.Position(i)
|
(*td)[i].Position = t.Position(i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if t, ok := t.(TrianglesColor); ok {
|
if t, ok := t.(TrianglesColor); ok {
|
||||||
for i := range *td {
|
for i := offset; i < len(*td); i++ {
|
||||||
(*td)[i].Color = NRGBAModel.Convert(t.Color(i)).(NRGBA)
|
(*td)[i].Color = t.Color(i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if t, ok := t.(TrianglesTexture); ok {
|
if t, ok := t.(TrianglesTexture); ok {
|
||||||
for i := range *td {
|
for i := offset; i < len(*td); i++ {
|
||||||
(*td)[i].Texture = t.Texture(i)
|
(*td)[i].Texture = t.Texture(i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Update copies vertex properties from the supplied Triangles into this TrianglesData.
|
||||||
|
//
|
||||||
|
// TrianglesPosition, TrianglesColor and TrianglesTexture are supported.
|
||||||
|
func (td *TrianglesData) Update(t Triangles) {
|
||||||
|
td.resize(t.Len())
|
||||||
|
td.updateData(0, t)
|
||||||
|
}
|
||||||
|
|
||||||
// Append adds supplied Triangles to the end of the TrianglesData.
|
// Append adds supplied Triangles to the end of the TrianglesData.
|
||||||
func (td *TrianglesData) Append(t Triangles) {
|
func (td *TrianglesData) Append(t Triangles) {
|
||||||
newTd := make(TrianglesData, t.Len())
|
td.resize(td.Len() + t.Len())
|
||||||
newTd.Update(t)
|
td.updateData(td.Len()-t.Len(), t)
|
||||||
*td = append(*td, newTd...)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy returns an exact independent copy of this TrianglesData.
|
// Copy returns an exact independent copy of this TrianglesData.
|
||||||
|
|
|
@ -400,9 +400,10 @@ func (wt *windowTriangles) resize(len int) {
|
||||||
newData := make([]pixelgl.VertexData, len-wt.Len())
|
newData := make([]pixelgl.VertexData, len-wt.Len())
|
||||||
// default values
|
// default values
|
||||||
for i := range newData {
|
for i := range newData {
|
||||||
newData[i] = make(pixelgl.VertexData)
|
newData[i] = pixelgl.VertexData{
|
||||||
newData[i][colorVec4] = mgl32.Vec4{1, 1, 1, 1}
|
colorVec4: mgl32.Vec4{1, 1, 1, 1},
|
||||||
newData[i][textureVec2] = mgl32.Vec2{-1, -1}
|
textureVec2: mgl32.Vec2{-1, -1},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
wt.data = append(wt.data, newData...)
|
wt.data = append(wt.data, newData...)
|
||||||
}
|
}
|
||||||
|
@ -423,7 +424,7 @@ func (wt *windowTriangles) updateData(offset int, t Triangles) {
|
||||||
}
|
}
|
||||||
if t, ok := t.(TrianglesColor); ok {
|
if t, ok := t.(TrianglesColor); ok {
|
||||||
for i := offset; i < offset+t.Len(); i++ {
|
for i := offset; i < offset+t.Len(); i++ {
|
||||||
col := NRGBAModel.Convert(t.Color(i)).(NRGBA)
|
col := t.Color(i)
|
||||||
wt.data[i][colorVec4] = mgl32.Vec4{
|
wt.data[i][colorVec4] = mgl32.Vec4{
|
||||||
float32(col.R),
|
float32(col.R),
|
||||||
float32(col.G),
|
float32(col.G),
|
||||||
|
|
Loading…
Reference in New Issue