这可能是一个失败的原因,但我会问,因为我老实说只是好奇......
我们有一个客户想要为OS X创建替代消息应用程序.他们基本上想要使用相同的帐户,聊天记录和所有内容,但为内置消息提供完全不同的UI(对于有特定残疾的人) .应用程序.鉴于Messages.app,iMessage中的主要服务完全没有记录,因此创建他们自己的消息传递应用程序是不会飞的,所以支持使用第三方代码几乎是不可能的.
经过初步研究,显而易见的是,有文档记录的AppleScript方法将提供一个可行但粗略的解决方案,缺少原始应用程序的许多功能(例如打字时的指示等),更不用说它需要保留原始正在运行的消息应用程序会分散用户的注意力
那时我们开始深入挖掘并找到了IMCore.framework.IMCore基本上是Messages.app用来与各种服务进行通信的,它的引擎就是imagent管理数据,实际上与各种IM服务器进行通信.IMCore是一个私有框架,显然使用起来有些风险(并自动从App Store中排除他们的应用程序),但我们的假设是,对于OS X,我们仍然应该能够实现这一点并将应用程序分发到App Store之外而不是很难.
我们开始尝试IMCore(同时逆向工程Messages.app以查看它是如何使用的),并取得了一些进展.我们能够成功连接到imagent进程并执行多个配置操作,但后来发现数据模型基本上是空的 - 我们无法看到任何用户的数据或与任何IM服务通信,即使我们'在用户的安全上下文中重新运行.
然后我们注意到Messages.app有一些非常奇怪的未记录的权利,例如com.apple.private.imcore.imdpersistence.database-access和com.apple.imagent.在这一点上,我们假设这些权利是我们为了成功沟通而缺少的权利imagent.我们已经尝试将这些权利添加到我们自己的应用程序中,并且能够成功构建并对其进行编码,但是当程序启动时,它会在启动时因系统消息而崩溃EXC_CRASH (Code Signature Invalid)(Xcode说Terminated due to code signing error).
我们可怕的假设是Apple锁定了他们的私有权利,这样系统就不会接受使用它们的二进制文件,除非它是由Apple直接签名的,但这显然是一种理论.另一个问题是,如何imagent知道我们的二元是否具有这些权利?我们不能以某种方式欺骗这些权利吗?
正如我所说,感觉就像一个失败的原因,但谁知道.我猜猜在iOS上做过铁杆越狱工作的人可能会有一两个想法 - 任何人?
当尝试使用Metal从内存中快速将像素缓冲区绘制到屏幕时,我们创建MTLBuffer对象MTLDevice.makeBuffer(bytesNoCopy:..)以允许GPU直接从内存中读取像素而无需复制它.共享内存实际上是实现良好像素传输性能的必备条件.
问题是makeBuffer需要页面对齐的内存地址和页面对齐length.这些要求不仅在文档中 - 它们也是使用运行时断言强制执行的.
我写的代码必须处理各种传入的分辨率和像素格式,偶尔我会得到未对齐的缓冲区或未对齐的长度.在研究了这个之后,我发现了一个允许我为这些实例使用共享内存的hack.
基本上我所做的是将未对齐的缓冲区地址向下舍入到最近的页面边界,并使用offset参数from makeTexture来确保GPU从正确的位置开始读取.然后我向上舍length入到最近的页面大小.显然内存将是有效的(因为分配只能在页面边界上发生),我认为可以安全地假设GPU没有写入或破坏该内存.
这是我用来从未对齐的缓冲区分配共享缓冲区的代码:
extension MTLDevice {
func makeTextureFromUnalignedBuffer(textureDescriptor : MTLTextureDescriptor, bufferPtr : UnsafeMutableRawPointer, bufferLength : UInt, bytesPerRow : Int) -> MTLTexture? {
var calculatedBufferLength = bufferLength
let pageSize = UInt(getpagesize())
let pageSizeBitmask = UInt(getpagesize()) - 1
let alignedBufferAddr = UnsafeMutableRawPointer(bitPattern: UInt(bitPattern: bufferPtr) & ~pageSizeBitmask)
let offset = UInt(bitPattern: bufferPtr) & pageSizeBitmask
assert(bytesPerRow % 64 == 0 && offset % 64 == 0, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 x264 对流进行编码(通过提供单个图像),但不寻常的是我已经有了一些帧的运动信息。我确切地知道每个帧中哪些区域已被修改,并且我知道帧中发生运动的位置。
有没有办法向 x264 提供我自己的运动信息?我想给它帧中给定区域的运动向量,并以某种方式告诉它帧中的某些区域保证没有任何运动。
我认为这可能会显着提高编码的性能(因为我允许编解码器完全跳过运动估计阶段),并且在编码器的运动估计算法可能错过实际发生的运动的情况下也应该在一定程度上提高质量。
我是否需要修改编码器才能执行此操作,或者现有 API 是否支持此操作?
我想创建iPad上的一个简单的模式对话框中,无论是小(UIModalPresentationFormSheet)或较大(UIModalPresentationPageSheet)设置,但他们出来全屏幕(带有标题栏),无论我做什么.
模态UIViewController是在界面构建器中创建的,我似乎无法为其指定大小.为UIViewController中包含的UIView指定较小的大小无效.
我究竟做错了什么?什么可能会影响这个问题?可能是我设置modalPresentationStyle的时间吗?我已尝试使用UINavigationController和没有,但我得到相同的结果.
我刚刚创建了一个 Metal 模板并稍微更改了代码。我用 Minecraft 16x16 青金石矿石纹理切换了默认颜色图,但由于某种原因,它们在低分辨率时会变得模糊。我正在尝试实现像素化的 Minecraft 外观,因此想知道如何禁用这种模糊/过滤。
有没有办法加载/呈现资产而不产生这种模糊?这是我的加载资产函数:
class func loadTexture(device: MTLDevice, textureName: String) throws -> MTLTexture {
/// Load texture data with optimal parameters for sampling
return try MTKTextureLoader(device: device).newTexture(name: textureName, scaleFactor: 1.0, bundle: nil, options: [
MTKTextureLoader.Option.textureUsage: NSNumber(value: MTLTextureUsage.shaderRead.rawValue),
MTKTextureLoader.Option.textureStorageMode: NSNumber(value: MTLStorageMode.`private`.rawValue)
])
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的模糊立方体的屏幕截图: