设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 6546|回复: 31
打印 上一主题 下一主题

[讨论] 设计一个简单的游戏引擎

[复制链接]

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

跳转到指定楼层
1
发表于 2021-12-8 00:25:59 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 guoxiaomi 于 2021-12-8 00:29 编辑

以下是我对游戏引擎的一些理解。

当我想到游戏引擎的各个组分时,很快脑子里就浮现出下面的画面:


一个引擎应该要有处理逻辑、画面、音乐等等部分,然后还要有数据池用来存放数据。为了提高并行度,可能还有任务池,让一些任务能在并行的执行。

提到并行,自然就会想到多线程了。比如,把逻辑、画面、音乐分别放到不同的线程里处理。这些线程会各自管理自己的独有数据,但是也可以被其他的线程所操作:

如果有的功能耗时很长需要异步处理,就需要一个任务队列。这样线程A可以给线程B“布置”任务,布置结束后就继续执行自己的。任务会加入到线程B的任务队列,会按照先来后到的顺序依次执行。

进一步抽象,一个线程需要的东西包括:1) 数据库 2) 任务队列 3) 任务的执行方式。再额外加上一个 4) 暂停标记,用来暂停、恢复线程的运行(有时候布置的任务需要等待其他的线程完成了才能继续):


这个时候,游戏引擎的主干框架就完成了。每个线程,无论是处理逻辑、画面、音乐还是网络,无非就是上面的1-3条有所不同,只需要设计好特定的数据类型、任务类型和执行方式,填入到这个框架里即可。比如:
线程功能数据库可执行的任务任务执行方式
逻辑游戏数据获取网络资源数据每1/60s:更新逻辑,处理队列任务,处理用户输入,呼叫渲染线程绘制画面
绘制图片资源加载资源、释放资源、绘制画面立刻执行队列里的任务
音乐音乐资源加载资源、释放资源、播放音乐立刻执行队列里的任务
网络网络数据访问网站、下载内容收到逻辑线程的下载任务通知,下载完毕后发送通知给逻辑线程


还有一点要注意的是,线程间的同步问题。当绘制线程在绘制画面时,可能要读取玩家在画面上的坐标,而这个数据其实是由逻辑线程保管的。所以可以这样处理:
1. 逻辑线程通知绘制线程可以开始干活
2. 逻辑线程暂停自己
3. 绘制线程访问逻辑线程的数据,绘制画面
4. 绘制线程恢复逻辑线程的运行

这就是前面提到的暂停标记的作用,它可以用来保证只有一个线程会访问数据。

这样的设计就足够简单了吧?接下给出这个主干框架的一个C++实现: asxp.zip (313.76 KB, 下载次数: 28)
内含main.exe是gcc编译的,需要C++20(感受模板元编程的威力吧)。这个C++实现的主干框架,最大的特色在于拥有所谓的零开销抽象,并且没有内存泄漏的问题(new操作符没出现)。

在设计好特定的数据类型、任务类型和执行方式后,只需要组合这些类型,告知每一个线程需要管理哪些数据、处理哪些任务以及具体的执行者,程序就完成了,只要40行代码:

main.h + main.cpp

评分

参与人数 2+2 收起 理由
b565185756 + 1 岂可修!我居然不是一楼!!!.
pporder + 1 塞糖

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

23
 楼主| 发表于 2023-4-4 20:23:22 | 只看该作者
本帖最后由 guoxiaomi 于 2023-4-4 20:24 编辑

经过一段时间的开发,RGModern的1.0.0候选版本发布了。提供了范例工程,文档还在完善中……

点击下载 完整测试工程,或https下载

工程内部的Game.exe可以代替原版Game.exe使用,Gamew.exe则内嵌了加密的Data文件夹,用来测试数据加密的效果。

项目已开源,github仓库地址:https://github.com/gxm11/RGModern
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2309
在线时间
123 小时
注册时间
2017-2-26
帖子
36
22
发表于 2023-2-28 23:39:36 | 只看该作者
控帧改为等待信号实现

写了个demo,验证windows下的WaitableTimer和STL sleep_for,结果令人很意外很失望。

源码:
  1. #include <Windows.h>
  2. #include <stdio.h>
  3. #include <thread>
  4. #include "SDL.h"

  5. int main(int argc, char* argv[])
  6. {
  7.     uint64_t frequency = SDL_GetPerformanceFrequency();
  8. #if 1
  9.     HANDLE waitable_timer = CreateWaitableTimerW(
  10.         nullptr,
  11.         TRUE,
  12.         nullptr);
  13.     while (waitable_timer)
  14.     {
  15.         uint64_t before = SDL_GetPerformanceCounter();

  16.         LARGE_INTEGER delay;
  17.         delay.QuadPart = -1E7 / 60;
  18.         SetWaitableTimer(
  19.             waitable_timer,
  20.             &delay,
  21.             0, nullptr, nullptr, FALSE
  22.         );
  23.         WaitForSingleObject(waitable_timer, INFINITE);

  24.         uint64_t after = SDL_GetPerformanceCounter();
  25.         printf("call: %lld, real: %llu, error: %lld\n", -delay.QuadPart, after - before, llround(0.L + after - before + delay.QuadPart));
  26.     }
  27. #else
  28.     while (true)
  29.     {
  30.         uint64_t before = SDL_GetPerformanceCounter();

  31.         long long delay = 1E7 / 60;
  32.         std::this_thread::sleep_for(std::chrono::nanoseconds(delay * 100));

  33.         uint64_t after = SDL_GetPerformanceCounter();
  34.         printf("call: %lld, real: %llu, error: %lld\n", delay, after - before, llround(0.L + after - before - delay));
  35.     }
  36. #endif
  37.     return 0;
  38. }
复制代码


运行结果:
WaitableTimer



STL sleep_for



结论:
WaitableTimer的精度实际上和STL sleep_for一样,都是15ms左右(具体数字取决于操作系统的调度时间片)的粒度。

P.S.:github不好发图,就借楼发了

评分

参与人数 1+1 收起 理由
guoxiaomi + 1 我很赞同

查看全部评分

RM水友群号   917854767  欢迎加入
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14591
在线时间
2194 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

21
发表于 2023-2-19 20:11:05 | 只看该作者
这个RGM能跨平台打包安卓吗?

点评

存在理论上的可能,现在还是先把windows做好  发表于 2023-3-1 00:00
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

20
 楼主| 发表于 2022-10-30 20:58:14 | 只看该作者
因为三次元的一些事情,发布推迟到12月。
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
336
在线时间
27 小时
注册时间
2022-9-10
帖子
41
19
发表于 2022-9-13 20:38:02 | 只看该作者
本帖最后由 heipai 于 2022-9-15 08:03 编辑

可以直接为您开一个新版块,然后版块内全是大家用您的引擎做的游戏
想想就牛了,膜拜一波
可惜我64位

点评

发布32位程序是因为要兼容一些旧的dll,它仍然可以在64位系统使用。最终发布和测试还是以64位程序为主。  发表于 2022-9-15 11:41
做出来有人用就谢天谢地了  发表于 2022-9-15 00:11

评分

参与人数 1+1 收起 理由
guoxiaomi + 1 欢迎试用

查看全部评分

哟西,前方一片广阔的领域!
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

18
 楼主| 发表于 2022-9-4 19:28:11 | 只看该作者
本帖最后由 guoxiaomi 于 2022-9-5 12:29 编辑

最近写这个引擎烧掉了我大量的脑细胞,不过终于写完了!

给大家一个demo供测试吧: RGModern-Project1.zip (5.77 MB, 下载次数: 21)

与前面的版本不同,这个demo是32位的程序(ruby也是32位的),工程是默认的空工程,附带了001-system01.wav文件。

差不多就是这样了,等到10月份我会把项目整理好,开源到github上。

已知bug:
1. 战斗测试无渐变效果
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
1
星屑
175
在线时间
17 小时
注册时间
2017-4-24
帖子
9
17
发表于 2022-8-22 01:45:27 | 只看该作者
太秀了,狠狠膜拜

评分

参与人数 1+1 收起 理由
guoxiaomi + 1 塞糖

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2309
在线时间
123 小时
注册时间
2017-2-26
帖子
36
16
发表于 2022-8-16 23:45:22 | 只看该作者
xp的好时代,来临力

评分

参与人数 1+1 收起 理由
guoxiaomi + 1 我很赞同

查看全部评分

RM水友群号   917854767  欢迎加入
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23994
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

15
 楼主| 发表于 2022-8-16 22:57:36 | 只看该作者
V0.7.2版本

度盘链接: https://pan.baidu.com/s/1lHGJKm8uIqbrX9nbYU9LLQ?pwd=3bk3
提取码: 3bk3

1. 重写了music和sound的实现,修复了音频的一些bug,目前切换me还是偶有爆破音,有待进一步调整。
2. 非release版本现在可以读取命令行里的debug,btest和-v。
3. 添加了宏RGMLOAD,用来将ruby的VALUE转换成特定类型的变量。

接下来会添加输入法的功能,然后加上F1菜单。

但是接下来的更新速度就不能保证了,因为从明天开始我就要上班赚钱了XD,我的计划是10月完成alpha版本供测试,年底修复完反馈的bug发布正式版。
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 10:59

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表