Skip to content

Commit b2061f1

Browse files
[ios] Using UnsafeBufferPointer to skip data copying and boost performance. (#2686)
* [ios] Using UnsafeBufferPointer to skip data copying and boost performance. * [ios] Fix the extra data copying caused by using and move the guard let condition to be earlier
1 parent 227adda commit b2061f1

File tree

4 files changed

+225
-143
lines changed

4 files changed

+225
-143
lines changed

spine-cpp/spine-cpp-lite/spine-cpp-lite-codegen.py

+31-11
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,6 @@ def write(self):
239239

240240
if swift_return_type_is_array:
241241
body += self.write_array_call(num_function_name, function_call)
242-
body += inset + inset
243-
body += "}"
244242
else:
245243
if not self.spine_function.return_type == "void":
246244
body += "return "
@@ -305,24 +303,46 @@ def write_c_function_call(self, spine_params):
305303
function_call += " != 0"
306304

307305
return function_call
308-
309-
def write_array_call(self, num_function_name, function_call):
310-
array_call = f"let num = Int({num_function_name}({self.spine_object.var_name}))"
306+
307+
def write_array_spine_class(self, num_function_name, function_call):
308+
array_call = f"let ptr = {function_call}"
311309
array_call += "\n"
312310
array_call += inset + inset
313-
array_call += f"let ptr = {function_call}"
311+
array_call += "guard let validPtr = ptr else { return [] }"
314312
array_call += "\n"
315313
array_call += inset + inset
316-
array_call += "return (0..<num).compactMap {"
314+
array_call += f"let num = Int({num_function_name}({self.spine_object.var_name}))"
315+
array_call += "\n"
316+
array_call += inset + inset
317+
array_call += "let buffer = UnsafeBufferPointer(start: validPtr, count: num)"
318+
array_call += "\n"
319+
array_call += inset + inset
320+
array_call += "return buffer.compactMap {"
317321
array_call += "\n"
318322
array_call += inset + inset + inset
319-
323+
array_call += "$0.flatMap { .init($0) }"
324+
array_call += "\n"
325+
array_call += inset + inset
326+
array_call += "}"
327+
return array_call
328+
329+
def write_array_call(self, num_function_name, function_call):
320330
if self.spine_function.isReturningSpineClass():
321-
array_call += "ptr?[$0].flatMap { .init($0) }"
322-
else:
323-
array_call += "ptr?[$0]"
331+
return self.write_array_spine_class(num_function_name, function_call)
332+
array_call = f"let ptr = {function_call}"
333+
array_call += "\n"
334+
array_call += inset + inset
335+
array_call += "guard let validPtr = ptr else { return [] }"
336+
array_call += "\n"
337+
array_call += inset + inset
338+
array_call += f"let num = Int({num_function_name}({self.spine_object.var_name}))"
339+
array_call += "\n"
340+
array_call += inset + inset
324341

342+
array_call += "let buffer = UnsafeBufferPointer(start: validPtr, count: num)"
325343
array_call += "\n"
344+
array_call += inset + inset
345+
array_call += "return Array(buffer)"
326346
return array_call
327347

328348
def write_dispose_call(self):

spine-ios/Sources/Spine/Extensions/RenderCommand+Vertices.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ extension RenderCommand {
1010
let positions = positions(numVertices: numVertices)
1111
let uvs = uvs(numVertices: numVertices)
1212
let colors = colors(numVertices: numVertices)
13-
13+
vertices.reserveCapacity(indices.count)
1414
for i in 0..<indices.count {
1515
let index = Int(indices[i])
1616

spine-ios/Sources/Spine/Spine.Generated+Extensions.swift

+9-3
Original file line numberDiff line numberDiff line change
@@ -215,19 +215,25 @@ internal extension RenderCommand {
215215
func positions(numVertices: Int) -> [Float] {
216216
let num = numVertices * 2
217217
let ptr = spine_render_command_get_positions(wrappee)
218-
return (0..<num).compactMap { ptr?[$0] }
218+
guard let validPtr = ptr else { return [] }
219+
let buffer = UnsafeBufferPointer(start: validPtr, count: num)
220+
return Array(buffer)
219221
}
220222

221223
func uvs(numVertices: Int) -> [Float] {
222224
let num = numVertices * 2
223225
let ptr = spine_render_command_get_uvs(wrappee)
224-
return (0..<num).compactMap { ptr?[$0] }
226+
guard let validPtr = ptr else { return [] }
227+
let buffer = UnsafeBufferPointer(start: validPtr, count: num)
228+
return Array(buffer)
225229
}
226230

227231
func colors(numVertices: Int) ->[Int32] {
228232
let num = numVertices
229233
let ptr = spine_render_command_get_colors(wrappee)
230-
return (0..<num).compactMap { ptr?[$0] }
234+
guard let validPtr = ptr else { return [] }
235+
let buffer = UnsafeBufferPointer(start: validPtr, count: num)
236+
return Array(buffer)
231237
}
232238
}
233239

0 commit comments

Comments
 (0)