原文
通过遵循arsd:simpledisplay
(v11.0.0
之前)上的一些旧代码,Apple
的文档和Jacob
的这一惊人贡献桥,
我已从金属绑定
中删除了所有extern(Objective-C)
代码,现在,所有Objective-C
桥接代码都是使用D的反射
生成的.
因此,给定此例代码:
import core.attribute : selector;
extern(Objective-C):
class MTKView
{
//创建要绘画到当前可绘画对象中的渲染传递描述符.
@selector("currentRenderPassDescriptor")
MTLRenderPassDescriptor currentRenderPassDescriptor();
}
class MTKView2 : MTKView
{
//创建要绘画到当前可绘画对象中的渲染传递描述符.
@selector("currentRenderPassDescriptor2")
MTLRenderPassDescriptor currentRenderPassDescriptor2();
}
现在有:
mtkview.d
module mtkview;
import objc.meta : selector;
@ObjectiveC final extern(C++):
class MTKView
{
//创建要绘画到当前可绘画对象中的渲染传递描述符.
@selector("currentRenderPassDescriptor")
MTLRenderPassDescriptor currentRenderPassDescriptor();
}
class MTKView2
{
mixin ObjcExtends!(MTKView);
//创建要绘画到当前可绘画对象中的渲染传递描述符.
@selector("currentRenderPassDescriptor2")
MTLRenderPassDescriptor currentRenderPassDescriptor2();
}
//metal_gen.d
module metal_gen;
import mtkview;
mixin ObjcLinkModule!(mtkview);
这是如何从单独编译
中获得实际优势
的示例,分开编译反射
与接口
代码可带来更好编译速度.
mixin ObjcLinkModule
用来迭代每个@ObjectiveC
的UDA
,为类和接口
中定义的每个方法
生成实现.(是的,可在其他
文件中实现类方法
).
final
用来使D
避免使用虚表
,因为ObjectiveC
对象不遵循D约定
,因此要取名字空间和指针
.这样,甚至可制作出不会出现段错误
的如下有效代码
:
import mtkview;
(cast(MTKView)(new int)).currentRenderPassDescriptor;
虽然extern(C++)
基本上是通过不生成TypeInfo
来节省
一些内存,且可在因段错误
而需要转换
时,避免D动态转换
.
尽管接口代码
不像以前那样干净,但对用户来说,唯一改变
的是,因为所有类
都是最终
的,因此不会按其父类隐式转换
,而需要显式转换
.
我想,支持iOS
和M1
是合理的.只是在整个引擎
中,在更改绑定
后,需要修复大约2行
代码,因此,前端用户仍会有个好看
代码.
D金属绑定
未来,提供对HipremeEngine
对iOS
支持,并在MacOS
的构建
选择器上,提供官方LDC
支持,这样对普通用户,几乎可在所有平台使用该引擎