From b6a65d1eb7f9d1896bf11b0ea2106d4576bc4f64 Mon Sep 17 00:00:00 2001 From: Luigi Thirty Date: Mon, 31 Jul 2017 16:52:51 -0400 Subject: [PATCH] optimizing --- FruitMachine/AppleI/AppleI.swift | 23 +++++++++++-------- FruitMachine/AppleI/AppleIBitmapDisplay.swift | 19 ++++++++------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/FruitMachine/AppleI/AppleI.swift b/FruitMachine/AppleI/AppleI.swift index 5366df3..8459248 100644 --- a/FruitMachine/AppleI/AppleI.swift +++ b/FruitMachine/AppleI/AppleI.swift @@ -41,10 +41,6 @@ class AppleI: NSObject { installOverrides() - for (cellNum, character) in terminal.characters.enumerated() { - emulatorViewDelegate.putCharacterPixels(charPixels: cg.getCharacterPixels(charIndex: character), pixelPosition: emulatorViewDelegate.getPixelOffset(charCellIndex: cellNum)) - } - CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple1/apple1.rom", offset: 0xFF00, length: 0x100) CPU.sharedInstance.memoryInterface.loadBinary(path: "/Users/luigi/apple1/basic.bin", offset: 0xE000, length: 0x1000) CPU.sharedInstance.performReset() @@ -59,26 +55,35 @@ class AppleI: NSObject { CPU.sharedInstance.memoryInterface.read_overrides.append(PIAOverrides.readKBD) CPU.sharedInstance.memoryInterface.read_overrides.append(PIAOverrides.readKBDCR) - } func runFrame() { - let startTime = CFAbsoluteTimeGetCurrent() + CPU.sharedInstance.cycles = 0 CPU.sharedInstance.cyclesInBatch = AppleI.CYCLES_PER_BATCH CPU.sharedInstance.runCyclesBatch() //update the video display + CVPixelBufferLockBaseAddress(emulatorViewDelegate.pixels!, CVPixelBufferLockFlags(rawValue: 0)) + let pixelBase = CVPixelBufferGetBaseAddress(emulatorViewDelegate.pixels!) + let buf = pixelBase?.assumingMemoryBound(to: BitmapPixelsBE555.PixelData.self) + + let startTime = CFAbsoluteTimeGetCurrent() + for (cellNum, character) in terminal.characters.enumerated() { - emulatorViewDelegate.putCharacterPixels(charPixels: cg.getCharacterPixels(charIndex: character), + emulatorViewDelegate.putCharacterPixels(buffer: buf, + charPixels: cg.getCharacterPixels(charIndex: character), pixelPosition: emulatorViewDelegate.getPixelOffset(charCellIndex: cellNum)) } + let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime + print("Time elapsed for runFrame: \(timeElapsed) s.") + + CVPixelBufferUnlockBaseAddress(emulatorViewDelegate.pixels!, CVPixelBufferLockFlags(rawValue: 0)) + emulatorView.setNeedsDisplay(emulatorView.frame) emulatorView.display() - let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime - print("Time elapsed for runFrame: \(timeElapsed) s.") } } diff --git a/FruitMachine/AppleI/AppleIBitmapDisplay.swift b/FruitMachine/AppleI/AppleIBitmapDisplay.swift index 6f73949..59d77b1 100644 --- a/FruitMachine/AppleI/AppleIBitmapDisplay.swift +++ b/FruitMachine/AppleI/AppleIBitmapDisplay.swift @@ -23,6 +23,8 @@ class AppleIBitmapDisplay: NSObject, CALayerDelegate { var renderedImage: CGImage? + var scanlineOffsets: [Int] + override init() { _ = CVPixelBufferCreate(kCFAllocatorDefault, AppleIBitmapDisplay.PIXEL_WIDTH, AppleIBitmapDisplay.PIXEL_HEIGHT, OSType(k16BE555PixelFormat), nil, &pixels) @@ -31,25 +33,26 @@ class AppleIBitmapDisplay: NSObject, CALayerDelegate { bufferHeight = CVPixelBufferGetHeight(pixels!) renderedImage = nil + + scanlineOffsets = [Int]() + for i in 0..?, charPixels: [UInt8], pixelPosition: CGPoint) { + //You better have locked the buffer before getting here... //Calculate the offset to reach the desired position. - let baseOffset = (Int(pixelPosition.y) * AppleIBitmapDisplay.PIXEL_WIDTH) + Int(pixelPosition.x) + let baseOffset = scanlineOffsets[Int(pixelPosition.y)] + Int(pixelPosition.x) for charY in 0.. 0 ? BitmapPixelsBE555.ARGBWhite : BitmapPixelsBE555.ARGBBlack + buffer![baseOffset + offsetY + 7 - charX] = (charPixels[charY] & UInt8(1 << charX)) > 0 ? BitmapPixelsBE555.ARGBWhite : BitmapPixelsBE555.ARGBBlack } } - - CVPixelBufferUnlockBaseAddress(pixels!, CVPixelBufferLockFlags(rawValue: 0)) } func getPixelOffset(charCellX: Int, charCellY: Int) -> CGPoint {