微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在用于OpenGL纹理的CGContext上调用绘图函数时,为什么会出现BAD_ACCESS错误?

如何解决在用于OpenGL纹理的CGContext上调用绘图函数时,为什么会出现BAD_ACCESS错误?

我正在尝试使用Core Graphics创建OpenGL纹理。我的代码设置在n->next->key中。当绘制到初始化的prepareOpenGL()时,出现CGContext错误。但是,当我在LLDB中放置上下文时(EXC_BAD_ACCESS,请参见下文),我得到一个包含CGContext所有信息的地址。我也尝试通过LLDB调用表达式,并且输出po context!。地址清理程序,线程清理程序和僵尸均不公开。我的问题是,当nil不是EXC_BAD_ACCESS时,为什么CGContext被表示为Optional<CGContext>为零?我尝试在nil调用代码,但得到的结果相同。

drawRect(_:)

LLDB输出-可选值不是nil

import Cocoa
import CoreGraphics
import OpenGL.GL3

class MyView: NSOpenGLView {
    var textureTBO: gluint = 0

    override func prepareOpenGL() {
        let bitmapRows = 10
        let bitmapColumns = 10
        let floatsPerPoint = 4
        var bitmapBuffer = UnsafeMutablePointer<CGFloat>.allocate(capacity: bitmapRows * bitmapColumns * floatsPerPoint)

        if let context = CGContext(data: &bitmapBuffer,width: bitmapColumns,height: bitmapRows,bitsPerComponent: 8,bytesPerRow: bitmapColumns * floatsPerPixel,space: CGColorSpaceCreateDeviceRGB(),bitmapInfo: CGImageAlphaInfo.noneskipLast.rawValue) {
            context.setFillColor(red: 0,green: 0,blue: 1,alpha: 0.5)
            context.fill(CGRect(x: 0,y: 0,width: 5,height: 5))       //=>  EXC_BAD_ACCESS,code=2
            context.setFillColor(red: 1,alpha: 0.5)
            context.fill(CGRect(x: 5,y: 5,height: 5))
            context.setFillColor(red: 0,green: 1,blue: 0,height: 5))
            context.setFillColor(red: 0.5,blue: 0.5,height: 5))
        
            glGenTextures(1,&textureTBO)
            glBindTexture(GLenum(GL_TEXTURE_2D),textureTBO)
            glTexParameteri(GLenum(GL_TEXTURE_2D),GLenum(GL_TEXTURE_MIN_FILTER),GL_LINEAR)
            glTexParameteri(GLenum(GL_TEXTURE_2D),GLenum(GL_TEXTURE_MAG_FILTER),GLenum(GL_TEXTURE_WRAP_S),GL_REPEAT)
            glTexParameteri(GLenum(GL_TEXTURE_2D),GLenum(GL_TEXTURE_WRAP_T),GL_REPEAT)
        }

        glTexImage2D(GLenum(GL_TEXTURE_2D),GLint(GL_RGB),256,GLenum(GL_RGBA),GLenum(GL_UNSIGNED_INT),&bitmapBuffer)

        bitmapBuffer.deallocate()
    }
}

LLDB输出-这是否告诉我因为上下文实际上为nil而无法设置颜色?

(lldb) po context!
<CGContext 0x7b3000000300> (kCGContextTypeBitmap)
    <<CGColorSpace 0x7b1800002280> (kCGColorSpaceDeviceRGB)>
        width = 256,height = 256,bpc = 8,bpp = 32,row bytes = 2048 
        kCGImageAlphaNoneskipLast | 0 (default byte order)

LLDB输出-一种徒劳的练习:做同样的事情并且期望得到不同的结果,哈哈

(lldb) expression context?.setFillColor(red: 0,alpha: 0.5)
(Void?) $R4 = nil

似乎可以按照我发现的this answer来完成。感谢您的想法,谢谢!

解决方法

data: &bitmapBuffer是指向缓冲区的指针。将其替换为data: bitmapBuffer

与崩溃无关,但每个组件8位都适合UInt8

var bitmapBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bitmapRows * bitmapColumns * floatsPerPoint)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。