Skip to content

Commit

Permalink
优化 iOS 端代码
Browse files Browse the repository at this point in the history
  • Loading branch information
jinleili committed Nov 6, 2024
1 parent 117e2ea commit ad5c9cb
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 66 deletions.
14 changes: 9 additions & 5 deletions Apple/base/MetalView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,28 @@
//

import UIKit
import Foundation

class MetalView: UIView {
override class var layerClass: AnyClass {
return CAMetalLayer.self
}

override func awakeFromNib() {
super.awakeFromNib()
override init(frame: CGRect) {
super.init(frame: frame)
configLayer()
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
configLayer()
self.layer.backgroundColor = UIColor.clear.cgColor
}

private func configLayer() {
guard let layer = self.layer as? CAMetalLayer else {
return
}
self.layer.backgroundColor = UIColor.clear.cgColor

// https://developer.apple.com/documentation/quartzcore/cametallayer/1478157-presentswithtransaction/
layer.presentsWithTransaction = false
layer.framebufferOnly = true
Expand All @@ -30,4 +35,3 @@ class MetalView: UIView {
self.contentScaleFactor = UIScreen.main.nativeScale
}
}

58 changes: 27 additions & 31 deletions Apple/base/ViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
import UIKit

class ViewController: UIViewController {
@IBOutlet var metalV: MetalView!
var wgpuCanvas: OpaquePointer?
@IBOutlet private var metalV: MetalView!
private var wgpuCanvas: OpaquePointer?

lazy var displayLink: CADisplayLink = {
CADisplayLink.init(target: self, selector: #selector(enterFrame))
private lazy var displayLink: CADisplayLink = {
CADisplayLink(target: self, selector: #selector(enterFrame))
}()

override func viewDidLoad() {
Expand All @@ -24,57 +24,53 @@ class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.view.backgroundColor = .white
if wgpuCanvas == nil {
let viewPointer = Unmanaged.passUnretained(self.metalV).toOpaque()
let metalLayer = Unmanaged.passUnretained(self.metalV.layer).toOpaque()
let maximumFrames = UIScreen.main.maximumFramesPerSecond

let viewObj = ios_view_obj(view: viewPointer, metal_layer: metalLayer,maximum_frames: Int32(maximumFrames), callback_to_swift: callback_to_swift)

wgpuCanvas = create_wgpu_canvas(viewObj)
}
self.setupWGPUCanvasIfNeeded()
self.displayLink.isPaused = false
}

override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
displayLink.isPaused = true
self.displayLink.isPaused = true
}

@objc func enterFrame() {
guard let canvas = self.wgpuCanvas else {
return
}
// call rust
@objc private func enterFrame() {
guard let canvas = self.wgpuCanvas else { return }
enter_frame(canvas)
}

@IBAction func changeExample(sender: UISegmentedControl) {
guard let canvas = self.wgpuCanvas else {
return
}
var index = sender.selectedSegmentIndex
if index == 2 {
index = 5
}
@IBAction private func changeExample(sender: UISegmentedControl) {
guard let canvas = self.wgpuCanvas else { return }
let index = sender.selectedSegmentIndex == 2 ? 5 : sender.selectedSegmentIndex
change_example(canvas, Int32(index))
}

private func setupWGPUCanvasIfNeeded() {
guard self.wgpuCanvas == nil else { return }

let viewPointer = Unmanaged.passUnretained(self.metalV).toOpaque()
let metalLayer = Unmanaged.passUnretained(self.metalV.layer).toOpaque()
let maximumFrames = Int32(UIScreen.main.maximumFramesPerSecond)

let viewObj = ios_view_obj_t(
view: viewPointer,
metal_layer: metalLayer,
maximum_frames: maximumFrames,
callback_to_swift: callback_to_swift
)

self.wgpuCanvas = create_wgpu_canvas(viewObj)
}
}

func callback_to_swift(arg: Int32) {
DispatchQueue.main.async {
switch arg {
case 0:
print("wgpu canvas created!")
break
case 1:
print("canvas enter frame")
break

default:
break
}
}

}
21 changes: 9 additions & 12 deletions Apple/base/libwgpu_in_app.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
//
// libwgpu_on_ios.h
// wgpu_test
// libwgpu_in_app.h
//
// Created by LiJinlei on 2021/9/10.
//
Expand All @@ -11,19 +10,17 @@
#include <stdint.h>

// 这个不透明结构体用来指代 Rust 端的 WgpuCanvas 对象
struct wgpu_canvas;
typedef struct wgpu_canvas wgpu_canvas_t;

struct ios_view_obj
{
typedef struct {
void *view;
// CAMetalLayer
void *metal_layer;
int maximum_frames;
void *metal_layer; // CAMetalLayer
int32_t maximum_frames;
void (*callback_to_swift)(int32_t arg);
};
} ios_view_obj_t;

struct wgpu_canvas *create_wgpu_canvas(struct ios_view_obj object);
void enter_frame(struct wgpu_canvas *data);
void change_example(struct wgpu_canvas *data, int32_t index);
wgpu_canvas_t* create_wgpu_canvas(ios_view_obj_t object);
void enter_frame(wgpu_canvas_t* canvas);
void change_example(wgpu_canvas_t* canvas, int32_t index);

#endif /* libwgpu_in_app_h */
12 changes: 12 additions & 0 deletions Apple/base/wgpu_in_app-Bridging-Header.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
//
// wgpu_in_app-Bridging-Header.h
//
// Created by LiJinlei on 2021/9/10.
//

#ifndef wgpu_in_app_Bridging_Header_h
#define wgpu_in_app_Bridging_Header_h

#import "libwgpu_in_app.h"

#endif /* wgpu_in_app_Bridging_Header_h */
12 changes: 0 additions & 12 deletions Apple/base/wgpu_test-Bridging-Header.h

This file was deleted.

12 changes: 6 additions & 6 deletions Apple/wgpu_in_App.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
AD4B200026EB1D31008A6AEE /* MetalView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MetalView.swift; sourceTree = "<group>"; };
AD9EA280293B0CAF0079F1B4 /* libs */ = {isa = PBXFileReference; lastKnownFileType = folder; path = libs; sourceTree = "<group>"; };
ADA4699026EB27CB008B1C7B /* libwgpu_in_app.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = libwgpu_in_app.h; sourceTree = "<group>"; };
ADA4699226EB2F9A008B1C7B /* wgpu_test-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "wgpu_test-Bridging-Header.h"; sourceTree = "<group>"; };
ADA4699226EB2F9A008B1C7B /* wgpu_in_app-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "wgpu_in_app-Bridging-Header.h"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand All @@ -52,7 +52,7 @@
AD4B1FF026EB1B90008A6AEE /* ViewController.swift */,
ADA4699026EB27CB008B1C7B /* libwgpu_in_app.h */,
AD4B200026EB1D31008A6AEE /* MetalView.swift */,
ADA4699226EB2F9A008B1C7B /* wgpu_test-Bridging-Header.h */,
ADA4699226EB2F9A008B1C7B /* wgpu_in_app-Bridging-Header.h */,
AD4B1FEC26EB1B90008A6AEE /* AppDelegate.swift */,
AD4B1FF226EB1B90008A6AEE /* Main.storyboard */,
AD4B1FF526EB1B91008A6AEE /* Assets.xcassets */,
Expand Down Expand Up @@ -336,13 +336,13 @@
MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "com.lijinlei.zixi.wgpu-test";
PRODUCT_BUNDLE_IDENTIFIER = com.daylight.test.wgpu;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_OBJC_BRIDGING_HEADER = "base/wgpu_test-Bridging-Header.h";
SWIFT_OBJC_BRIDGING_HEADER = "base/wgpu_in_app-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,6,7";
};
Expand Down Expand Up @@ -372,13 +372,13 @@
MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "com.lijinlei.zixi.wgpu-test";
PRODUCT_BUNDLE_IDENTIFIER = com.daylight.test.wgpu;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES;
SWIFT_OBJC_BRIDGING_HEADER = "base/wgpu_test-Bridging-Header.h";
SWIFT_OBJC_BRIDGING_HEADER = "base/wgpu_in_app-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,6,7";
};
Expand Down
Binary file not shown.

0 comments on commit ad5c9cb

Please sign in to comment.