查看: 4857|回复: 1

[原创发布] 画面渲染加速

[复制链接]
梦石
0
星屑
13562
在线时间
2753 小时
注册时间
2014-10-4
回帖
705

R考场第七期纪念奖

发表于 2020-9-15 00:54:30 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 SixRC 于 2020-9-15 18:47 编辑

RM画面渲染过程中核心部分之一是blt (这里的blt和位图的blt本质一样 具体上不同)
把所有要呈现的位图依次blt到背景上
他好像会根据目标CPU的特性不同在运行时生成blt机器码 效率很高
不过那个时候普及的大概就MMX?
然后我就写了需要SSE2或AVX2的版本 会根据支持的情况替换原来的过程(现在基本都有SSE2所以只判断是否有AVX2)
效率测试我这里大概是 SSE2版是原版2倍 AVX2版2.2倍
就这样
实际意义大概不大 毕竟效率瓶颈很可能不在这 也不缺这点
写了就发 早知结果大概就不写了..
因为实际计算量并不大 多线程的效果不好(实际计算量小则更慢 计算量稍高则高CPU占用低收益) 所以没有加
(什么 你问我之前的多线程版不规则blt? 只能说年少不懂事 误把测试当事实 不过反正没人说 我懒得去改了)
仅支持103J
[fold=代码]
[pre lang="ruby"]=begin         
------------------------------渲染加速------------------------SixRC-20-09-15---
-------------------------------------------------------------------------------
------根据CPU是否支持SSE2和AVX2--替换原渲染过程-------------------------------
---若支持SSE2---大概为--2x-----------------------------------------------------
---若支持AVX2---大概为--2.2x---------------------------------------------------
------如果不用FPS限制解除---测试的结果会是错误的-------------------------------
------那个脚本能保证每帧刷新及取消刷新限制-------------------------------------
---这里渲染指画面刷新中把精灵展示的位图呈现的计算过程--------------------------
------不包括其余运算!---------------------------------------------------------
-------------------------------------------------------------------------------
=end
# 改变临时位图大小 效率提升不明显 但是卡顿时不会出现一片片的画面
# 原来是 640*8 每次刷新 现在是 640*480
cwp = Win32API.new("user32","CallWindowProc","pllll","l")
dll = Win32API.new("kernel32","GetModuleHandleA","p","l").call("rgss103j")
code = [0x8B,0x0D].pack("C*") + [dll + 0x12B6C4].pack("l") +
       [0x8B,0x89,0x34,0x01,0x00,0x00,0xC7,0x81,0x84,0x00,0x00,0x00,
        0x01,0x00,0x00,0x00,0x68,0xE0,0x01,0x00,0x00,0x6A,0x20,0xB8].pack("C*") +
       [dll + 0x888D0].pack("l") + [0xFF,0xD0,0xC2,0x10,0x00].pack("C*")
cwp.call(code,0,0,0,0)
wpm = Win32API.new('kernel32','WriteProcessMemory','llpll','l')
wpm.call(-1,dll+0x87F8B,"\xeb",1,0)
wpm.call(-1,dll+0x888E7,"\x00",1,0)
# 不要注释下面三句看起来没用的东西
s=Sprite.new
Graphics.update
s.dispose
# DllMain会处理 所有没有导入函数
Win32API.new("kernel32","LoadLibraryA","p","v").call "bltacc"[/pre]
[/fold]
bltacc.zip (39.97 KB, 下载次数: 134)
放到目录就行
梦石
0
星屑
8026
在线时间
1051 小时
注册时间
2012-4-3
回帖
1270

开拓者

发表于 2020-9-15 05:47:43 来自手机 | 显示全部楼层
本帖最后由 Im剑侠客 于 2020-12-12 18:22 编辑

占个位置,测试一下效果再回来说。
测试报告:
1.平常的开启菜单,没有什么明显的感觉,可能我的菜单本来就没有太多的描绘内容吧。
2.有细微察觉的是地图场景的刷新,以前偶尔会有波纹线那种好像是刷新延迟的东西,现在变成了波纹糊的感觉。

总体来说,稍稍好了点的感觉吧,也可能仅仅是心里安慰:加速插件耶~
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部