一个单机棋盘式半即时解谜RPG的开发与反思、1

快马平台:企业级反爬策略编排与行为指纹建模中枢 反爬技术已从基础请求头伪造迈入行为指纹建模新阶段。现代风控系统深度依赖鼠标轨迹、Canvas/WebGL渲染特征、TLS指纹等多维浏览器行为信号进行人机识别。快马平台并非抢码器生成工具,而是面向企业流量治理的策略编排中枢,通过状态驱动工作流、设备画像抽象、LSTM轨迹生成等能力,实现高仿真、可审计、可灰度的合规探针建设。其核心价值在于将分散的脚本逻辑升维为版本化策略包(YAML/JSON Schema),支撑价格监控、风控压测、服务健康度验证等关键业务场景,真正解决‘如何让自动化请求持续通过人类行为校验’这 阅读详情

前言

过年这几天写了几篇Angular2的学习笔记,算是有点“不务正业”,这次为大家带来我正在参与开发的一款游戏。这个小的系列大概有三、四篇组成,随着项目进展我会把这个坑填上。系列的内容是从程序的角度观察和反思这个游戏,包括它构建的基本思想和设计、编码过程中遇到的困难、重构来降低复杂度等。这个项目目前仅依赖于cocos2d,实际上他就是使用cocos2d来作为引擎的。需要说明的是,这个系列记述的是软件的开发过程和反思,不是一些结论性的东西来供读者参考,请不要把这些文章当做建议或者教程,如果你在阅读过程中有更好的简介和建议欢迎提出。

项目简介

这个游戏从程序的角度看(不包括设计、美术、音乐等),主要是两部分:cocos2d上面建立的框架、Lua实现的脚本。游戏2d的,主要玩法是玩家在一个棋盘式(格子)的地图上从一个点到另一个点,地图上有各种地形、道具、陷阱和墙壁,玩家何以拾取道具、破坏陷阱、合成道具从而完成游戏。玩家可以进行一些动作如走、跑、匍匐等,玩家有血量、体力等属性,以后可能还会加入战斗系统。游戏是半即时的,例如随时间的流逝体力会上升(站立时)以及滚石之类的陷阱等。最后游戏会加入对steam的支持,以上架为目标。

设计

Json:

为了方便地图编辑、数值修改,游戏数据采用Json记录。
分析需求得出游戏涉及到的对象包括:

包:游戏按包管理和加载资源,玩家可以开发自己的包来扩展游戏,包与包之间包含扩依赖关系,例如玩家包依赖于系统包,那么玩家设计的地图即可使用系统包的地形而不用重新开发。

地图:游戏包括很多地图,地图组织了一个地图块的矩阵,每个块可能包含地形(terrain)、道具(tool)、陷阱(trap)、墙(wall)、角色(role)。

地形、道具、陷阱:他们分配在格子上,在需要的时候调用Lua脚本。

墙:在格子之间放置,具有方向性(A到B阻塞、B到A阻塞或者双向阻塞)。

角色:可以在格子间移动,具备一些数值。

上面提到的这些可以提供统一的Lua脚本支持、Json中的属性可以直接在Lua中获取,这样玩家可以自由定义属性并添加脚本。Json提供对cocos2d的动画的直接支持,在Json中可以定义动画,这样在Lua中可以直接更改显示的动画。
游戏包含两个Json文件:

packages.json :

{
    "default":
    {
        "Name":"default",
        "Dir":"default/",
        "DescriptionFile":"description.json"
    },
    "UnitTest":
    {
        "Name":"UnitTest",
        "Dir":"UnitTest/",
        "DescriptionFile":"description.json"
    }
}

package.json :

{
    "Roles":
    {
        "default-Roles-player1":
        {
            "Name":"default-roles-player1"
            ,
            "ScriptFile":"roles/player1/script/script.lua"
            ,
            "FunctionName":"default-roles-player1-update"
            ,
            "FunctionMask":1
            ,
            "Animations":
            [
                {
                    "Name":"default-roles-player1-animations-default"
                    ,
                    "PLIST_File":"roles/player1/animations/default/default.plist"
                    ,
                    "Frames":
                    [
                        "default-roles-player1-animations-default-frame1.png"
                        ,
                        ...
                        ,
                        ...
                    ]
                    ,
                    "SpanTime":"0.33"
                    ,
                    "IsLoop":"true"
                }
                ,
                ...
                ,
                ...     
            ],
            "CurrentAnimation":"default-roles-player1-animations-default"
        }
    },
    "Tools":
    {
        "default-tools-knife":
        {
            "Name":"default-tools-knife"
            ,
            "ScriptFile":"tools/knife/script/script.lua"
            ,
            "FunctionName":"default-tools-knife-update"
            ,
            "Animations":
            [
                {
                    "Name":"default-tools-knife-animations-default"
                    ,
                    "PLIST_File":"tools/knife/animations/default/default.plist"
                    ,
                    "Frames":
                    [
                        "default-tools-knife-animations-default-frame1.png"
                        ,
                        ...
                        ,
                        ...
                    ]
                    ,
                    "SpanTime":"0.33"
                    ,
                    "IsLoop":"true"
                }
                ,
                ...
                ,
                ...     
            ],
            "CurrentAnimation":"default-tools-knife-animations-default"
        }
    }
    ,
    "Traps":
    {
        "default-traps-cirrus":
        {
            "Name":"default-traps-cirrus"
            ,
            "ScriptFile":"traps/cirrus/script/script.lua"
            ,
            "FunctionName":"default-traps-cirrus-update"
            ,
            "Animations":
            [
                {
                    "Name":"default-traps-cirrus-animations-default"
                    ,
                    "PLIST_File":"traps/cirrus/animations/default/default.plist"
                    ,
                    "Frames":
                    [
                        "default-traps-cirrus-animations-default-frame1.png"
                        ,
                        ...
                        ,
                        ...
                    ]
                    ,
                    "SpanTime":"0.33"                       ,
                    "IsLoop":"true"
                }
                ,
                ...
                ,
                ...     
            ],
            "CurrentAnimation":"default-traps-cirrus-animations-default"
        }
    }
    ,
    "Terrains":
    {
        "default-terrains-dirt":
        {
            "Name":"default-terrains-dirt"
            ,
            "ScriptFile":"terrains/dirt/script/script.lua"
            ,
            "FunctionName":"default-terrains-dirt-update"
            ,
            "Animations":
            [
                {
                    "Name":"default-terrains-dirt-animations-default"
                    ,
                    "PLIST_File":"terrains/dirt/animations/default/default.plist"
                    ,
                    "Frames":
                    [
                        "default-terrains-dirt-animations-default-frame1.png"
                        ,
                        ...
                        ,
                        ...
                    ]
                    ,
                    "SpanTime":"0.33"
                    ,
                    "IsLoop":"true"
                }
                ,
                ...
                ,
                ... 
            ],
            "CurrentAnimation":"default-terrains-dirt-animations-default"
        }
    }
    ,
    "Walls":
    {
        "default-walls-wall":
        {
            "Name":"default-walls-wall",
            ,
            "ScriptFile":"walls/wall/script/script.lua"
            ,
            "FunctionName":"default-walls-wall-update"
            ,
            "Animations":
            [
                {
                    "Name":"default-walls-wall-animations-default"
                    ,
                    "PLIST_File":"walls/wall/animations/default/default.plist"
                    ,
                    "Frames":
                    [
                        "default-walls-wall-animations-default-frame1.png"
                        ,
                        ...
                        ,
                        ...
                    ]
                    ,
                    "SpanTime":"0.33"
                    ,
                    "IsLoop":"true"
                }
                ,
                ...
                ,
                ... 
            ],
            "CurrentAnimation":"default-walls-wall-animations-default"
        }
    }
    "Maps":
    {
        "default-maps-map1":
        {
            "Name":"default-maps-map1"
            ,
            "Description":"this is the description of default-maps-map1"
            ,
            "Width":10
            ,
            "Height":10
            ,
            "TileWidth":56
            ,
            "TileHeight":56
            ,
            "ScriptFile":"maps/map1/script/script.lua"
            ,
            "FunctionName":"default-maps-map1-update"
            ,
            "Data":
            {
                "Tiles":
                [
                    [{"Terrain":{"Back":{"RefName":"default-terrains-dirt"},"Front":{"RefName":"default-terrains-ditr"}},"Trap":{"RefName":"default-item-traps-cirrus"},"Tool":{"RefName":"default-item-tools-knife"}},{},{},{},{},{},{},{},{},{}]
                    ,
                    [...]
                    ,
                    [...]
                    ,
                    [...]
                    ,
                    [...]
                    ,
                    [...]
                    ,
                    [...]
                    ,
                    [...]
                    ,
                    [...]
                    ,
                    [...]
                ],
                "Walls":
                [
                    {
                        "Wall":"default-walls-wall",
                        "Tile_X":2,
                        "Tile_Y":2,
                        "Direction":"RIGHT",
                        "Via":"FORWARD",
                        "IsRotate":false
                    }
                    ,
                    ...
                    ,
                    ...
                ],
                "Roles":
                [
                    {
                                    "RefName":"UnitTest-roles-player1",
                                    "Tile_X":2,
                                    "Tile_Y":2,
                                    "RoleType":"PLAYER",
                                    "ScriptFile":"roles/player1/script/script.lua",
                                    "FunctionName":"instanceUpdate",
                                    "FunctionMask":1
                                }
                    ,
                    ...
                    ,
                    ...
                ]
            }
        }
    }
}

对于packages.json很简单,包含了每个包的名称、目录及介绍,暂时没有涉及到包依赖,不过基本可以预见,以后包依赖的功能可以通过数组的方式简单的引入。

对于package.json,每一个包对应一个这样的json,包含了这个包的详细定义。
其中涉及到数据和实例的概念,与编程语言中的概念不同,后边我会介绍。首先是这个包的数据,包含Roles、Tools、Traps、Terrains、Walls和Maps。这些数据(集)是游戏的基础,其中Maps中定义了这个游戏中的实例,分别针对每个格子说明了它包含的内容以及所有墙壁和角色。
Roles、Tools、Terrains、Walls他们的内容相似,我以一个Role的定义为例:

{
    "Name":"default-roles-player1"
    ,
    "ScriptFile":"roles/player1/script/script.lua"
    ,
    "FunctionName":"default-roles-player1-update"
    ,
    "FunctionMask":1
    ,
    "Animations":
    [
        {
            "Name":"default-roles-player1-animations-default"
            ,
            "PLIST_File":"roles/player1/animations/default/default.plist"
            ,
            "Frames":
            [
                "default-roles-player1-animations-default-frame1.png"
                ,
                ...
                ,
                ...
            ]
            ,
            "SpanTime":"0.33"
            ,
            "IsLoop":"true"
        }
        ,
        ...
        ,
        ...     
    ],
    "CurrentAnimation":"default-roles-player1-animations-default"
}

Name定义了一个全局唯一的名字,ScriptFile定义了这个数据对应的脚本、FunctionName定义了脚本的回调函数名、FunctionMask定义了这个数据需要注册的Lua回调(会在Lua部分详述),Animations定义了这个数据的一系列动画,CurrentAnimation定义了当前使用的默认动画。
这里面关于Lua的部分(ScriptFile、FunctionName、FunctionMask)、Animation的部分(Animations)是通用的,凡是支持Lua和Animation的定义都应该使用这样的格式。
在Maps中定义了所有的地图,首先采用矩阵的方式来表示所有的块及其中所有的实例、通过列表表示的墙和角色,他们基本都可以通过Key的值很容易的理解其功能,我就不详细解释了。

关于数据和实例:

每一个地图上显示的物件都有一个数据存在,这个数据实例化许多实例。以小刀为例,有一个小刀的实例定义在Tools中,这定义了小刀的基本内容,在Map的矩阵中定义了小刀的实例,实例可能包括这个小刀的附魔、临时的属性等。这样可以设计许多具有不同特点的小刀,例如不同的贴图动画,在数据中声明所有的贴图,然后在实例中为不同的小刀做不同的标记,在Lua中通过标记来判断播放不同的动画。这些小刀又都具有数据中的相同特点,例如可以切断藤蔓。
这里所说的实例和实例化与编程语言(这里是C++)中的概念不同,请注意区分。可以这样说,小刀的数据实例化了一个数据类,小刀的实例实例化了一个实例类,这里的实例和实例化是语言层面的,进而小刀的实例实例化了小刀的数据,这里是游戏逻辑层面的。以后我用到的大部分“实例”和“实例化”是指游戏逻辑层面的。

Lua:

数据和实例可以绑定Lua脚本,在Json部分已经有定义,框架在加载Json时会执行指定的Lua脚本文件,将FunctionName指定的函数加载到Lua虚拟机中。框架采用事件调用的方式,在需要的时候调用这个函数,传入一个字符串标明是哪个事件。例如小刀数据的Lua文件为knife.lua,FunctionName为Update,框架在载入时会执行knife.lua,加载Update函数,以后所有关于小刀数据的回调都会使用这个Update函数。当在初始化时会调用这个Update并传入INIT标明这是在初始化时调用的。FunctionMask是一个二进制位标记的掩码,例如01b代表初始化,10b代表更新,11b代表同时注册初始化和更新。通过这个掩码框架会关闭不需要用到的回调,提高效率。
在Lua中可以通过一些全局函数来获取当前对象的属性,例如在lua代码中:

name = lua_get_string("name")

可以获取当前对象的属性,set怎可以设置属性,Json中的字段可以直接调用的Lua中。
框架会记录当前Lua调用所指向的对象,这个对象是静态的,因此无法提供对多线程的支持,这可能会在以后需要的时候优化。

框架设计:

框架包含三部分,这里不讨论cocos2d,仅仅是我实现的内容。
基础库、单元测试库、游戏主体

|      游戏主体
|——————————————————————
|  基础库 | 单元测试库
|——————————————————————
|     cocos2d-x

我曾经找过一个google的单元测试库,但似乎和cocos存在兼容问题,后来打算自己写一个,这个库不是主要任务,因为通过断言已经可以满足大部分需求。
基础库包括对游戏支持的通用组件,目前主要实现了单例类、Lua调用类、KV类、矩阵类、对象管理器等,我会把这个库开源出来和大家分享。
游戏主体是游戏的实现。

下一篇文章中我会着重对这些库进行介绍。

无人机地面站链路全解析:数传、AP、4G/5G 与 RTK 差分接入原理及排查实践 本文系统梳理了无人机地面站与飞控的通讯链路架构,涵盖数传电台、WiFi AP及蜂窝(4G/5G)三种接入方式的工作原理与排查流程。重点强调物理层(波特率、供电、天线)、MAVLink层(心跳、SYSID、协议版本)和应用层(端口、心跳保活、网络配置)的逐层排查逻辑。对比分析了AP与蜂窝链路在延迟、覆盖、多机支持等方面的优劣,提出“专用链路控实时、AP传数据、蜂窝远监控”的组合使用策略,并指出共性风险如省电模式、NAT超时等需统一防范。 阅读详情

相关推荐

【Claude Code · VibeCoding】13|实战演示:水果消消乐 VibeCoding

用「水果消消乐」走一遍 VibeCoding:提示、生成、试玩、改需求、再生成。

Maynor的博客 64

一个单机棋盘式半即时解谜RPG的开发与反思、2

接上篇在本系列第一篇文章中,我介绍了这个项目的Json、Lua相关设计,这篇文章中将会对基础库RJCBLib进行详细介绍。我将相关的头文件给出以供参考。RJCBLib库包含功能(2016-3-6):GenericValue : 通用类型。Singleton<> : 提供单例支持。ObjectManager<> : 提供对象管理功能,继承自Sigleton<>。JsonBuffer : 提供对Json

ruojianll的博客 559

单相PWM整流器的数学模型、工作原理

单相PWM整流器的数学模型、工作原理

weixin_58670090的博客 1万+

一个单机棋盘式半即时解谜RPG的开发与反思、3

综述游戏核心部分目前完成了Json数据载入、Lua调用、大地图的显示、玩家移动、墙壁阻断这些内容。结构为GBase(基础设施:数据类、实例类、宏定义)、Logic(主要逻辑实现)、UI(用户接口)。GBase-helper: GGameLoader , GManager , GObject GBase-data: GItem , GMap , GPackage GBase-instance: GIn

ruojianll的博客 1057

快速修改Petalinux编译生成的rootfs.cpio.gz文件:无需重新编译的实用技巧

本文详细介绍了如何在不重新编译的情况下快速修改Petalinux生成的rootfs.cpio.gz文件,适用于Zynq平台开发。通过解包image.ub、修改rootfs内容并重新打包的完整流程,可显著提升调试效率,特别适合频繁修改配置文件的场景。文章还提供了自动化脚本和进阶应用技巧,帮助开发者优化工作流程。

weixin_28285943的博客 240

杂记 | 使用keycloak实现SSO单点登录(新手向,概念、原理、逻辑、详细步骤、难点解释)

使用keycloak实现SSO单点登录(概念、原理、逻辑、详细步骤、难点解释)

野生猿林仔的博客 2万+

【Unity知识速递】第7期 Unity 6.6 深度解析:WebGPU 正式版与 WebAssembly64,Web 游戏的内存革命

如何启用 Wasm64?需要注意的是,Wasm64 需要浏览器支持 Memory64 提案,目前主流浏览器的最新版本都已支持。一句话总结: Unity 6.6 用 WebGPU 转正、Wasm64 16GB 内存和渐进式加载三连击,将 Web 游戏的体验天花板又往上推了一大截——Web 平台不再是"妥协版",正在成为真正的一等公民。Unity 6.6 新增了 WebAssembly64(Wasm64) 构建选项,这可能是本次更新中对 Web 游戏开发者影响最大的一项升级。

crystal_WJT的博客 425

EPLAN二次开发入门:Visual Studio 2019环境配置与插件调试实战

本文详细介绍了EPLAN二次开发入门的关键步骤,重点讲解如何在Visual Studio 2019中配置开发环境并进行插件调试。通过创建符合命名规范的项目、引用核心API库、实现插件接口以及使用附加进程调试等实战技巧,帮助电气工程师快速掌握EPLAN插件开发,提升自动化设计效率。

h6i7j8的博客 763

设计模式(unity游戏研发版)

当你使用图形用户界面类时通常会遇到一个问题。比如,你创建了自定义按钮类并允许客户端在按钮中注入自定义代码,这样当用户按下按钮时就会触发这些代码。观察者模式允许任何实现了订阅者接口的对象订阅发布者对象的事件通知。你可在按钮中添加订阅机制,允许客户端通过自定义订阅类注入自定义代码。在Unity中,这就像UnityEvent在Inspector中绑定多个回调。

m0_63330263的博客 100

Hive数据迁移

【迁移背景】 本次需要将老集群的hive数据(共30多张表)迁移至新集群中。 老集群版本为CDH5.13,未启用kerberos; 新集群版本为CDH5.14,启用了kerberos。 由于cloudera官方文档说明,在5.x的版本不支持从未启用kerberos的集群与启用了kerberos的集群之间的数据复制。因此无法通过bdr方式进行数据同步。于是采用手工方式进行测试验证。 第一步...

wangkuangood3200的专栏 469

Halcon实战:基于图像清晰度自动筛选最佳对焦图片

本文详细介绍了如何使用Halcon实现基于图像清晰度的自动筛选最佳对焦图片技术。通过分析灰度值统计和标准差等核心指标,结合实战代码示例,帮助开发者高效处理工业检测中的对焦问题,提升自动化检测的准确性和效率。

weixin_27015733的博客 440

我给 DeepSeek 大肥鱼做了一款马里奥式闯关游戏

当全网都在把大肥鱼做成直播虚拟主播的时候,我决定给她做一款横版闯关游戏。

2301_79028807的博客 900

Vue3 视频播放器完整指南 – @videojs-player/vue 从入门到精通

全面解析 Vue3 生态中最强大的视频播放解决方案 @videojs-player/vue。从基础安装到高级功能,涵盖自动播放、直播流、字幕支持等核心特性。提供完整的代码示例和最佳实践,助你快速构建专业的视频播放应用。

前端开发-前端技术分享 1422

Claude Fable 5.2 登顶:65 分、单发做游戏,和一份 $26.54 一单的账单

Anthropic 发布 Claude Fable 5.2:AA 智能指数 65 分登顶历史第一,但性能 #71、成本 #73、冗余度 #72——最强能力、最贵成本、最慢速度的矛盾体。同底层 Mythos 5.2 无护栏反而更强。文章拆解:65 分构成、官方实战验收、基准提升真伪、一条提示词一晚做出街机游戏的完整流水线(自写机器人跑完 12 关自检)、$26.54 账单与 98% 缓存折扣下的真实成本重估。

johnsong2009的博客 232

ThingsBoard教程(一):ThingBoard介绍及安装

ThingsBoard介绍 最近看了很多开源的物联网的项目,其中有一个让我印象很深,那就是Thingsboard 下面我就给大家介绍一下这个项目,并指导大家如何在本地安装一个Thingsboard来体验它。 首先引用官网的项目介绍就是 一个开源的用于数据收集,处理,可视化和设备管理的开源物联网平台。 它通过行业标准的物联网协议(MQTT,CoAP和HTTP)实现设备连接,并支持云和本地部署。ThingsBoard结合了可伸缩性,容错性和性能,因此您永远不会丢失数据。 用它开源收集链接设备,收集设备的数据,

知无涯 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Unity 数据存储指南:本地存储、个性化设置、缓存与 Resources/StreamingAssets 的区别

在 Unity 开发中,“数据存到哪里”、“缓存能不能清”、“打包后资源有什么区别” 是新手最容易混淆、老手也经常踩坑的问题。Unity 本地存储机制(包括 Unity 放在 C 盘的内容);Unity 个性化设置(编辑器首选项 Editor Preferences);Unity 缓存的打开、关闭与清理;打包后 Resources 与 StreamingAssets 的区别;其他可自定义存储的内容汇总。为方便理解,本文配有一个可直接运行的演示工程,所有代码见文末"配套工程说明"。

zhchyun 209

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Claude Code做Unity项目移植(三): 使用SKILL进行自动化Git提交

本文介绍基于ClaudeCodeSkill的Unity自动化Git提交助手——unity-git-commit,通过四大模块实现提交前的智能检查与安全修复:1)校验Git仓库状态;2)验证Unity项目文件(如排除Library/Temp,确保.meta文件完整);3)依据可配置的C#命名规范自动识别并安全修复命名问题(避免序列化、反射等高危场景误改);4)生成精准提交注释,但强制人工确认。全程仅本地commit,不自动推送或破坏性操作,保障安全。核心思想为“机械化工作交AI,关键决策留人工”,显著提升提交

Aman1984的博客 644

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

HarmonyOS 游戏与图形渲染入门:Canvas、渲染管线与掉帧排查

本文详解鸿蒙图形渲染选型与优化,指出多数“游戏感”需求仅需Canvas+requestAnimationFrame即可实现。通过deltaTime保证跨设备流畅性,优先使用animateTo声明式动画,避免逐帧绘制开销。强调性能优化应从主线程长任务、过度绘制、对象分配入手,结合Profiler排查掉帧。XComponent适用于高负载场景,但需权衡开发成本。最后提醒引擎迁移三要点:性能模型差异、打包流程匹配、版本兼容。核心结论:先用简单方案验证,再决定是否上引擎。

信息安全领域优质创作者|操作系统领域专家 412

Windows远程桌面实现之二十:实现 moonlight 游戏串流协议之(一)

本文介绍在xdisp_virt中集成Moonlight游戏串流协议的实现过程。基于开源项目Sunshine逆向的GameStream协议,作者从零研究并自研实现Moonlight服务端网络通信部分,涵盖mDNS设备发现、nvhttp/nvhttps加密通信、nvrtsp协议交互及三类UDP数据通道(视频、音频、控制)。重点解决多客户端并发问题,采用串行处理机制确保连接一致性。通过自定义证书验证与密钥管理,完成配对与安全通信,最终实现低延迟、高性能的游戏串流体验,显著优于WebRTC浏览器方案。

fanxiushu的专栏 168

二进制木马免杀-游戏嵌套与图标替换

二进制木马免杀-游戏嵌套与图标替换

2503_94637398的博客 236

Unity UGUI布局组件(LayoutGroup、ContentSizeFitter、LayoutElement)详解

UGUI 自动布局是一套的 C# 排版系统,和 Transform 原生锚点完全隔离;整套布局;最终输出只有对 RectTransform 的sizeDelta的赋值。

m0_63330263的博客 263

mark 黑塞《玻璃球游戏》

【最近在读黑塞的《玻璃球游戏》-“ai预言“ - 优快云 App】

2502_94306440的博客 192

Cocos Creator3.8.8 + Xcode27.2 编译运行失败

Cocos Creator3.8构建IOS工程后,使用最新的Xcode27.2版本进行真机调试,遇到C++标准库冲突,如is_floating_point、is_arithmetic和is_signed失败,以及webp对齐失败等问题。

HYNN12的博客 400

给 AI 一台贴图工厂:TexGen 程序化贴图引擎与 MCP 架构实践

但它很快就撞墙——一张贴图往往是多层叠加的:底色 + 噪波 + 砖缝 + 暗角 + 高光。所以 TexGen 的核心抽象是图层栈 + JSON 指令表codeTgSpec├── 几何: shape(8 种) + center / size / radius / rotation / cornerRadius├── 绘制: fill(7 种) + color / edgeColor / 渐变 + pattern + warp└── 合成: blend(11 种) + opacity / blur。

邹杭特的博客 373

(开源)游戏攻略分享系统实战指南 基于 Java + SpringBoot + uni-app + Vue + MySQL

这是一个基于 Java + SpringBoot + uni-app + Vue + MySQL 构建的完整游戏攻略分享系统,功能持续优化中...游戏攻略管理 游戏分类管理 旅游资讯管理 用户管理 管理员管理

小小码农身兼魔法师职位!除你武器~ 333

itch.io 用开源模拟器 Ruffle 恢复 Flash 游戏支持

itch.io 创始人宣布平台已用开源 Flash 模拟器 Ruffle 重新实现 Flash 游戏支持,现有 2,581 款 Flash 游戏,开发者无需改动现有项目。

老孙正经胡说 109
上一篇: ES6、TYPESCRIPT、ATSCRIPT和BABEL是什么玩意儿?
下一篇: 一个单机棋盘式半即时解谜RPG的开发与反思、2
若简LL
博客等级 码龄11年 8粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值