{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-356", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/356", "wordCount": 3826, "segments": [{"start": 7.0, "text": "Hello, welcome!"}, {"start": 9.0, "text": "My name is Garrett Austin."}, {"start": 10.0, "text": "I'm an engineer on Apple's Game Performance team."}, {"start": 13.0, "text": "Today I'll be joined by a special guest,"}, {"start": 16.0, "text": "Paweł Sasko, Associate Game Director at CD PROJEKT RED."}, {"start": 20.0, "text": "Paweł is here to talk about Cyberpunk 2077: Ultimate Edition,"}, {"start": 23.0, "text": "an incredible achievement on Mac."}, {"start": 25.0, "text": "It takes advantage of unique platform features"}, {"start": 27.0, "text": "and delivers great performance across a wide range of Mac devices."}, {"start": 31.0, "text": "Now, I'll leave it to Paweł to tell us all about how it was brought to life on Mac,"}, {"start": 35.0, "text": "and how they made it stand out."}, {"start": 36.0, "text": "Paweł?"}, {"start": 37.0, "text": "Thanks, my choom!"}, {"start": 39.0, "text": "I'm going to share more with you"}, {"start": 40.0, "text": "about the experience of bringing Cyberpunk 2077 to Mac."}, {"start": 44.0, "text": "I'll start with an overview of Cyberpunk 2077 itself,"}, {"start": 49.0, "text": "explore how we approached the Mac development process,"}, {"start": 52.0, "text": "and finally, share the finishing touches"}, {"start": 55.0, "text": "and flourishes that made Cyberpunk 2077 stand out on Mac."}, {"start": 60.0, "text": "So, what is Cyberpunk 2077?"}, {"start": 64.0, "text": "It's an open world RPG where you play as V,"}, {"start": 66.0, "text": "a cyberpunk mercenary operating in Night City."}, {"start": 70.0, "text": "Players explore the city and its surroundings, meet characters,"}, {"start": 73.0, "text": "build relationships, and make a lot of decisions,"}, {"start": 76.0, "text": "some of which lead to unforeseen consequences."}, {"start": 80.0, "text": "This is a beast of a game, a massive world, no loading screens,"}, {"start": 84.0, "text": "and a lot of data to constantly process."}, {"start": 87.0, "text": "But, from the get go, the game was designed to be scaleable,"}, {"start": 91.0, "text": "to run on a variety of hardware,"}, {"start": 94.0, "text": "and this really helped us out when we brought it up on Mac."}, {"start": 98.0, "text": "To this day Cyberpunk 2077 remains a benchmark that is used in the industry"}, {"start": 103.0, "text": "whenever new hardware comes out,"}, {"start": 105.0, "text": "and there are a few reasons for that."}, {"start": 108.0, "text": "Night City is packed with moving parts,"}, {"start": 111.0, "text": "crowds, traffic, AI, physics, animation, quests,"}, {"start": 115.0, "text": "and systemic interactions all running in parallel."}, {"start": 120.0, "text": "A lot of this pressure lands on the CPU."}, {"start": 124.0, "text": "Cyberpunk 2077 has mixed lighting everywhere,"}, {"start": 127.0, "text": "neon, signs, puddles, reflective surfaces,"}, {"start": 130.0, "text": "headlights, emissive lights, volumetrics,"}, {"start": 134.0, "text": "often all in the same scene."}, {"start": 138.0, "text": "It also supports advanced graphics modes like ray tracing and path tracing,"}, {"start": 142.0, "text": "which make the game much more demanding"}, {"start": 144.0, "text": "and scale strongly with GPU capability."}, {"start": 147.0, "text": "You probably know that we've been regularly updating"}, {"start": 151.0, "text": "Cyberpunk 2077 since its release."}, {"start": 154.0, "text": "We shipped the Ultimate Edition, introduced the Metro system,"}, {"start": 157.0, "text": "extended romances, vehicle customization"}, {"start": 160.0, "text": "and far more content to the game."}, {"start": 163.0, "text": "So when we work on our game,"}, {"start": 165.0, "text": "we always try to make it relevant and fresh."}, {"start": 169.0, "text": "Naturally, we were looking for other platforms"}, {"start": 171.0, "text": "where we can ship the game."}, {"start": 173.0, "text": "So that brings us to the next question."}, {"start": 177.0, "text": "How did we decide to bring Cyberpunk 2077 to Mac,"}, {"start": 181.0, "text": "and why did it make sense to do it at this point?"}, {"start": 185.0, "text": "At CD PROJEKT RED, we have a pretty long history shipping on Apple platforms."}, {"start": 190.0, "text": "We wanted to continue that."}, {"start": 192.0, "text": "As Apple silicon developed,"}, {"start": 194.0, "text": "the hardware capabilities evolved far enough for us"}, {"start": 197.0, "text": "to bring a game on Cyberpunk's scale to the Mac,"}, {"start": 200.0, "text": "not only running it,"}, {"start": 202.0, "text": "but aiming at a serious quality level."}, {"start": 204.0, "text": "With Apple silicon we were confident"}, {"start": 207.0, "text": "that we could deliver something we'd be comfortable putting our name on."}, {"start": 212.0, "text": "And of course bringing the game to Mac is a chance to reach more players,"}, {"start": 217.0, "text": "which we are always happy to do."}, {"start": 220.0, "text": "Once we aligned on, \"Yes, this is worth doing,\""}, {"start": 223.0, "text": "the next question was,"}, {"start": 225.0, "text": "what does \"doing it properly\" mean for Cyberpunk 2077 on Mac?"}, {"start": 230.0, "text": "We set the quality bar for ourselves,"}, {"start": 233.0, "text": "and there are three main components to it."}, {"start": 236.0, "text": "Maintaining the visual fidelity and identity of the game was key."}, {"start": 241.0, "text": "The look, the lighting, the materials,"}, {"start": 243.0, "text": "all of that is really tied to the very core of what Cyberpunk is."}, {"start": 248.0, "text": "Another component is stable performance."}, {"start": 250.0, "text": "It's really important to look at scenarios when we have heavy CPU and GPU usage,"}, {"start": 257.0, "text": "large crowds, screen space reflections, driving through dense areas, combat,"}, {"start": 262.0, "text": "and evaluate performance across heavy scenes"}, {"start": 265.0, "text": "and locations to make sure it all runs smoothly."}, {"start": 269.0, "text": "And then last but not least,"}, {"start": 271.0, "text": "it's the finishing touches that make the experience feel native."}, {"start": 275.0, "text": "We always try to use the platform capabilities to their maximum."}, {"start": 279.0, "text": "We wanted an experience that stands apart on macOS,"}, {"start": 282.0, "text": "with native features and behaviors that players love."}, {"start": 285.0, "text": "Before we started building the native path for Cyberpunk 2077 on Mac,"}, {"start": 290.0, "text": "we used Apple's Game Porting Toolkit"}, {"start": 293.0, "text": "to evaluate the Windows build in a translated environment on macOS."}, {"start": 299.0, "text": "This let us gain valuable insight before writing any code."}, {"start": 305.0, "text": "Insights like, \"Is bringing Cyberpunk 2077 to Mac feasible"}, {"start": 309.0, "text": "at the quality bar we set for ourselves?\""}, {"start": 313.0, "text": "\"Where is the pressure likely to be, CPU, GPU, or any specific systems?\""}, {"start": 319.0, "text": "And, \"What are the first real focus areas we should plan around?\""}, {"start": 325.0, "text": "The goal wasn't final performance numbers."}, {"start": 328.0, "text": "It was information,"}, {"start": 330.0, "text": "where frame time goes,"}, {"start": 331.0, "text": "what are the performance challenges in real game play,"}, {"start": 335.0, "text": "and what we should build first once we move to native."}, {"start": 340.0, "text": "To make the evaluation data useful,"}, {"start": 342.0, "text": "we ran a predetermined set of hotspot sequences"}, {"start": 345.0, "text": "in the evaluation environment."}, {"start": 347.0, "text": "For each test run, we looked at the data from three angles."}, {"start": 352.0, "text": "Statistical frame time data,"}, {"start": 354.0, "text": "from our in-engine profiler so we could compare runs consistently."}, {"start": 360.0, "text": "Metal HUD, to correlate what we're doing in the scene"}, {"start": 364.0, "text": "with what we see in the trace, loading, shader translation,"}, {"start": 368.0, "text": "or some known events such as saving the game."}, {"start": 372.0, "text": "And, engine internal profiling broken down into threads,"}, {"start": 376.0, "text": "so we could see which CPU systems were active and when,"}, {"start": 380.0, "text": "to make sense of hotspots and spikes."}, {"start": 383.0, "text": "Later, once we had a native build running, we moved to using Metal HUD"}, {"start": 389.0, "text": "as the primary frame time capture tool on Mac."}, {"start": 392.0, "text": "This let us collect comparable measurements across many devices,"}, {"start": 397.0, "text": "and most importantly,"}, {"start": 398.0, "text": "do it on builds without debug"}, {"start": 400.0, "text": "or profiling settings enabled,"}, {"start": 403.0, "text": "allowing us to capture the most reliable data possible."}, {"start": 407.0, "text": "Once we had that approach in place, the signals became pretty clear."}, {"start": 412.0, "text": "On high-spec hardware, GPU time looked healthy even this early,"}, {"start": 416.0, "text": "which actually pleasantly surprised us."}, {"start": 419.0, "text": "It was stable enough to serve as a baseline,"}, {"start": 423.0, "text": "and it suggested that we had a realistic path"}, {"start": 426.0, "text": "for our performance targets once the Metal rendering pipeline was native."}, {"start": 431.0, "text": "In heavy game play, the experience was influenced by CPU pressure."}, {"start": 436.0, "text": "For example, in a city driving scenario,"}, {"start": 438.0, "text": "we could see a best case where the GPU was the limiter,"}, {"start": 443.0, "text": "but a hotspot case where the CPU time rose sharply"}, {"start": 447.0, "text": "when the scene became dense with traffic, crowds, and action."}, {"start": 452.0, "text": "At this stage, we saw a couple of patterns"}, {"start": 455.0, "text": "that were evaluation environmental artifacts."}, {"start": 459.0, "text": "One was oscillation in frame time caused by live shader translation."}, {"start": 463.0, "text": "The other was our audio middleware,"}, {"start": 465.0, "text": "which looked heavy in some scenarios."}, {"start": 468.0, "text": "Both of these were resolved once we moved to native binaries,"}, {"start": 472.0, "text": "and Game Porting Toolkit identified them for us,"}, {"start": 475.0, "text": "so we knew to investigate it early during our native implementation."}, {"start": 480.0, "text": "Once we had the signals, we could turn the evaluation into a production roadmap."}, {"start": 486.0, "text": "First was making Mac a real target:"}, {"start": 489.0, "text": "Native builds and libraries, and adjusted data pipelines."}, {"start": 494.0, "text": "Then we aimed for a playable build"}, {"start": 497.0, "text": "by bringing up the rendering and shader paths with the Metal API"}, {"start": 502.0, "text": "and Metal shader converter."}, {"start": 504.0, "text": "Once that was in place,"}, {"start": 506.0, "text": "the rest was the fun part, making it shippable."}, {"start": 510.0, "text": "Adding platform native features,"}, {"start": 512.0, "text": "then optimizing for performance and adding more polish."}, {"start": 517.0, "text": "There were three core parts to making Mac a real target in our pipeline."}, {"start": 522.0, "text": "First, native builds on macOS."}, {"start": 524.0, "text": "We needed Apple silicon builds produced with the macOS toolchain,"}, {"start": 529.0, "text": "not only the game executable,"}, {"start": 531.0, "text": "but also the development tools that we rely on in the process."}, {"start": 536.0, "text": "Then, there's the data pipeline."}, {"start": 538.0, "text": "Internally Cyberpunk 2077 had a full build pipeline"}, {"start": 543.0, "text": "set up for all the platforms we support,"}, {"start": 545.0, "text": "and we have added macOS as yet another parallel platform,"}, {"start": 550.0, "text": "following the same process."}, {"start": 552.0, "text": "The platform-specific outputs, such as archives and shader cache,"}, {"start": 556.0, "text": "had to be generated following this already-existing pipeline."}, {"start": 561.0, "text": "Finally, the architecture bridge."}, {"start": 564.0, "text": "The game and engine had years of assumptions from other CPU architectures,"}, {"start": 569.0, "text": "so at the beginning of the process, we validated what works with unit testing,"}, {"start": 573.0, "text": "and identified what changes were required to have it run well on Apple silicon."}, {"start": 579.0, "text": "After this step, we could move on to the shader pipeline."}, {"start": 584.0, "text": "As soon as we had a basic Metal path that could display frames,"}, {"start": 588.0, "text": "Metal shader converter helped us get broad shader coverage quickly,"}, {"start": 592.0, "text": "so we could render meaningful scenes."}, {"start": 595.0, "text": "In practice, we treated this process as a loop."}, {"start": 599.0, "text": "Integrate Metal shader converter into our shader build,"}, {"start": 603.0, "text": "so Metal shader output was generated as a part of normal builds."}, {"start": 609.0, "text": "Validate repeatable scenes,"}, {"start": 611.0, "text": "and look for differences"}, {"start": 613.0, "text": "in lighting response, materials, and post effects."}, {"start": 619.0, "text": "Refine the smaller set of advanced shaders"}, {"start": 624.0, "text": "or edge cases where the converted result didn't quite match what we expected."}, {"start": 630.0, "text": "Then, repeat this process as part of the build and test pipeline."}, {"start": 635.0, "text": "In parallel to bringing shaders online with Metal shader converter,"}, {"start": 639.0, "text": "we were building out the native Metal rendering foundation."}, {"start": 643.0, "text": "We started with unit tests, bringing the Metal backend up piece by piece,"}, {"start": 648.0, "text": "and checking the base output carefully before adding more complexity."}, {"start": 653.0, "text": "Once that base layer was solid, we moved on to stationary in-game scenes."}, {"start": 658.0, "text": "That's where you can validate"}, {"start": 660.0, "text": "the parts unit tests don't cover very well,"}, {"start": 664.0, "text": "lighting stacks, post effects, and scene-level behavior."}, {"start": 668.0, "text": "After that, we moved into dynamic scenes,"}, {"start": 670.0, "text": "where camera movement, streaming,"}, {"start": 672.0, "text": "and game play start to expose the real edge cases."}, {"start": 677.0, "text": "When we implemented ray tracing and path tracing,"}, {"start": 681.0, "text": "we optimized the performance while validating that"}, {"start": 684.0, "text": "the visual output remained the same as other platforms"}, {"start": 688.0, "text": "to preserve the identity and look of the game."}, {"start": 692.0, "text": "Once the native Metal foundation was stable,"}, {"start": 694.0, "text": "our next challenge was scaling performance across different Macs,"}, {"start": 699.0, "text": "and this is where MetalFX Upscaling comes in as a solution."}, {"start": 704.0, "text": "At a high level, MetalFX lets you render at a lower internal resolution"}, {"start": 709.0, "text": "and reconstruct a higher resolution output in less time."}, {"start": 713.0, "text": "The practical benefit was quite straightforward."}, {"start": 716.0, "text": "It gave us more performance headroom in the heavy scenes,"}, {"start": 719.0, "text": "without lowering the quality across the board."}, {"start": 724.0, "text": "We also used Dynamic Resolution Scaling"}, {"start": 726.0, "text": "to help maintain stable performance under load across a variety of Mac hardware."}, {"start": 733.0, "text": "As a temporal upscaler,"}, {"start": 735.0, "text": "it helped the image hold together in motion,"}, {"start": 738.0, "text": "especially during fast traversal and VFX-heavy scenes."}, {"start": 743.0, "text": "At that point, we had the full game on Mac,"}, {"start": 745.0, "text": "we had it running with a working build,"}, {"start": 749.0, "text": "it was rendering in a predictable way,"}, {"start": 752.0, "text": "and it was playable."}, {"start": 753.0, "text": "From that point on, you really need to ask yourself,"}, {"start": 757.0, "text": "\"Okay, now what actually makes it ready to ship?\""}, {"start": 762.0, "text": "For us, it's a few other components."}, {"start": 765.0, "text": "There's the default settings -"}, {"start": 767.0, "text": "how it looks when you launch the game for the first time."}, {"start": 771.0, "text": "Then, how do we differentiate this version of the game"}, {"start": 774.0, "text": "with platform native features?"}, {"start": 777.0, "text": "And finally, polishing the game for a great overall experience."}, {"start": 783.0, "text": "It was time to take what we had built"}, {"start": 785.0, "text": "and turn it into a first-launch experience on Mac that really stood out."}, {"start": 791.0, "text": "We wanted to provide great performance on the first launch for every Mac."}, {"start": 796.0, "text": "That's where the \"For this Mac\" preset comes in."}, {"start": 800.0, "text": "\"For this Mac\" is a device-based graphics preset system -"}, {"start": 804.0, "text": "it detects the hardware in your Mac"}, {"start": 806.0, "text": "and automatically configures the best settings for your device."}, {"start": 811.0, "text": "Regardless of which supported Mac you have,"}, {"start": 813.0, "text": "you can launch the game and get a stable, enjoyable starting point right away."}, {"start": 820.0, "text": "Our process started with picking settings"}, {"start": 822.0, "text": "that maintain image fidelity for each supported Mac device."}, {"start": 827.0, "text": "We set our target FPS to either 30 or 60,"}, {"start": 832.0, "text": "MetalFX was used with Dynamic Resolution Scaling,"}, {"start": 836.0, "text": "and we adjusted minimum and maximum resolution boundaries"}, {"start": 840.0, "text": "to hit the target FPS."}, {"start": 843.0, "text": "Unique to the \"For this Mac\" preset, we also adjusted video settings."}, {"start": 848.0, "text": "This was where we set the final output resolution,"}, {"start": 851.0, "text": "which Dynamic Resolution Scaling operates within."}, {"start": 855.0, "text": "We set VSync for proper frame pacing with our FPS target."}, {"start": 860.0, "text": "We also enabled HDR, based on the display's capabilities."}, {"start": 864.0, "text": "We then further tuned every setting in our game one-by-one, for each Mac,"}, {"start": 870.0, "text": "to make sure they were not only performant, but also beautiful."}, {"start": 875.0, "text": "When a player downloads the game and launches it for the first time,"}, {"start": 878.0, "text": "they can trust that it is optimized for their specific Mac."}, {"start": 883.0, "text": "During our tuning process,"}, {"start": 884.0, "text": "what really helped us was using several consistent scenes"}, {"start": 888.0, "text": "that stressed the CPU, GPU, and streaming systems in different ways."}, {"start": 893.0, "text": "Then, we collected performance data, refined our settings,"}, {"start": 896.0, "text": "and revalidated in a loop across the lineup,"}, {"start": 900.0, "text": "until we found the ideal settings for each Mac."}, {"start": 904.0, "text": "What's cool for us is since the release of Cyberpunk 2077 on Mac,"}, {"start": 909.0, "text": "we've seen that other developers are starting to adopt"}, {"start": 912.0, "text": "\"For this Mac\" settings in their games as well."}, {"start": 915.0, "text": "We think that it's pretty healthy for the ecosystem,"}, {"start": 918.0, "text": "and it makes us really happy to see it."}, {"start": 921.0, "text": "Now, let's take a look at \"For this Mac\" in the game."}, {"start": 926.0, "text": "Here is the \"For this Mac\" preset."}, {"start": 929.0, "text": "For this MacBook Pro with M5 Max chip, I'm using the Ultra preset as a base."}, {"start": 935.0, "text": "From here, I can see the rest of the settings."}, {"start": 939.0, "text": "Starting with MetalFX Upscaling using Dynamic Resolution Scaling,"}, {"start": 944.0, "text": "targeting 60 frames per second,"}, {"start": 946.0, "text": "and rendering anywhere from 50 to 80% of the target output resolution."}, {"start": 952.0, "text": "Then I can go deeper into the settings, which were tweaked even more."}, {"start": 957.0, "text": "We didn't require a lot of tweaks for M5 Max -"}, {"start": 961.0, "text": "it's quite a capable chip."}, {"start": 965.0, "text": "We also adjust video settings as part of the \"For this Mac\" preset."}, {"start": 970.0, "text": "Here, it's targeting a 60 FPS lock with VSync."}, {"start": 973.0, "text": "Resolution upper bounds are set,"}, {"start": 975.0, "text": "and 2336x1460 is chosen for the internal display."}, {"start": 981.0, "text": "Since the MacBook Pro's display is HDR capable, HDR defaults to on."}, {"start": 987.0, "text": "HDR is automatically calibrated using Apple's EDR APIs,"}, {"start": 992.0, "text": "players do not have to visit a calibration screen."}, {"start": 995.0, "text": "It's a really great feature which I will talk about later."}, {"start": 998.0, "text": "Now, I will load into one of the most taxing areas of the game."}, {"start": 1002.0, "text": "Yes, so this area is a part of Dogtown."}, {"start": 1011.0, "text": "If you played Phantom Liberty, you know, I'm not going to spoil the story here,"}, {"start": 1015.0, "text": "but I am going to load into the Black Market."}, {"start": 1018.0, "text": "This is the first moment when the player is actually entering this space."}, {"start": 1022.0, "text": "It's really dense in geometry, lights, reflections, and characters."}, {"start": 1028.0, "text": "It's one of the heaviest areas in the whole game."}, {"start": 1031.0, "text": "Again, this is demonstrating some of the quality bar"}, {"start": 1034.0, "text": "that I spoke about earlier,"}, {"start": 1035.0, "text": "where we really wanted to stress frame time stability"}, {"start": 1039.0, "text": "in the hardest scenes in the game."}, {"start": 1041.0, "text": "Now of course, in Cyberpunk you have no loading screens."}, {"start": 1045.0, "text": "You can traverse through the scenes in any way you want."}, {"start": 1048.0, "text": "Everything is loading in and out smoothly,"}, {"start": 1051.0, "text": "and, as I go around here,"}, {"start": 1053.0, "text": "there is a variety of neon and light sources."}, {"start": 1056.0, "text": "It's really, really dense, and it's all running smoothly at 60 frames per second"}, {"start": 1061.0, "text": "with out of the box settings."}, {"start": 1064.0, "text": "Ah, so these two gentlemen are actually our founders,"}, {"start": 1067.0, "text": "Marcin Iwiński and Michał Kiciński."}, {"start": 1069.0, "text": "Our company started in a van,"}, {"start": 1071.0, "text": "back when they were selling video games at the end of the 90s in Poland,"}, {"start": 1075.0, "text": "so we scanned them and put them into the game."}, {"start": 1083.0, "text": "They're all speaking Polish in all localizations of the game,"}, {"start": 1086.0, "text": "they are actually doing the voice acting as well."}, {"start": 1089.0, "text": "This is just one of the easter eggs that we have hidden here."}, {"start": 1092.0, "text": "Alright so, we didn't stop at just settings optimization."}, {"start": 1096.0, "text": "We also adopted a number of platform specific features"}, {"start": 1099.0, "text": "around windowing and app switching, game controllers and input devices,"}, {"start": 1103.0, "text": "display and audio, and cloud save technologies that let you play anywhere."}, {"start": 1109.0, "text": "Modern gaming intersects with multitasking."}, {"start": 1112.0, "text": "Players play in different scenarios and switch contexts,"}, {"start": 1115.0, "text": "and macOS can let you know when these things happen."}, {"start": 1119.0, "text": "We wanted to create a smooth system experience for players."}, {"start": 1123.0, "text": "macOS broadcasts events as NSNotifications that we can leverage."}, {"start": 1128.0, "text": "Responding to NSNotification events in the game"}, {"start": 1132.0, "text": "helped us ensure the game feels native to the system,"}, {"start": 1135.0, "text": "accounts for app switching, and reacts to display configuration changes."}, {"start": 1139.0, "text": "We also reduce our game's CPU and GPU activity while not in focus."}, {"start": 1145.0, "text": "Next, I'll walk you through some of these behaviors."}, {"start": 1148.0, "text": "First, we reduced activity while the game is in the background."}, {"start": 1152.0, "text": "When the game is not visible, we don't need to render"}, {"start": 1155.0, "text": "and can save CPU and GPU resources for the player."}, {"start": 1160.0, "text": "For this, we listen to the NSWindowDidChangeOcclusionStateNotification"}, {"start": 1165.0, "text": "to know when we need to check for changes,"}, {"start": 1168.0, "text": "and then check the NSWindow occlusionState to determine"}, {"start": 1173.0, "text": "if we should pause rendering"}, {"start": 1175.0, "text": "or if we should start rendering again."}, {"start": 1178.0, "text": "Next, display settings."}, {"start": 1181.0, "text": "Players might change the settings of their attached displays while multitasking."}, {"start": 1186.0, "text": "We want to make sure our game window is aware of these changes"}, {"start": 1190.0, "text": "so it can correctly fill the screen."}, {"start": 1193.0, "text": "When we receive an NSApplicationDidChangeScreenParametersNotification,"}, {"start": 1198.0, "text": "we get the new screen resolution,"}, {"start": 1200.0, "text": "and update our game window accordingly."}, {"start": 1203.0, "text": "Now, not only can the display settings change,"}, {"start": 1207.0, "text": "the player might move the game"}, {"start": 1209.0, "text": "to a completely new display too."}, {"start": 1212.0, "text": "After receiving a NSWindowDidChangeScreenNotification,"}, {"start": 1215.0, "text": "we collect details about the new display."}, {"start": 1218.0, "text": "This includes for example the Display ID, resolution, mirror mode, and screen name."}, {"start": 1225.0, "text": "Based on these, we know if and how to update our game window."}, {"start": 1230.0, "text": "We are using our own cursor to match our game style."}, {"start": 1234.0, "text": "To create a seamless system experience, we listen to two notifications"}, {"start": 1239.0, "text": "to manage the cursor when the game window loses focus."}, {"start": 1243.0, "text": "For example, when I open the Game Overlay,"}, {"start": 1246.0, "text": "our game cursor disappears"}, {"start": 1248.0, "text": "and the system cursor appears to allow for a seamless system experience."}, {"start": 1253.0, "text": "When I close the Game Overlay, the system cursor disappears"}, {"start": 1257.0, "text": "and our game cursor appears, bringing us right back into the game."}, {"start": 1263.0, "text": "The NSWindowDidResignKeyNotification is the signal for us"}, {"start": 1267.0, "text": "to show the system cursor and hide our game cursor."}, {"start": 1272.0, "text": "Conversely, the NSWindowDidBecomeKeyNotification"}, {"start": 1275.0, "text": "is the signal for us"}, {"start": 1276.0, "text": "to hide the system cursor, and show our game cursor."}, {"start": 1281.0, "text": "Aside from notifications, another thing to look for is Game Mode."}, {"start": 1285.0, "text": "Game Mode is a system feature on Apple"}, {"start": 1287.0, "text": "that gives games higher priority access to the CPU and GPU,"}, {"start": 1293.0, "text": "and lowers the impact of background tasks,"}, {"start": 1295.0, "text": "resulting in a smoother experience."}, {"start": 1299.0, "text": "It also improves responsiveness for wireless accessories"}, {"start": 1303.0, "text": "by doubling the Bluetooth sampling rate,"}, {"start": 1307.0, "text": "and that reduces latency for wireless game controllers,"}, {"start": 1310.0, "text": "as well as AirPods audio latency."}, {"start": 1314.0, "text": "And good news,"}, {"start": 1315.0, "text": "Game Mode is automatically enabled for apps"}, {"start": 1318.0, "text": "that are categorized as games"}, {"start": 1320.0, "text": "and our validation showed the benefits players get from it."}, {"start": 1324.0, "text": "Next, let's talk about input."}, {"start": 1327.0, "text": "On Apple platforms,"}, {"start": 1329.0, "text": "the Game Controller framework made it easy for us to implement native support"}, {"start": 1333.0, "text": "for a range of third party controllers."}, {"start": 1336.0, "text": "It also supports advanced controller features"}, {"start": 1339.0, "text": "like touchpad and adaptive triggers,"}, {"start": 1341.0, "text": "which allowed us to easily bridge our existing implementations"}, {"start": 1345.0, "text": "of these features in our game."}, {"start": 1347.0, "text": "We also support Apple's native input devices -"}, {"start": 1351.0, "text": "the Magic Mouse and trackpad."}, {"start": 1353.0, "text": "For example, every Mac laptop has a trackpad,"}, {"start": 1356.0, "text": "so make sure you design your control options"}, {"start": 1359.0, "text": "to adapt to the current input."}, {"start": 1361.0, "text": "In our case, we automatically detect"}, {"start": 1363.0, "text": "and enable toggle aiming"}, {"start": 1365.0, "text": "and an alternative to the middle mouse button"}, {"start": 1368.0, "text": "by using a modifier key and the mouse click."}, {"start": 1373.0, "text": "Now, displays deserve their own moment."}, {"start": 1377.0, "text": "Apple's high-end displays are some of the best we've seen Cyberpunk run on."}, {"start": 1382.0, "text": "Night City is built on contrast: neon highlights, dark alleys, bright signage,"}, {"start": 1387.0, "text": "and they look incredible in HDR."}, {"start": 1390.0, "text": "We implemented HDR through Apple's Extended Dynamic Range pipeline,"}, {"start": 1395.0, "text": "which uniquely allows us to access information"}, {"start": 1397.0, "text": "about the display so we can calibrate our HDR presentation automatically."}, {"start": 1403.0, "text": "This is such a great benefit for players -"}, {"start": 1405.0, "text": "they get the best HDR presentation"}, {"start": 1408.0, "text": "and never have to manually adjust their HDR settings"}, {"start": 1412.0, "text": "on a calibration screen with Apple displays."}, {"start": 1416.0, "text": "To dynamically calibrate our HDR output,"}, {"start": 1419.0, "text": "we simply poll maximumExtendedDynamicRangeColorComponentValue"}, {"start": 1424.0, "text": "to get the current maximum EDR value for our display,"}, {"start": 1429.0, "text": "and then send that to our tone mapper."}, {"start": 1432.0, "text": "This value can change dynamically"}, {"start": 1434.0, "text": "depending on the capabilities of the display hardware and other conditions,"}, {"start": 1438.0, "text": "so using this to drive your tone mapper's maximum HDR output"}, {"start": 1443.0, "text": "will always result at the best possible HDR rendering on Apple displays."}, {"start": 1449.0, "text": "We automatically enable HDR for displays with sufficient EDR headroom,"}, {"start": 1454.0, "text": "such as Apple's XDR displays."}, {"start": 1457.0, "text": "For this, we check"}, {"start": 1459.0, "text": "the maximumPotentialExtended- DynamicRangeColorComponentValue,"}, {"start": 1463.0, "text": "and see if the display's maximum potential EDR value is greater than 2.0."}, {"start": 1470.0, "text": "If so, we enable HDR by default for a seamless experience."}, {"start": 1475.0, "text": "Audio is yet another area where Apple platforms offer something special."}, {"start": 1480.0, "text": "Cyberpunk 2077's soundscape is designed for spatial audio."}, {"start": 1485.0, "text": "We were able to take advantage of Apple's spatial audio APIs"}, {"start": 1489.0, "text": "to enable head-tracked spatial audio for players with AirPods."}, {"start": 1494.0, "text": "This is a genuinely unique way to further immerse yourself within the game,"}, {"start": 1499.0, "text": "and it's enabled by default with no additional setup."}, {"start": 1503.0, "text": "Our game has existing support for spatial audio with our audio middleware,"}, {"start": 1508.0, "text": "and our audio middleware implements"}, {"start": 1511.0, "text": "Apple's spatial audio APIs via AVAudioEngine."}, {"start": 1515.0, "text": "We enabled head tracking for AirPods"}, {"start": 1518.0, "text": "by setting the AVAudioEnvironmentNode's"}, {"start": 1521.0, "text": "listenerHeadTrackingEnabled property to true"}, {"start": 1525.0, "text": "Finally, we wanted to reduce friction for our players"}, {"start": 1529.0, "text": "when introducing our game to a new platform."}, {"start": 1532.0, "text": "On Mac, we support iCloud Drive integration,"}, {"start": 1536.0, "text": "allowing you to transfer save files between your Apple devices."}, {"start": 1540.0, "text": "And because we have our own in-house cross‑progression solution,"}, {"start": 1544.0, "text": "players can continue their save across platforms."}, {"start": 1548.0, "text": "They can start anywhere, continue playing on Mac, and vice versa."}, {"start": 1553.0, "text": "So what's the outcome?"}, {"start": 1554.0, "text": "A native Cyberpunk experience across Apple silicon Macs,"}, {"start": 1558.0, "text": "with platform features integrated in a way"}, {"start": 1561.0, "text": "that supports our quality bar."}, {"start": 1564.0, "text": "We've sold 35 million copies across all platforms"}, {"start": 1568.0, "text": "and an additional 10 million copies of Phantom Liberty."}, {"start": 1573.0, "text": "It has been reviewed very favorably by our players on the App Store,"}, {"start": 1578.0, "text": "which we are very thankful for."}, {"start": 1581.0, "text": "And Cyberpunk 2077: Ultimate Edition was recognized as Mac Game of the Year"}, {"start": 1587.0, "text": "in Apple's 2025 App Store Awards."}, {"start": 1591.0, "text": "We are really, really thankful for this recognition."}, {"start": 1595.0, "text": "It was a lot of work, but we truly believe it was worth it."}, {"start": 1599.0, "text": "At the end of the day, what matters is not how much work you put into something,"}, {"start": 1605.0, "text": "but what the result is for our players."}, {"start": 1608.0, "text": "Alright, that is it from us right now, choom."}, {"start": 1610.0, "text": "Thank you so much! It was a pleasure sharing this with you."}, {"start": 1614.0, "text": "Thanks Paweł."}, {"start": 1616.0, "text": "We hope you've enjoyed this special presentation."}, {"start": 1619.0, "text": "If you're feeling inspired,"}, {"start": 1620.0, "text": "try out Game Porting Toolkit's evaluation environment"}, {"start": 1623.0, "text": "to see how your next game runs on macOS."}, {"start": 1626.0, "text": "There's no code required, and setup is fast."}, {"start": 1629.0, "text": "Use Metal HUD to evaluate your game's performance"}, {"start": 1632.0, "text": "within Game Porting Toolkit."}, {"start": 1634.0, "text": "Then, make your game stand out with a great first launch experience."}, {"start": 1639.0, "text": "Provide optimized settings for your players,"}, {"start": 1641.0, "text": "and enable platform native features like EDR"}, {"start": 1644.0, "text": "and head-tracked spatial audio with AirPods."}, {"start": 1647.0, "text": "Check out \"Speedrun your game port with agentic coding\""}, {"start": 1650.0, "text": "to learn about new agentic skills in Game Porting Toolkit 4."}, {"start": 1655.0, "text": "Finally, you can discover powerful analysis tools"}, {"start": 1658.0, "text": "in \"Find and fix performance issues in your Metal games.\""}, {"start": 1661.0, "text": "Alright, thanks for watching."}, {"start": 1663.0, "text": "We look forward to playing your games on Apple platforms!"}]}